Documentación de la API .NET del Video Fingerprinting SDK¶
Descripción General¶
El espacio de nombres VisioForge Video Fingerprinting proporciona una funcionalidad potente para la identificación de contenido de video, comparación y operaciones de búsqueda. Permite a las aplicaciones:
- Generar huellas digitales únicas a partir de archivos de video para la identificación de contenido
- Comparar videos para determinar similitud y detectar duplicados
- Buscar fragmentos de video dentro de videos más grandes (por ejemplo, encontrar comerciales, introducciones o escenas específicas)
- Comparar imágenes individuales para la detección de similitud (solo Windows)
- Procesar cuadros de video directamente para generar huellas digitales a partir de transmisiones o contenido generado
Tabla de Contenidos¶
- Clase VFPAnalyzer
- Clase VFPFingerPrint
- Clase VFPFingerprintSource
- Clase VFPCompare
- Clase VFPSearch
- Clase VFPFingerPrintDB
- Clase VFPFingerprintFromFrames
- Tipos de Soporte
- Delegados
Clase VFPAnalyzer¶
El punto de entrada principal para las operaciones de huellas digitales de video, proporcionando métodos estáticos de alto nivel para análisis, comparación y búsqueda.
Propiedades¶
DebugDir¶
public static string DebugDir { get; set; }
Descripción: Ruta del directorio para la salida de depuración. Cuando se establece, los resultados intermedios del procesamiento pueden guardarse para la resolución de problemas.
Predeterminado: null (salida de depuración deshabilitada)
Ejemplo:
// Habilitar salida de depuración
VFPAnalyzer.DebugDir = @"C:\Temp\VFP_Debug";
// Deshabilitar salida de depuración
VFPAnalyzer.DebugDir = null;
Métodos¶
SetLicenseKey¶
public static void SetLicenseKey(string vfpLicense)
Descripción: Establece la clave de licencia para el Video Fingerprinting SDK. Debe llamarse antes de usar cualquier función de huellas digitales.
Parámetros:
vfpLicense(string): Su clave de licencia de VisioForge
Ejemplo:
// Establecer clave de licencia al inicio de la aplicación
VFPAnalyzer.SetLicenseKey("YOUR-LICENSE-KEY-HERE");
GetComparingFingerprintForVideoFileAsync¶
public static async Task<VFPFingerPrint> GetComparingFingerprintForVideoFileAsync(
VFPFingerprintSource source,
VFPErrorCallback errorDelegate = null,
VFPProgressCallback progressDelegate = null)
Descripción: Genera una huella digital optimizada para operaciones de comparación de video completo.
Parámetros:
source(VFPFingerprintSource): Configuración de la fuente de video que incluye ruta de archivo, rango de tiempo y opciones de procesamientoerrorDelegate(VFPErrorCallback): Callback opcional para mensajes de errorprogressDelegate(VFPProgressCallback): Callback opcional para actualizaciones de progreso (0-100)
Devuelve: Task<VFPFingerPrint> - Huella digital generada o null si ocurrió un error
Caso de Uso: Comparar videos completos o segmentos grandes para determinar la similitud general
Ejemplo:
// Uso básico
var source = new VFPFingerprintSource(@"C:\Videos\movie.mp4");
var fingerprint = await VFPAnalyzer.GetComparingFingerprintForVideoFileAsync(source);
if (fingerprint != null)
{
fingerprint.Save(@"C:\Fingerprints\movie.vsigx");
Console.WriteLine($"Fingerprint created for {fingerprint.Duration} duration");
}
// Con manejo de errores y reporte de progreso
var source2 = new VFPFingerprintSource(@"C:\Videos\video.mp4")
{
StartTime = TimeSpan.FromMinutes(5),
StopTime = TimeSpan.FromMinutes(10)
};
var fingerprint2 = await VFPAnalyzer.GetComparingFingerprintForVideoFileAsync(
source2,
error => Console.WriteLine($"Error: {error}"),
progress => Console.WriteLine($"Progress: {progress}%"));
// Con áreas ignoradas (por ejemplo, logotipos, marcas de agua)
var source3 = new VFPFingerprintSource(@"C:\Videos\broadcast.mp4");
source3.IgnoredAreas.Add(new Rect(1700, 50, 1870, 150)); // Logotipo superior derecho
source3.IgnoredAreas.Add(new Rect(100, 950, 300, 1000)); // Marca de tiempo inferior
var fingerprint3 = await VFPAnalyzer.GetComparingFingerprintForVideoFileAsync(source3);
GetSearchFingerprintForVideoFileAsync¶
public static async Task<VFPFingerPrint> GetSearchFingerprintForVideoFileAsync(
VFPFingerprintSource source,
VFPErrorCallback errorDelegate = null,
VFPProgressCallback progressDelegate = null)
Descripción: Genera una huella digital optimizada para operaciones de búsqueda de fragmentos.
Parámetros:
source(VFPFingerprintSource): Configuración de la fuente de videoerrorDelegate(VFPErrorCallback): Callback de error opcionalprogressDelegate(VFPProgressCallback): Callback de progreso opcional
Devuelve: Task<VFPFingerPrint> - Huella digital generada o null si ocurrió un error
Caso de Uso: Crear huellas digitales de clips cortos para localizar dentro de videos de larga duración
Ejemplo:
// Crear huella digital para un comercial
var commercialSource = new VFPFingerprintSource(@"C:\Videos\commercial.mp4");
var commercialFp = await VFPAnalyzer.GetSearchFingerprintForVideoFileAsync(
commercialSource,
error => Console.WriteLine($"Error: {error}"),
progress => Console.WriteLine($"Processing: {progress}%"));
// Crear huella digital para una escena específica
var sceneSource = new VFPFingerprintSource(@"C:\Videos\movie.mp4")
{
StartTime = TimeSpan.FromMinutes(42),
StopTime = TimeSpan.FromMinutes(43)
};
var sceneFp = await VFPAnalyzer.GetSearchFingerprintForVideoFileAsync(sceneSource);
if (sceneFp != null)
{
sceneFp.Tag = "Action scene at bridge";
sceneFp.Save(@"C:\Fingerprints\scene.vsigx");
}
Compare¶
public static int Compare(
VFPFingerPrint fp1,
VFPFingerPrint fp2,
TimeSpan shift)
Descripción: Compara dos huellas digitales de video para determinar la similitud.
Parámetros:
fp1(VFPFingerPrint): Primera huella digitalfp2(VFPFingerPrint): Segunda huella digitalshift(TimeSpan): Desplazamiento de tiempo máximo permitido durante la comparación
Devuelve: int - Puntuación de diferencia (menor = más similar), o Int32.MaxValue si alguna huella digital es nula
Ejemplo:
// Cargar dos huellas digitales
var fp1 = VFPFingerPrint.Load(@"C:\Fingerprints\video1.vsigx");
var fp2 = VFPFingerPrint.Load(@"C:\Fingerprints\video2.vsigx");
// Comparar con tolerancia de desplazamiento de 5 segundos
int difference = VFPAnalyzer.Compare(fp1, fp2, TimeSpan.FromSeconds(5));
// Interpretar resultados
if (difference < 5)
{
Console.WriteLine("Videos are nearly identical");
}
else if (difference < 15)
{
Console.WriteLine("Videos are very similar");
}
else if (difference < 30)
{
Console.WriteLine("Videos have similar content with differences");
}
else if (difference < 100)
{
Console.WriteLine("Videos are related but significantly different");
}
else
{
Console.WriteLine("Videos are completely different");
}
// Comparación por lotes
var fingerprints = new List<VFPFingerPrint>();
foreach (var file in Directory.GetFiles(@"C:\Fingerprints", "*.vsigx"))
{
fingerprints.Add(VFPFingerPrint.Load(file));
}
var referenceFp = fingerprints[0];
foreach (var fp in fingerprints.Skip(1))
{
int diff = VFPAnalyzer.Compare(referenceFp, fp, TimeSpan.FromSeconds(3));
Console.WriteLine($"{fp.OriginalFilename}: Difference = {diff}");
}
Search / SearchAsync¶
public static List<TimeSpan> Search(
VFPFingerPrint fp1,
VFPFingerPrint fp2,
TimeSpan duration,
int maxDifference,
bool allowMultipleFragments)
public static Task<List<TimeSpan>> SearchAsync(
VFPFingerPrint fp1,
VFPFingerPrint fp2,
TimeSpan duration,
int maxDifference,
bool allowMultipleFragments)
Descripción: Busca ocurrencias de un fragmento de video dentro de un video más grande.
Parámetros:
fp1(VFPFingerPrint): Huella digital del fragmento (aguja)fp2(VFPFingerPrint): Video en el que buscar (pajar)duration(TimeSpan): Duración del fragmento (evita coincidencias superpuestas)maxDifference(int): Diferencia máxima permitida (típico: 5-20)allowMultipleFragments(bool): Encontrar todas las ocurrencias vs. solo la primera coincidencia
Devuelve: List<TimeSpan> - Marcas de tiempo donde se encontraron coincidencias
Ejemplo:
// Buscar un comercial en una grabación
var commercialFp = VFPFingerPrint.Load(@"C:\Fingerprints\commercial.vsigx");
var recordingFp = VFPFingerPrint.Load(@"C:\Fingerprints\tv_recording.vsigx");
// Encontrar todas las ocurrencias
var matches = await VFPAnalyzer.SearchAsync(
commercialFp,
recordingFp,
TimeSpan.FromSeconds(30), // Duración del comercial
maxDifference: 10,
allowMultipleFragments: true);
foreach (var timestamp in matches)
{
Console.WriteLine($"Commercial found at: {timestamp:hh\\:mm\\:ss}");
}
// Encontrar solo la primera ocurrencia
var firstMatch = VFPAnalyzer.Search(
commercialFp,
recordingFp,
TimeSpan.FromSeconds(30),
maxDifference: 15,
allowMultipleFragments: false);
if (firstMatch.Any())
{
Console.WriteLine($"First occurrence at: {firstMatch[0]}");
}
// Buscar con coincidencia más estricta
var exactMatches = VFPAnalyzer.Search(
commercialFp,
recordingFp,
TimeSpan.FromSeconds(30),
maxDifference: 5, // Muy estricto
allowMultipleFragments: true);
CompareVideoFilesAsync¶
public static async Task<bool> CompareVideoFilesAsync(
VFPFingerprintSource file1,
VFPFingerprintSource file2,
TimeSpan shift,
VFPErrorCallback errorCallback,
int threshold = 500)
Descripción: Método de conveniencia que genera huellas digitales y compara dos archivos de video en una sola operación.
Parámetros:
file1(VFPFingerprintSource): Configuración del primer videofile2(VFPFingerprintSource): Configuración del segundo videoshift(TimeSpan): Desplazamiento de tiempo máximo permitidoerrorCallback(VFPErrorCallback): Callback de errorthreshold(int): Diferencia máxima para considerar como coincidencia (predeterminado: 500)
Devuelve: Task<bool> - true si los videos coinciden (diferencia < umbral), de lo contrario false
Ejemplo:
// Comparar dos archivos de video directamente
var file1 = new VFPFingerprintSource(@"C:\Videos\original.mp4");
var file2 = new VFPFingerprintSource(@"C:\Videos\copy.mp4");
bool areIdentical = await VFPAnalyzer.CompareVideoFilesAsync(
file1,
file2,
TimeSpan.FromSeconds(5),
error => Console.WriteLine($"Error: {error}"),
threshold: 20);
if (areIdentical)
{
Console.WriteLine("Videos are identical or very similar");
}
// Comparar con procesamiento personalizado
var source1 = new VFPFingerprintSource(@"C:\Videos\video1.mp4")
{
CustomResolution = new Size(640, 480),
StartTime = TimeSpan.FromSeconds(10),
StopTime = TimeSpan.FromMinutes(5)
};
var source2 = new VFPFingerprintSource(@"C:\Videos\video2.mp4")
{
CustomResolution = new Size(640, 480),
StartTime = TimeSpan.FromSeconds(10),
StopTime = TimeSpan.FromMinutes(5)
};
bool match = await VFPAnalyzer.CompareVideoFilesAsync(
source1,
source2,
TimeSpan.FromSeconds(3),
null,
threshold: 50);
Clase VFPFingerPrint¶
Representa una huella digital de video con metadatos y soporte de serialización.
Propiedades¶
public byte[] Data { get; set; }
public TimeSpan Duration { get; set; }
public Guid ID { get; set; }
public string OriginalFilename { get; set; }
public TimeSpan OriginalDuration { get; set; }
public string Tag { get; set; }
public int Width { get; set; }
public int Height { get; set; }
public double FrameRate { get; set; }
public List<Rect> IgnoredAreas { get; set; }
Métodos¶
Load (Estático)¶
public static VFPFingerPrint Load(string filename)
public static VFPFingerPrint Load(byte[] data)
Descripción: Carga una huella digital desde archivo o memoria.
Parámetros:
filename(string): Ruta al archivo de huella digitaldata(byte[]): Datos de huella digital en memoria
Devuelve: VFPFingerPrint - Objeto de huella digital cargado
Ejemplo:
// Cargar desde archivo
var fingerprint = VFPFingerPrint.Load(@"C:\Fingerprints\video.vsigx");
Console.WriteLine($"Loaded: {fingerprint.OriginalFilename}");
Console.WriteLine($"Duration: {fingerprint.Duration}");
Console.WriteLine($"ID: {fingerprint.ID}");
// Cargar desde memoria
byte[] fpData = File.ReadAllBytes(@"C:\Fingerprints\video.vsigx");
var fingerprint2 = VFPFingerPrint.Load(fpData);
// Cargar múltiples huellas digitales
var fingerprints = new List<VFPFingerPrint>();
foreach (var file in Directory.GetFiles(@"C:\Fingerprints", "*.vsigx"))
{
try
{
var fp = VFPFingerPrint.Load(file);
fingerprints.Add(fp);
Console.WriteLine($"Loaded: {fp.OriginalFilename} ({fp.Duration})");
}
catch (Exception ex)
{
Console.WriteLine($"Failed to load {file}: {ex.Message}");
}
}
Save¶
public void Save(string filename)
public byte[] Save()
Descripción: Guarda la huella digital en archivo o memoria. Extensión predeterminada: .vsigx
Parámetros:
filename(string): Ruta del archivo de salida
Devuelve: byte[] - Datos de huella digital serializados (versión de memoria)
Ejemplo:
// Guardar en archivo
fingerprint.Save(@"C:\Fingerprints\output.vsigx");
// Guardar en memoria
byte[] data = fingerprint.Save();
File.WriteAllBytes(@"C:\Backup\fingerprint.vsigx", data);
// Guardar con metadatos
fingerprint.Tag = "Important scene at 00:42:00";
fingerprint.Save(@"C:\Fingerprints\tagged.vsigx");
// Guardado por lotes con nombres organizados
foreach (var fp in fingerprints)
{
string safeName = Path.GetFileNameWithoutExtension(fp.OriginalFilename)
.Replace(" ", "_")
.Replace(".", "_");
string outputPath = Path.Combine(
@"C:\Fingerprints",
$"{safeName}_{fp.ID}.vsigx");
fp.Save(outputPath);
}
Clase VFPFingerprintSource¶
Configuración para operaciones de huellas digitales de video.
Constructor¶
public VFPFingerprintSource(string filename)
Descripción: Crea una nueva configuración de fuente.
Parámetros:
filename(string): Ruta al archivo de video
Lanza: FileNotFoundException si el archivo no existe
Propiedades¶
public string Filename { get; set; }
public TimeSpan StartTime { get; set; }
public TimeSpan StopTime { get; set; }
public Rect CustomCropSize { get; set; }
public Size CustomResolution { get; set; }
public List<Rect> IgnoredAreas { get; }
public TimeSpan OriginalDuration { get; set; }
Filename(string): Ruta al archivo de video fuenteStartTime(TimeSpan): Hora de inicio para la huella digital (predeterminado: 0)StopTime(TimeSpan): Hora de finalización para la huella digital (predeterminado: duración del video)CustomCropSize(Rect): Rectángulo de recorte (distancias Izquierda, Arriba, Derecha, Abajo)CustomResolution(Size): Resolución objetivo (Vacío = sin redimensionar)IgnoredAreas(List<Rect>): Regiones a excluir (por ejemplo, logotipos, marcas de tiempo)OriginalDuration(TimeSpan): Duración total del video (poblado automáticamente)
Ejemplos¶
// Configuración básica
var source = new VFPFingerprintSource(@"C:\Videos\movie.mp4");
// Procesar rango de tiempo específico
var source2 = new VFPFingerprintSource(@"C:\Videos\long_video.mp4")
{
StartTime = TimeSpan.FromMinutes(10),
StopTime = TimeSpan.FromMinutes(20)
};
// Recortar a región de interés
var source3 = new VFPFingerprintSource(@"C:\Videos\video.mp4")
{
CustomCropSize = new Rect(100, 100, 1820, 980) // Eliminar bordes
};
// Redimensionar para procesamiento más rápido
var source4 = new VFPFingerprintSource(@"C:\Videos\4k_video.mp4")
{
CustomResolution = new Size(1280, 720) // Escalar desde 4K
};
// Ignorar superposiciones y logotipos
var source5 = new VFPFingerprintSource(@"C:\Videos\broadcast.mp4");
source5.IgnoredAreas.Add(new Rect(1700, 50, 1870, 150)); // Logotipo del canal
source5.IgnoredAreas.Add(new Rect(50, 50, 250, 100)); // Error de red
source5.IgnoredAreas.Add(new Rect(100, 950, 400, 1000)); // Ticker
// Opciones de procesamiento combinadas
var source6 = new VFPFingerprintSource(@"C:\Videos\tv_show.mp4")
{
StartTime = TimeSpan.FromSeconds(90), // Saltar introducción
StopTime = TimeSpan.FromMinutes(42), // Antes de los créditos
CustomResolution = new Size(640, 480),
CustomCropSize = new Rect(60, 0, 1860, 1080) // Eliminar pillarboxing
};
source6.IgnoredAreas.Add(new Rect(1600, 100, 1800, 200));
Clase VFPCompare¶
Funcionalidad de comparación de huellas digitales de bajo nivel.
Métodos¶
SetLicenseKey¶
public static void SetLicenseKey(string licenseKey)
Descripción: Establece la clave de licencia del SDK.
Ejemplo:
VFPCompare.SetLicenseKey("YOUR-LICENSE-KEY");
Process¶
public static int Process(
IntPtr ptr,
int w,
int h,
int s,
TimeSpan dTime,
ref VFPCompareData data)
Descripción: Procesa el cuadro RGB24 para la huella digital de comparación.
Parámetros:
ptr(IntPtr): Puntero a los datos del cuadro RGB24w(int): Ancho del cuadroh(int): Altura del cuadros(int): Stride (bytes por fila)dTime(TimeSpan): Marca de tiempo del cuadrodata(ref VFPCompareData): Estructura de datos de comparación
Devuelve: int - Código de estado (0 = éxito)
Ejemplo:
// Inicializar datos de comparación
var compareData = new VFPCompareData(durationInSeconds: 120);
// Procesar cuadros (generalmente hecho internamente por VFPAnalyzer)
IntPtr frameData = GetRGB24Frame(); // Su fuente de cuadros
int result = VFPCompare.Process(
frameData,
1920, // ancho
1080, // altura
5760, // stride para 1920x3 RGB24
TimeSpan.FromSeconds(1.5),
ref compareData);
if (result == 0)
{
Console.WriteLine("Frame processed successfully");
}
// Construir huella digital después de procesar todos los cuadros
IntPtr fpData = VFPCompare.Build(out long length, ref compareData);
// Limpiar
compareData.Free();
Build¶
public static IntPtr Build(
out long length,
ref VFPCompareData video)
Descripción: Construye la huella digital a partir de los cuadros procesados.
Parámetros:
length(out long): Tamaño de los datos de la huella digitalvideo(ref VFPCompareData): Datos de cuadros procesados
Devuelve: IntPtr - Puntero a los datos de la huella digital
Compare¶
public static double Compare(
VFPFingerPrint fp1,
VFPFingerPrint fp2,
int maxDifference)
Descripción: Compara dos huellas digitales.
Parámetros:
fp1(VFPFingerPrint): Primera huella digitalfp2(VFPFingerPrint): Segunda huella digitalmaxDifference(int): Diferencia máxima permitida
Devuelve: double - Puntuación de similitud (0-100, mayor = más similar)
Ejemplo:
var fp1 = VFPFingerPrint.Load(@"C:\Fingerprints\video1.vsigx");
var fp2 = VFPFingerPrint.Load(@"C:\Fingerprints\video2.vsigx");
double similarity = VFPCompare.Compare(fp1, fp2, maxDifference: 50);
Console.WriteLine($"Similarity: {similarity:F2}%");
if (similarity > 90)
{
Console.WriteLine("Videos are very similar");
}
else if (similarity > 70)
{
Console.WriteLine("Videos have significant similarities");
}
else
{
Console.WriteLine("Videos are different");
}
Clase VFPSearch¶
Funcionalidad de búsqueda de huellas digitales de bajo nivel.
Métodos¶
SetLicenseKey¶
public static void SetLicenseKey(string licenseKey)
Descripción: Establece la clave de licencia del SDK.
Process¶
public static int Process(
IntPtr ptr,
int w,
int h,
int s,
TimeSpan dTime,
ref VFPSearchData data)
Descripción: Procesa el cuadro de video para la huella digital de búsqueda.
Parámetros:
ptr(IntPtr): Puntero de datos del cuadro RGB24w(int): Ancho del cuadroh(int): Altura del cuadros(int): StridedTime(TimeSpan): Marca de tiempo del cuadrodata(ref VFPSearchData): Estructura de datos de búsqueda
Devuelve: int - Código de estado
Build¶
public static IntPtr Build(
out long length,
ref VFPSearchData data)
Descripción: Construye la huella digital de búsqueda.
Parámetros:
length(out long): Tamaño de datos de la huella digitaldata(ref VFPSearchData): Cuadros procesados
Devuelve: IntPtr - Puntero de datos de la huella digital
Search¶
public static int Search(
VFPFingerPrint fp1,
int skip1,
VFPFingerPrint fp2,
int skip2,
out double difference,
int maxDiff)
Descripción: Busca fragmento en video.
Parámetros:
fp1(VFPFingerPrint): Huella digital del fragmentoskip1(int): Frames a omitir al inicio defp1fp2(VFPFingerPrint): Huella digital del video principalskip2(int): Frames a omitir al inicio defp2difference(out double): Puntuación de diferencia de coincidenciamaxDiff(int): Diferencia máxima permitida
Devuelve: int - Posición donde se encontró (segundos) o Int32.MaxValue si no se encontró
Ejemplo:
// Buscar fragmento
var fragmentFp = VFPFingerPrint.Load(@"C:\Fingerprints\fragment.vsigx");
var videoFp = VFPFingerPrint.Load(@"C:\Fingerprints\full_video.vsigx");
int position = VFPSearch.Search(
fragmentFp,
skip1: 0,
videoFp,
skip2: 0,
out double matchDifference,
maxDiff: 20);
if (position != Int32.MaxValue)
{
Console.WriteLine($"Fragment found at {position} seconds");
Console.WriteLine($"Match quality: {matchDifference}");
}
else
{
Console.WriteLine("Fragment not found");
}
// Buscar desde una posición específica
int nextPosition = VFPSearch.Search(
fragmentFp,
0,
videoFp,
position + 30, // Saltar más allá de la primera coincidencia
out matchDifference,
maxDifference: 20);
Clase VFPFingerPrintDB¶
Base de datos para gestionar colecciones de huellas digitales.
Propiedades¶
public List<VFPFingerPrint> Items { get; }
Métodos¶
Save¶
public void Save(string filename)
Descripción: Guarda la base de datos en un archivo.
Ejemplo:
var db = new VFPFingerPrintDB();
// Agregar huellas digitales
foreach (var videoFile in Directory.GetFiles(@"C:\Videos", "*.mp4"))
{
var source = new VFPFingerprintSource(videoFile);
var fp = await VFPAnalyzer.GetComparingFingerprintForVideoFileAsync(source);
if (fp != null)
{
db.Items.Add(fp);
}
}
// Guardar base de datos
db.Save(@"C:\Database\fingerprints.db");
Console.WriteLine($"Saved {db.Items.Count} fingerprints to database");
Load (Estático)¶
public static VFPFingerPrintDB Load(string filename)
Descripción: Carga la base de datos desde un archivo.
Ejemplo:
// Cargar base de datos existente
var db = VFPFingerPrintDB.Load(@"C:\Database\fingerprints.db");
Console.WriteLine($"Loaded {db.Items.Count} fingerprints");
// Consultar base de datos
var recentVideos = db.Items
.Where(fp => fp.OriginalDuration > TimeSpan.FromMinutes(30))
.OrderBy(fp => fp.OriginalFilename)
.ToList();
foreach (var fp in recentVideos)
{
Console.WriteLine($"{fp.OriginalFilename}: {fp.Duration}");
}
ContainsFile¶
public bool ContainsFile(VFPFingerprintSource source)
Descripción: Comprueba si la base de datos contiene una huella digital para la fuente.
Ejemplo:
var source = new VFPFingerprintSource(@"C:\Videos\new_video.mp4");
if (!db.ContainsFile(source))
{
// Generar y agregar nueva huella digital
var fp = await VFPAnalyzer.GetComparingFingerprintForVideoFileAsync(source);
db.Items.Add(fp);
db.Save(@"C:\Database\fingerprints.db");
}
else
{
Console.WriteLine("Fingerprint already exists in database");
}
GetFingerprint¶
public VFPFingerPrint GetFingerprint(VFPFingerprintSource source)
Descripción: Recupera la huella digital que coincide con la fuente.
Ejemplo:
var source = new VFPFingerprintSource(@"C:\Videos\video.mp4");
var fp = db.GetFingerprint(source);
if (fp != null)
{
Console.WriteLine($"Found fingerprint: {fp.ID}");
Console.WriteLine($"Duration: {fp.Duration}");
Console.WriteLine($"Tag: {fp.Tag}");
}
Clase VFPFingerprintFromFrames¶
Crea huellas digitales a partir de cuadros de imagen individuales. Disponible en todas las plataformas.
Constructor¶
public VFPFingerprintFromFrames(
double frameRate,
int width,
int height,
TimeSpan totalDuration)
Descripción: Inicializa el constructor de huellas digitales basado en cuadros.
Parámetros:
frameRate(double): Tasa de cuadros de videowidth(int): Ancho del cuadroheight(int): Altura del cuadrototalDuration(TimeSpan): Duración total del video
Métodos¶
Push¶
public void Push(byte[] rgb24frame) // All platforms
public void Push(Bitmap frame) // Windows only
public void Push(SKBitmap frame) // All platforms (new)
public void Push(IntPtr rgb24frame, int rgb24frameSize) // All platforms
Descripción: Agrega cuadros al proceso de generación de huellas digitales. Los cuadros deben coincidir con las dimensiones configuradas.
- byte[]: Datos de cuadro RGB24 sin procesar (multiplataforma)
- Bitmap: System.Drawing.Bitmap (solo Windows)
- SKBitmap: Mapa de bits SkiaSharp para soporte multiplataforma
- IntPtr: Puntero a datos de cuadro RGB24 (multiplataforma)
Ejemplo:
// Crear constructor
var builder = new VFPFingerprintFromFrames(
frameRate: 30.0,
width: 1920,
height: 1080,
totalDuration: TimeSpan.FromMinutes(5));
// Multiplataforma: Agregar cuadros como matrices de bytes
foreach (var frameData in videoStream.GetFrames())
{
builder.Push(frameData); // byte[] RGB24
}
// Multiplataforma: Agregar mapas de bits SkiaSharp
using (var skBitmap = SKBitmap.Decode(imageData))
{
builder.Push(skBitmap);
}
// Solo Windows: Agregar cuadros System.Drawing.Bitmap
#if NET_WINDOWS
for (int i = 0; i < frameCount; i++)
{
Bitmap frame = GetFrameAsBitmap(i);
builder.Push(frame);
}
#endif
// Multiplataforma: Agregar cuadros vía IntPtr
unsafe
{
fixed (byte* ptr = frameData)
{
builder.Push(new IntPtr(ptr), frameData.Length);
}
}
// Construir huella digital final
var fingerprint = builder.Build();
fingerprint.OriginalFilename = "stream_capture.mp4";
fingerprint.Save(@"C:\Fingerprints\stream.vsigx");
Build¶
public VFPFingerPrint Build()
Descripción: Genera huella digital a partir de cuadros procesados.
Devuelve: VFPFingerPrint - Huella digital generada
Tipos de Soporte¶
VFPCompareData¶
public struct VFPCompareData
{
public IntPtr Data { get; set; }
public VFPCompareData(int duration)
public void Free()
}
Descripción: Gestiona datos de comparación nativos.
Ejemplo:
// Crear y usar datos de comparación
var data = new VFPCompareData(durationInSeconds: 60);
try
{
// Process frames...
// Build fingerprint...
}
finally
{
data.Free(); // Siempre liberar memoria nativa
}
VFPSearchData¶
public class VFPSearchData : IDisposable
{
public IntPtr Data { get; set; }
public VFPSearchData(TimeSpan duration)
public void Free()
public void Dispose()
}
Descripción: Gestiona datos de búsqueda nativos con eliminación automática.
Ejemplo:
// La declaración using asegura una limpieza adecuada
using (var searchData = new VFPSearchData(TimeSpan.FromMinutes(2)))
{
// Process frames for search fingerprint
// Build fingerprint
} // Automatically disposed
Delegados¶
VFPProgressCallback¶
public delegate void VFPProgressCallback(int percent)
Descripción: Informa el progreso durante las operaciones de huellas digitales (0-100).
Ejemplo:
// Visualización de progreso simple
VFPProgressCallback progressCallback = (percent) =>
{
Console.Write($"\rProgress: {percent}%");
if (percent == 100) Console.WriteLine();
};
// Progreso con actualización de UI
VFPProgressCallback uiProgress = (percent) =>
{
progressBar.Value = percent;
labelStatus.Text = $"Processing: {percent}%";
Application.DoEvents();
};
// Progreso con verificación de cancelación
CancellationToken token = GetCancellationToken();
VFPProgressCallback cancellableProgress = (percent) =>
{
if (token.IsCancellationRequested)
throw new OperationCanceledException();
UpdateProgress(percent);
};
VFPErrorCallback¶
public delegate void VFPErrorCallback(string error)
Descripción: Informa errores durante las operaciones de huellas digitales.
Ejemplo:
// Registrar errores
VFPErrorCallback errorCallback = (error) =>
{
logger.Error($"VFP Error: {error}");
File.AppendAllText(@"C:\Logs\vfp_errors.log",
$"{DateTime.Now}: {error}{Environment.NewLine}");
};
// Mostrar errores al usuario
VFPErrorCallback userErrorCallback = (error) =>
{
MessageBox.Show($"Error processing video: {error}",
"Fingerprinting Error",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
};
// Recopilar errores para procesamiento por lotes
var errors = new List<string>();
VFPErrorCallback collectErrors = (error) => errors.Add(error);