У меня есть следующая команда:
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
— искомый кадр.