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