ffmpeg-python извлекает определенный видеопоток, изменяет его FPS и вставляет его обратно в видео

У меня есть видео, содержащее несколько потоков. Несколько данных и одно видео.

Мне нужно извлечь видеопоток, изменить частоту кадров, вставить его обратно в видео (или объединить весь поток обратно в выходной файл)

1 ответ

К счастью, это довольно просто при работе с одним видеопотоком. Проблема связана с ffmpeg-python и потоки данных, но достаточно просто для понимания.

Файл, который я использовал в качестве примера, содержит видео, аудио и поток данных:

      Stream #0:0[0x100]: Video: hevc (Main 10) (HEVC / 0x43564548), yuv420p10le(tv, bt2020nc/bt2020/smpte2084), 1920x1080, 30 tbr, 90k tbn, 90k tbc
Stream #0:1[0x101](eng): Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 258 kb/s
Stream #0:2[0x102]: Data: bin_data ([6][0][0][0] / 0x0006)

Этот ffmpeg-pyton команда возьмет этот видеофайл input.ts, преобразуйте его из 30 кадров в секунду в 5 кадров в секунду, а затем скопируйте его вместе с любым аудио и потоками данных в новый файл с именем converted.ts.

      import ffmpeg

my_file = ffmpeg.input("input.ts")
video = my_file.video.filter("fps", 5)
ffmpeg.output(video, my_file.audio, my_file["d"], "converted.ts", vcodec="libx264", acodec="copy").run()

Команда - это то место, где должны быть предоставлены все потоки. В этом случае мы предоставляем видеопоток с примененным фильтром, все аудиопотоки my_file.audio и все потоки данных my_file["d"] (он же -map 0:d в ffmpeg).

Затем на выходе будет новый видеопоток, а звук и данные будут скопированы.

      Stream #0:0[0x100]: Video: h264 (High 10) ([27][0][0][0] / 0x001B), yuv420p10le(tv, bt2020nc/bt2020/smpte2084, progressive), 1920x1080, 5 fps, 5 tbr, 90k tbn, 10 tbc
Stream #0:1[0x101](eng): Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 258 kb/s
Stream #0:2[0x102]: Data: bin_data ([6][0][0][0] / 0x0006)

Если у вас нет звука, опустите my_video.audio и acodec варианты из ffmpeg.output команда

          ffmpeg.output(video, my_file["d"], "converted.ts", vcodec="libx264").run()
Другие вопросы по тегам