Biblioteca para manipulación programática de video

Me gustaría escribir un guión que realice la siguiente tarea: leer varios videos, determinar una parte común de los fotogramas que aparecen en todos ellos y luego eliminar esa parte común de cada video.

¿Cuáles son algunas bibliotecas que brindan este tipo de funcionalidad para manipular videos e imágenes (ya sean funcionalidades muy parecidas o bloques de bajo nivel que puedo usar)? Estoy de acuerdo con que la biblioteca esté en cualquier idioma.

¿Qué tipo de video debería leer?
Me sorprendería si dicha biblioteca estuviera limitada en términos de formatos. Pero en el peor de los casos, si las funcionalidades están disponibles solo para 1 formato, puedo usar otras herramientas para convertir entre formatos.

Respuestas (2)

La herramienta/biblioteca más utilizada para la manipulación de videos es FFMPEG : puede leer, cortar, dividir y escribir casi todos los formatos de video que existen y es gratuito, gratuito, de código abierto y multiplataforma.

Todo ese poder tiene un precio en la usabilidad, por lo que hay muchos proyectos que envuelven las cosas para hacerlas un poco más presentables, uno de mis favoritos es MoviePy , también gratuito y multiplataforma y vale la pena echarle un vistazo , lo que puede simplificar enormemente el corte . y empalmar sus archivos.

El gran problema es reconocer los bloques "idénticos" dentro de cada archivo. Esto es un problema porque, debido a la codificación y la compresión, aunque parezcan idénticos para usted, no lo serán para la computadora. Lo que nos lleva a Computer Vision, ya que tendrá que buscar bloques visualmente similares dentro de los archivos.

La herramienta de referencia para el reconocimiento de imágenes es OpenCV , nuevamente gratuita, de código abierto y multiplataforma, y ​​hay miles de libros, artículos y documentos sobre cómo usarlo. Es principalmente C++ pero hay python y otros enlaces.

Sería demasiado describir cómo necesitaría buscar bloques visualmente similares en varios archivos, pero el proceso consistirá en extraer una huella dactilar monocromática de baja definición en un intervalo determinado a través de cada película y luego compararlos y refinar el resultados con varias pasadas.

Puede esperar que su computadora pase mucho tiempo procesando buscando los bloques "Idénticos" a menos que pueda darle una pista o dos, si, como sospecho, está buscando eliminar los anuncios de un conjunto de videos grabados aire, por lo general, en cualquier estación dada, puede programar su reloj para cuándo van a ser los anuncios; también muchas estaciones usan un bloque de referencia en la esquina superior derecha de la pantalla cuando los anuncios están a punto de comenzar. Ambos pueden ser útiles para acotar la búsqueda.

Si tiene mucha suerte, o aún no ha grabado su metraje, tendrá la pista de subtítulos en cada uno; esto realmente puede acelerar las cosas, ya que la búsqueda de patrones idénticos en el texto es mucho más rápida que los marcos en busca de similitudes. VideoGrep es un script de Python que usa la pista de subtítulos para extraer clips de película que cumplen con los requisitos y probablemente sea un muy buen lugar para comenzar.

Para pensar fuera de la caja en la selección de segmentos de video, también puede obtener algunas ideas de este script de MoviePy que selecciona y une las partes interesantes de un juego de fútbol en función del ruido que hace la multitud.

Especialmente para el tipo de contenido de transmisión, si la herramienta propuesta puede tomar los fotogramas clave fácilmente, creo que su carga computacional disminuiría, ya que ya se ha realizado una gran cantidad de cálculos previos en las metodologías de compresión.

Puede consultar LEADTOOLS Multimedia SDK para implementar este tipo de tarea. Admite C, C++, .NET y funcionará con otros lenguajes que admitan objetos COM. Este SDK admite la descompresión de archivos de video y proporciona un filtro de devolución de llamada de video para obtener los marcos individuales para realizar el procesamiento de imágenes personalizado. Esto le permitiría usar el mismo algoritmo para el procesamiento sin necesidad de un código especial para manejar diferentes formatos de archivo. Si los archivos que está procesando utilizan compresión MPEG-2 o H.264, también podría utilizar (de forma nativa) la descompresión de hardware para descargar parte del trabajo a la GPU.

Aquí hay una publicación del foro en los foros de soporte de LEADTOOLS que tiene un proyecto de muestra que ilustra cómo usar la devolución de llamada de video: CÓMO: Video OCR usando el filtro de devolución de llamada

Una parte clave de esta publicación del foro es agregar la devolución de llamada de video. Aquí está el código relevante sobre cómo hacer eso:

Processor videoCallback = playctrl.VideoProcessors.Callback;
playctrl.SelectedVideoProcessors.Add(videoCallback);
lmvCallback = (LMVCallback)playctrl.GetSubObject(PlayObject.SelVideoProcessor);
lmvMyUserCallback = new LMVMyUserCallback();
lmvCallback.ReceiveProcObj = lmvMyUserCallback;

La otra parte clave de esta demostración es la implementación del método ReceivePro(), ya que esta es la función de devolución de llamada invocada. El código a tener en cuenta es este:

public void ReceiveProc(int pData, int lWidth, int lHeight, int lBitCount, int lSize, int bTopDown)
{
   try
   {
      if (m_bSnapshot)
      {
         // Get the background image
         RasterViewPerspective viewPerspective;
         if (bTopDown == 1)
            viewPerspective = RasterViewPerspective.TopLeft;
         else
            viewPerspective = RasterViewPerspective.BottomLeft;

         RasterImage img = new RasterImage(
            RasterMemoryFlags.User, //A combination of the RasterMemoryFlags enumeration members indicating the type of memory to allocate for the image data.
            lWidth, // Width of the image in pixels.
            lHeight, //Height of the image in pixels.
            lBitCount, //The number of bits per pixel.
            RasterByteOrder.Bgr, //Color order for 16-, 24-, 32-, 48- and 64-bit images.
            viewPerspective, //Specifies where the beginning of the image is stored.
            null, //The palette that the image will use. You can specify your own palette, or use null (Nothing in Visual Basic) for LEAD's fixed palette. The palette member is used only when bitsPerPixel is less than or equal to 8.
            IntPtr.Zero, //Unmanaged data pointer that will contain the image data when flags is RasterMemoryFlags.User.
            0); //Length in bytes of the data passed to userData. Only when used when userData is not IntPtr.Zero and flags is RasterMemoryFlags.User.

         img.SetUserData(new IntPtr(pData), lSize);

Como también ilustra este proyecto, puede usar funciones del SDK de imágenes de reconocimiento LEADTOOLS si los marcos comunes que está buscando contienen texto. Este SDK también contiene la clase de procesamiento de imágenes CorrelationCommand , que está diseñada para encontrar datos de imágenes específicos dentro de otra imagen. Aquí hay un código de muestra que ilustra cómo configuraría y ejecutaría este método:

RasterCodecs codecs = new RasterCodecs();
// Prepare the command
RasterImage DstImage = codecs.Load("source.png");
CorrelationCommand command = new CorrelationCommand();
command.CorrelationImage = DstImage;
command.Threshold = 70;
command.XStep = 1;
command.YStep = 1;
command.Points = new LeadPoint[90];
//Apply the correlation filter.
command.Run(img);

Con acceso a cada cuadro en la transmisión de video, podría realizar cualquier tipo de procesamiento de imagen que quisiera hacer en el cuadro.

Descargo de responsabilidad: soy un empleado de la empresa que escribió esta biblioteca.