Eu converto vídeos usando o FFMPEG. Meu objetivo é convertê-los para o formato MP4 ( MPEG-4 Parte 14 ) com fluxo de áudio codificado em AAC e fluxo de vídeo codificado em MPEG-4 parte 10 .
Eu uso a seguinte linha para converter os vídeos:
ffmpeg -y -i "{inputFile}" "{outputFile}"
O vídeo convertido parece bom, no entanto, a duração dos fluxos no arquivo convertido e no arquivo de entrada nem sempre corresponde.
Eu fiz alguns experimentos e a diferença na duração está, sem dúvida, lá, no entanto, não é tanto assim - de qualquer maneira eu estou testando com pequenos vídeos. Aqui estão os meus resultados:
| InputFile | InputAudio | InputVideo | OutputAudio | OutputVideo |
|------------|------------|------------|-------------|--------------|
| h.avi | 3s 631ms | 3s 567ms | 3s 668ms | 3s 567ms |
| h.flv | 3s 631ms | 3s 558ms | 3s 668ms | 3s 567ms |
| h.mov | 3s 532ms | 3s 533ms | 3s 682ms | 3s 534ms |
| h.mp4 | 3s 605ms | 3s 534ms | 3s 682ms | 3s 567ms |
| h.mpg | 3s 605ms | 3s 533ms | 3s 563ms | 3s 534ms |
| h.wmv | 3s 620ms | 3s 633ms | 3s 659ms | 3s 567ms |
Como eu criaria um software no topo do FFMPEG, ficaria mais feliz se pudesse ao menos entender o motivo dessa diferença. É por causa de alguma transcodificação desnecessária?
Nesse caso, posso desativar essa transcodificação para impedir que o FFMPEG redefina meu arquivo de vídeo de entrada?
Se não consigo desativá-lo, como posso ter certeza (além dos testes) de que essa diferença não é proporcional ao tamanho do vídeo?
Se eu converter, por exemplo, um vídeo de 10 horas, uma diferença de vários segundos ou até minutos não será adequada para mim.
fonte
Respostas:
Espero que esta explicação seja o que você está procurando:
Ao transcodificar para uma codificação como H.264 (MPEG-4 parte 10), você também necessariamente reanalisa o vídeo, isso faz parte da técnica de compactação H.264. No entanto, duvido que esse seja o motivo pelo qual você enfrenta um intervalo de tempo, pois a reamostragem não influencia necessariamente a taxa de clock da mídia. Portanto, não me preocuparia muito com a reamostragem, isso pode causar alguma variação, mas provavelmente muito marginal.
Os formatos de contêiner que você listou são meio irrelevantes, porque definem como o fluxo compactado é empacotado, enquanto a fonte da diferença de tempo é a própria compactação. O
.flv
arquivo, por exemplo, pode conter um fluxo codificado pelo codec Flash Sorenson herdado ou pelo H.264 mais recente. No primeiro caso, você estaria transcodificando o fluxo de vídeo, mas no último é possível que você não esteja - dependendo do codec de áudio usado. Os contêineres.avi
e.wmv
são independentes de codec, portanto não há como adivinhar a codificação do conteúdo.Você não mencionou como a duração foi testada. Observe que ffmpeg, por padrão, mostra a duração que aparece nos metadados do arquivo e não um valor calculado. Se sua lista for baseada nos dados que o ffmpeg despeja como parte de seus avisos de abertura, observe que esses são metadados explicitamente e não um valor medido real.
O delta nas durações que você apresentou está dentro do intervalo de um ou dois quadros no intervalo de 25 ou 30 fps. É razoável que os codecs atinjam ou removam os quadros em branco dos fluxos de acordo com seu algoritmo (ou a organização do desenvolvedor ...). Não deve influenciar o carimbo de data / hora quando você concatena corretamente os fluxos.
Só posso pensar em duas razões que podem alterar substancialmente a duração da sua mídia, nem aplicável no seu caso específico:
Recodificação em uma velocidade-alvo diferente. Às vezes, isso acontece acidentalmente devido a metadados incorretos no arquivo de entrada. Mas não no seu caso, que, como mencionado acima, corresponde a um único quadro eliminado ou ganho.
Quando você aplica um codec que recria qualquer fluxo. Exemplos incluem remoção de anúncios, detecção de silêncio, limpeza de ruído etc.
Resumindo, se você está preocupado com o que acontecerá com um vídeo de 10 horas - basta executar um teste real. Se você tiver problemas e procurar assistência, lembre-se de postar os detalhes do codec do arquivo de entrada e o método que você mediu a duração do fluxo.
Espero que isto ajude.
fonte