微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ffmpeg-python 提取特定视频流,更改其 FPS 并将其嵌入视频中

如何解决ffmpeg-python 提取特定视频流,更改其 FPS 并将其嵌入视频中

我有一个包含多个流的视频。一些数据和一个视频。

我需要提取视频流,更改帧速率,将其嵌入视频中(或将所有流合并回输出文件

如果需要,这是现有流的列表:

我只需要将流 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),30019 kb/s,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),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,然后将其、任何音频和数据流复制到名为 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()

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),bt2020nc/bt2020/smpte2084,progressive),5 fps,5 tbr,10 tbc
Stream #0:1[0x101](eng): Audio: aac (LC) ([15][0][0][0] / 0x000F),258 kb/s
Stream #0:2[0x102]: Data: bin_data ([6][0][0][0] / 0x0006)

如果您没有音频,请省略 my_video.audio 命令中的 acodecffmpeg.output 选项

    ffmpeg.output(video,vcodec="libx264").run()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。