Como determinar segmentos de filmagem mantidos em comum entre diferentes arquivos de vídeo?

5

Contexto:

Digamos que eu tenha dois arquivos de vídeo - rasgos de uma fita de DVD ou DV. Eles são ambos formato MKV ou AVI, algum container padrão ou outro, mas foram copiados separadamente, com diferentes codificadores, diferentes taxas de bits e diferentes resoluções. Os vídeos são de cenas diferentes, mas há um segmento de imagens que ambas as trilhas têm em comum (um segmento com o mesmo material de origem exato, embora, como eu disse, o codificador / resolução / taxa de bits seja diferente em cada arquivo).

Por exemplo: o Arquivo 1 tem um segmento de 00:10 a 00:20 que tem o mesmo material de origem que o segmento das 10:00 às 10:10 no Arquivo 2.

O problema:

Existe um programa em que posso alimentar os dois arquivos (posso remodi-los em diferentes formatos de contêiner primeiro, se necessário), o que me dirá, ainda mais ou menos, os pontos inicial e final de segmentos idênticos do vídeo? Ou seja, eu poderia alimentar os dois arquivos de exemplo acima, e ele me diria os dois intervalos em que a gravação é da mesma fonte?

O ideal é que eu queira algo que me permita ajustar a "confiança" da detecção de similaridade, para que eu possa alimentá-lo, digamos, com um arquivo de baixa resolução e baixa taxa de bits e um arquivo HD e relaxe sua confiança para que ainda detectasse segmentos semelhantes entre esses insumos de qualidade diferente.

A resposta a esta pergunta pode ser "é impossível sem uma tonelada de trabalho", mas imaginei que perguntaria mesmo assim.

    
por Zac B 09.03.2012 / 22:12

1 resposta

2

Interessante. Eu acho que isso pode ser bastante tratável se o tamanho do vídeos não são muito grandes (ou você está bem em fazer isso em vários pedaços).

Veja o que estou pensando:

  • O que você realmente quer no final é uma comparação lado-a-lado, quase como sdiff

  • Mas, em vez de números de linha, você quer um índice de tempo.

  • E, em vez de uma linha de texto, você quer um quadro de vídeo que possa comparar com algum nível de certeza contra outro

Vou assumir ferramentas padrão do Unix, a menos que seja especificado de outra forma. Eles estão disponíveis para todos os sistemas operacionais incluindo o Windows .

Então, que tal isso:

  1. Extraia todos os quadros de cada vídeo para um PNG.

    Você pode fazer isso com ffmpeg , consulte este post de superusuário Você terá um diretório cheio de JPGs numerados.

  2. Certifique-se de que cada um tenha a mesma proporção. Para este exemplo, digamos que seja 450x320. O ImageMagick pode ajudá-lo se você não o tiver.

  3. Agora a parte complicada. Estamos tentando comparar quadros de fontes completamente diferentes e queremos tentar fazer sem nada computacionalmente caro, como visão de computador ou uma rede neural.

    Aqui está a minha ideia: reduzir cada imagem para um pequeno PNG a preto e branco de tamanho 1 / 10th.

    Então, se você tivesse esta foto de cat.jpg:

    ComumpoucodeImageMagick:convertcat.jpg-typegrayscale-resize45x32-depth1x.pngtorna-se:(ampliadoparavocêverafoto,semtrocadilhos):

    Agora, isso é exclusivo o suficiente para ser uma assinatura de quadro, mas não é tão único (eu acho) que não podemos obter uma soma de verificação estável

  4. Repita para cada quadro. Execute um script assim duas vezes, sobre cada conjunto de quadros.

    #!/bin/sh
    for f in 'ls -1' do:
        convert $f -type grayscale -resize 45x32 -depth 1 - | cksum >> 1.txt
    done
    

    Então, você receberá um 2.txt para o outro arquivo.

  5. Numere cada arquivo. Você pode ficar chique e fazer videocódigo de timestamps, mas nós vamos use apenas nl :

    $ nl -ba 1.txt > 1n.txt
    $ nl -ba 2.txt > 2n.txt
    
  6. O grand finale. Use a ferramenta Unix comm altamente subestimada para mostrar o que o mesmo entre 1 e 2:

    $ comm -12 1n.txt 2n.txt
    

Experimente! Eu aposto que funcionaria! : -)

    
por 20.04.2012 / 09:22