Eu tenho o seguinte comando:
ffmpeg -f f32le -ar 44100 -channels 2 -i pipe:0 -ss 3 -i input.mp4 -y -f mp4 -map 0:a -map 1:v -c:v copy -use_editlist 0 output.mp4
Ao copiar o fluxo de vídeo em vez de recodificá-lo, não consigo obter nenhuma informação útil ffprobe
que me indique a posição procurada do fluxo de vídeo.
Tentei coletar informações sobre o fluxo completo:
ffprobe -of json -show_streams -show_format output.mp4
Mas start_time
é 0
e a duração não é afetada. Também tentei coletar informações no primeiro quadro do stream de vídeo:
ffprobe -of json -select_streams v -show_frames output.mp4
Ainda não há informações úteis.
No entanto, quando recodifico o fluxo de vídeo (removendo -c:v copy
do comando), obtenho as informações que desejo. A duração do stream de vídeo é modificada pela -ss
opção. Por exemplo, se a duração do vídeo for 5, ffprobe
retornaria uma duração de 2 (5 menos 3), o que me permite saber a posição procurada. Se eu também incluir um -copyts
na mistura, poderei obter informações úteis verificando as informações do primeiro quadro.
Como posso obter a posição procurada sem precisar recodificar o fluxo de vídeo? Saúde!
Responder1
Se você tiver acesso ao arquivo original e tiver usado
ffmpeg -f f32le -ar 44100 -channels 2 -i pipe:0 -ss X -i input.mp4 -y -f mp4 -map 0:a -map 1:v -c:v copy -use_editlist 0 output.mp4
então siga este método.
1) Obtenha a duração do stream de vídeo de origem
ffprobe source.mp4 -show_entries stream=duration -select_streams v -of compact=p=0 -v 0
Saída, por exemplo
duration=229.033333
2) Obtenha a duração e o primeiro PTS do stream de vídeo resultante
ffprobe output.mp4 -show_entries packet=pts_time:stream=duration -select_streams v -read_intervals 0%+#1 -of compact=p=0 -v 0
Saída, por exemplo
pts_time=0.066667
duration=220.700000
Portanto, o primeiro quadro resultante é 229.033333 - 220.700000
= 8.333333s
do fluxo de origem.
No entanto, este não será o valor -ss, pois -ss
pode não apontar para um quadro-chave.
3), Obtenha a duração e o PTS do primeiro pacote de áudio. O ffmpeg dará uma duração prolongada para sincronizar o áudio com o -ss
quadro especificado.
ffprobe output.mp4 -show_entries packet=pts_time,duration_time -select_streams a -read_intervals 0%+#1 -of compact=p=0 -v 0
Saída, por exemplo
pts_time=0.000000|duration_time=2.733333
Então, 8.333333s + 2.733333 - 0.000000 - 0.066667
= 11.000000s
é o quadro procurado.