Saltar a contenido

Video Fingerprinting SDK para C++

Descripción General

El SDK Video Fingerprinting para C++ proporciona una implementación nativa con acceso directo a capacidades de análisis de video y generación de huellas digitales de alto rendimiento. Este SDK es ideal para aplicaciones que requieren:

  • Máximo rendimiento y sobrecarga mínima
  • Integración directa con aplicaciones nativas
  • Gestión de memoria personalizada
  • Pipelines de procesamiento en tiempo real
  • Despliegue en sistemas embebidos

Características Principales

Ventajas de Rendimiento

  • Rendimiento Nativo - Acceso directo a memoria y algoritmos optimizados
  • Sobrecarga Cero - Sin runtime gestionado ni recolección de basura
  • Optimización SIMD - Aprovecha capacidades de vectorización de CPU
  • Procesamiento Paralelo - Generación de huellas multi-hilo
  • Gestión de Memoria Personalizada - Control detallado sobre asignación de memoria

Soporte de Plataformas

  • Windows - Visual Studio 2019+ (x64)
  • Linux - GCC 9+ o Clang 10+
  • macOS - Xcode 12+ (Intel y Apple Silicon)

Documentación

Primeros Pasos

Conceptos Básicos

Ejemplos de Código

Generar Huella de Búsqueda (API de alto nivel)

#include <VisioForge_VFP.h>
#include <VisioForge_VFP_Types.h>

VFPSetLicenseKey(L"su-clave-de-licencia");

// Configurar origen
VFPFingerprintSource src{};
VFPFillSource(L"C:\\video.mp4", &src);
src.StartTime = 10000;   // empezar a los 10s
src.StopTime = 60000;    // parar a los 60s

// Generar huella de búsqueda
VFPFingerPrint fp{};
wchar_t* error = VFPSearch_GetFingerprintForVideoFile(src, &fp);
if (error == nullptr)
{
    printf("Huella: %dx%d, %.1fs, %d bytes\n",
           fp.Width, fp.Height, fp.Duration / 1000.0, fp.DataSize);
    VFPFingerprintSave(&fp, L"salida.vfpsig");
}

Comparar Dos Huellas

VFPFingerPrint fp1{}, fp2{};
VFPFingerprintLoad(&fp1, L"video1.vfpsig");
VFPFingerprintLoad(&fp2, L"video2.vfpsig");

double diff = VFPCompare_Compare(fp1.Data, fp1.DataSize,
                                 fp2.Data, fp2.DataSize, 10);
printf("Diferencia: %.2f\n", diff);

Buscar Fragmento en Video Más Largo

VFPFingerPrint needle{}, haystack{};
VFPFingerprintLoad(&needle, L"fragmento.vfpsig");
VFPFingerprintLoad(&haystack, L"completo.vfpsig");

double diff = 0;
int pos = VFPSearch_Search2(&needle, 0, &haystack, 0, &diff, 300);
if (pos != INT_MAX)
    printf("Encontrado en %d segundos (diff: %.2f)\n", pos, diff);

API de Bajo Nivel por Fotograma (para streams en vivo / decodificadores personalizados)

// Asignar acumulador para ~60s de video a 30fps
void* pData = VFPSearch_Init2(30 * 60);

while (hayMasFotogramas)
{
    // Decodificar fotograma a buffer RGB...
    VFPSearch_Process(datosRGB, ancho, alto, stride, timestampSeg, pData);
}

int len = 0;
char* data = VFPSearch_Build(&len, pData);

// Usar data/len como VFPFingerPrint.Data / .DataSize
VFPFingerPrint fp{};
fp.Data = data;
fp.DataSize = len;
// ... establecer Duration, Width, Height, FrameRate manualmente ...

VFPSearch_Clear(pData);

Patrones de Integración

Procesamiento por Lotes

void ProcessBatch(const std::vector<std::wstring>& videos)
{
    for (const auto& path : videos)
    {
        VFPFingerprintSource src{};
        VFPFillSource(path.c_str(), &src);

        VFPFingerPrint fp{};
        VFPSearch_GetFingerprintForVideoFile(src, &fp);
        // Almacenar fp en base de datos...
    }
}

Análisis de Stream en Tiempo Real (API de bajo nivel)

void* pData = VFPSearch_Init2(30 * 60); // 30fps, búfer de 60s

void OnFrame(unsigned char* rgb, int w, int h, int stride, double timestampSec)
{
    VFPSearch_Process(rgb, w, h, stride, timestampSec, pData);
}

void OnStreamEnd()
{
    int len;
    char* data = VFPSearch_Build(&len, pData);
    // Comparar con huellas conocidas...
    VFPSearch_Clear(pData);
}

Soporte y Recursos

Documentación

Código de Ejemplo

  • Ejemplos Completos - Ejemplos de código funcionales
  • Herramientas de línea de comandos en el paquete SDK /samples/cpp/

Comunidad y Soporte

Registro de Licencia

#include <VisioForge_VFP.h>

VFPSetLicenseKey(L"su-clave-de-licencia");
// o para char estrecho: VFPSetLicenseKeyA("su-clave-de-licencia");