FFprobe - возможно ли получить "искомую позицию" видеопотока, не перекодируя его?

У меня есть следующая команда:

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

При копировании видеопотока вместо перекодирования я не могу получить какую-либо полезную информацию из ffprobe это говорит мне искомую позицию видео потока.

Я попытался собрать информацию о полном потоке:

ffprobe -of json -show_streams -show_format output.mp4

Но start_time является 0 и продолжительность не зависит. Я также попытался собрать информацию о первом кадре видеопотока:

ffprobe -of json -select_streams v -show_frames output.mp4

По-прежнему нет полезной информации.

Тем не менее, когда я перекодировать видео поток (удалив -c:v copy из команды), я получаю информацию, которую я хочу. Длительность видеопотока изменяется -ss вариант. Например, если продолжительность видео 5, то ffprobe вернул бы длительность 2 (5 минус 3), что позволяет мне узнать искомую позицию. Если я также добавлю -copyts затем я могу получить полезную информацию, проверив информацию о первом кадре.

Как я могу получить искомую позицию без необходимости перекодировать видео поток? Ура!

0 ответов

Если у вас есть доступ к исходному файлу, и вы использовали

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

затем следуйте этому методу.

1) Получить длительность исходного видео потока

ffprobe source.mp4 -show_entries stream=duration -select_streams v -of compact=p=0 -v 0

Выход, например

duration=229.033333

2) Получить длительность и первый PTS результирующего видеопотока

ffprobe output.mp4 -show_entries packet=pts_time:stream=duration -select_streams v -read_intervals 0%+#1 -of compact=p=0 -v 0

Выход, например

pts_time=0.066667
duration=220.700000

Итак, первый кадр в результате 229.033333 - 220.700000 знак равно 8.333333s исходного потока.

Однако это не будет значением -ss, так как -ss может не указывать на ключевой кадр.

3) Итак, получаем длительность и PTS первого аудиопакета. ffmpeg продлит длительность синхронизации аудио с указанным -ss Рамка.

ffprobe output.mp4 -show_entries packet=pts_time,duration_time -select_streams a -read_intervals 0%+#1 -of compact=p=0 -v 0

Выход, например

pts_time=0.000000|duration_time=2.733333

Так, 8.333333s + 2.733333 - 0.000000 - 0.066667 знак равно 11.000000s это искомый кадр.

Другие вопросы по тегам