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

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микс, то я могу получить полезную информацию, проверив информацию первого кадра.

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

решение1

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

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— искомый кадр.

Связанный контент