Saltar a contenido

Documentación de la API .NET del Video Fingerprinting SDK

Try it Download free trial dotnet add package VisioForge.DotNet.Core Pricing →

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

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 procesamiento
  • errorDelegate (VFPErrorCallback): Callback opcional para mensajes de error
  • progressDelegate (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 video
  • errorDelegate (VFPErrorCallback): Callback de error opcional
  • progressDelegate (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 digital
  • fp2 (VFPFingerPrint): Segunda huella digital
  • shift (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 video
  • file2 (VFPFingerprintSource): Configuración del segundo video
  • shift (TimeSpan): Desplazamiento de tiempo máximo permitido
  • errorCallback (VFPErrorCallback): Callback de error
  • threshold (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 digital
  • data (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 fuente
  • StartTime (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 RGB24
  • w (int): Ancho del cuadro
  • h (int): Altura del cuadro
  • s (int): Stride (bytes por fila)
  • dTime (TimeSpan): Marca de tiempo del cuadro
  • data (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 digital
  • video (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 digital
  • fp2 (VFPFingerPrint): Segunda huella digital
  • maxDifference (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 RGB24
  • w (int): Ancho del cuadro
  • h (int): Altura del cuadro
  • s (int): Stride
  • dTime (TimeSpan): Marca de tiempo del cuadro
  • data (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 digital
  • data (ref VFPSearchData): Cuadros procesados

Devuelve: IntPtr - Puntero de datos de la huella digital

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 fragmento
  • skip1 (int): Frames a omitir al inicio de fp1
  • fp2 (VFPFingerPrint): Huella digital del video principal
  • skip2 (int): Frames a omitir al inicio de fp2
  • difference (out double): Puntuación de diferencia de coincidencia
  • maxDiff (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 video
  • width (int): Ancho del cuadro
  • height (int): Altura del cuadro
  • totalDuration (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);