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()