ffmpeg-python 提取特定视频流,更改其 FPS 并将其嵌入回视频中
ffmpeg-python extract a specific video stream, change its FPS and embed it back in the video
我有一个包含多个流的视频。一些数据和一个视频。
我需要提取视频流,更改帧速率,将其嵌入回视频中(或将所有流组合回输出文件)
如果需要,这是现有流的列表:
我只需要将流 0 和 5(两个视频流)转换为 2 FPS。流 3 是 gpmd,我需要保留一些不相关的数据格式。
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\temp\video.360':
Metadata:
major_brand : mp41
minor_version : 538120216
compatible_brands: mp41
creation_time : 2020-09-08 16:35:49
Duration: 00:00:28.13, start: 0.000000, bitrate: 66559 kb/s
Stream #0:0(eng): Video: hevc (Main) (hvc1 / 0x31637668), yuvj420p(pc, bt709), 4096x1344 [SAR 1:1 DAR 64:21], 30036 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 29.97 tbc (default)
Metadata:
creation_time : 2020-09-08 16:35:49
handler_name : GoPro H.265
encoder : GoPro H.265 encoder
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 189 kb/s (default)
Metadata:
creation_time : 2020-09-08 16:35:49
handler_name : GoPro AAC
Stream #0:2(eng): Data: none (tmcd / 0x64636D74), 0 kb/s (default)
Metadata:
creation_time : 2020-09-08 16:35:49
handler_name : GoPro TCD
Stream #0:3(eng): Data: none (gpmd / 0x646D7067), 96 kb/s (default)
Metadata:
creation_time : 2020-09-08 16:35:49
handler_name : GoPro MET
Stream #0:4(eng): Data: none (fdsc / 0x63736466), 20 kb/s (default)
Metadata:
creation_time : 2020-09-08 16:35:49
handler_name : GoPro SOS
Stream #0:5(eng): Video: hevc (Main) (hvc1 / 0x31637668), yuvj420p(pc, bt709), 4096x1344 [SAR 1:1 DAR 64:21], 30019 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 29.97 tbc (default)
Metadata:
creation_time : 2020-09-08 16:35:49
handler_name : GoPro H.265
encoder : GoPro H.265 encoder
Side data:
displaymatrix: rotation of nan degrees
Stream #0:6(eng): Audio: pcm_s32be (in32 / 0x32336E69), 48000 Hz, 4 channels, s32, 6144 kb/s (default)
Metadata:
creation_time : 2020-09-08 16:35:49
handler_name : GoPro AMB
幸运的是,处理单个视频流时它非常简单。 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
,将其从 30fps 转换为 5fps,然后将其、任何音频和数据流复制到名为 [=17= 的新文件中].
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()
ffmpeg.output
命令是必须提供所有流的地方。在这种情况下,我们提供应用了过滤器的视频流、所有音频流 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)
如果您没有音频,请省略 ffmpeg.output
命令中的 my_video.audio
和 acodec
选项
ffmpeg.output(video, my_file["d"], "converted.ts", vcodec="libx264").run()
我有一个包含多个流的视频。一些数据和一个视频。
我需要提取视频流,更改帧速率,将其嵌入回视频中(或将所有流组合回输出文件)
如果需要,这是现有流的列表:
我只需要将流 0 和 5(两个视频流)转换为 2 FPS。流 3 是 gpmd,我需要保留一些不相关的数据格式。
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\temp\video.360':
Metadata:
major_brand : mp41
minor_version : 538120216
compatible_brands: mp41
creation_time : 2020-09-08 16:35:49
Duration: 00:00:28.13, start: 0.000000, bitrate: 66559 kb/s
Stream #0:0(eng): Video: hevc (Main) (hvc1 / 0x31637668), yuvj420p(pc, bt709), 4096x1344 [SAR 1:1 DAR 64:21], 30036 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 29.97 tbc (default)
Metadata:
creation_time : 2020-09-08 16:35:49
handler_name : GoPro H.265
encoder : GoPro H.265 encoder
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 189 kb/s (default)
Metadata:
creation_time : 2020-09-08 16:35:49
handler_name : GoPro AAC
Stream #0:2(eng): Data: none (tmcd / 0x64636D74), 0 kb/s (default)
Metadata:
creation_time : 2020-09-08 16:35:49
handler_name : GoPro TCD
Stream #0:3(eng): Data: none (gpmd / 0x646D7067), 96 kb/s (default)
Metadata:
creation_time : 2020-09-08 16:35:49
handler_name : GoPro MET
Stream #0:4(eng): Data: none (fdsc / 0x63736466), 20 kb/s (default)
Metadata:
creation_time : 2020-09-08 16:35:49
handler_name : GoPro SOS
Stream #0:5(eng): Video: hevc (Main) (hvc1 / 0x31637668), yuvj420p(pc, bt709), 4096x1344 [SAR 1:1 DAR 64:21], 30019 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 29.97 tbc (default)
Metadata:
creation_time : 2020-09-08 16:35:49
handler_name : GoPro H.265
encoder : GoPro H.265 encoder
Side data:
displaymatrix: rotation of nan degrees
Stream #0:6(eng): Audio: pcm_s32be (in32 / 0x32336E69), 48000 Hz, 4 channels, s32, 6144 kb/s (default)
Metadata:
creation_time : 2020-09-08 16:35:49
handler_name : GoPro AMB
幸运的是,处理单个视频流时它非常简单。 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
,将其从 30fps 转换为 5fps,然后将其、任何音频和数据流复制到名为 [=17= 的新文件中].
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()
ffmpeg.output
命令是必须提供所有流的地方。在这种情况下,我们提供应用了过滤器的视频流、所有音频流 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)
如果您没有音频,请省略 ffmpeg.output
命令中的 my_video.audio
和 acodec
选项
ffmpeg.output(video, my_file["d"], "converted.ts", vcodec="libx264").run()