FFprobe - É possível obter a "posição procurada" de um stream de vídeo sem recodificá-lo?

FFprobe - É possível obter a "posição procurada" de um stream de vídeo sem recodificá-lo?

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 ffprobeque 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é 0e 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 copydo comando), obtenho as informações que desejo. A duração do stream de vídeo é modificada pela -ssopção. Por exemplo, se a duração do vídeo for 5, ffproberetornaria uma duração de 2 (5 menos 3), o que me permite saber a posição procurada. Se eu também incluir um -copytsna 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.333333sdo fluxo de origem.

No entanto, este não será o valor -ss, pois -sspode 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 -ssquadro 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.

informação relacionada