Como definir eficientemente a duração do primeiro quadro de um filme mp4?

0

Eu tenho um aplicativo autocodificado que utiliza a amostra Camera2Video do Google publicada no GitHub . Infelizmente, parece haver um problema do Android 6 em diante, que faz com que os vídeos gravados sejam quebrados. De acordo com um relatório de problemas no GitHub , o tempo de decodificação do primeiro quadro é enorme se comparado a um vídeo em funcionamento .

Para o meu arquivo de exemplo de tamanho 11s, os sintomas são:

  • No próprio telefone Android, o player de vídeo congela no primeiro quadro. O áudio está tocando, a reprodução pára após 11s. Depois de puxar o controle deslizante de volta ao início, o vídeo e o áudio são reproduzidos em sincronia.
  • No Windows, usando diferentes players (Groove, WMP, VLC), não há vídeo algum ou também congela no primeiro quadro. O áudio está sempre bem. A duração do vídeo é mostrada como 11s. Alguns jogadores param no final, alguns continuam aumentando o tempo de reprodução depois que o controle deslizante de reprodução está a 100%.
  • No Google Chrome no Windows, a duração do vídeo é mostrada em 3,5 horas. O áudio é reproduzido durante os primeiros 11s. O vídeo mostra o primeiro quadro quase todo o tempo, depois 11s do final em que o vídeo está sendo reproduzido.

O comportamento do Google Chrome mostra melhor o que está acontecendo: há 11 segundos de áudio e 11s * 30fps = 330 quadros no arquivo. Mas o primeiro quadro não é de 1 / 30s, mas de 3,5 horas.

Primeiro, eu tinha tentado várias ferramentas de reparo de vídeo para consertar o arquivo mp4, mas a maioria não mudou nada ou não encontrou nenhum problema para consertar e não iria rodar em primeiro lugar.

Depois de experimentar um erro, encontrei uma primeira solução de trabalho . Eu usei o ffmpeg com a opção de filtro setpts : .\ffmpeg.exe -i "broken.mp4" -vf setpts=N/FRAME_RATE/TB "fixed.mp4" . Depois, o arquivo fixo é executado corretamente (e também é muito menor).

O problema com esta abordagem é que demora tanto tempo a completar quanto a duração do vídeo que quero corrigir. Mas o vídeo que eu quero fazer com o aplicativo pode durar cerca de uma hora no futuro.

Então, eu imagino, existe alguma possibilidade de ajustar a duração que o primeiro quadro é mostrado? Em teoria, isso deve significar que o ffmpeg precisa apenas substituir um inteiro e não ter que lidar com a descodificação ou codificação. Pode ser feito e como?

    
por LWChris 21.06.2018 / 19:04

1 resposta

0

Visto que, com base na sua solução de trabalho, parece que você está certo em adequar a saída a um rácio de fotogramas constante, sugiro este método mais rápido em dois passos. Nenhuma recodificação envolvida.

Extrair fluxo bruto:

ffmpeg.exe -i "broken.mp4" -c copy broken.h264

Remux:

ffmpeg.exe -i broken.h264 -i broken.mp4 -map 0 -map 1:a -c copy new.mp4
    
por 21.06.2018 / 19:34