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?