使用 FFmpeg 为 Helix Server 剪切多比特率 MP4 文件

使用 FFmpeg 为 Helix Server 剪切多比特率 MP4 文件

我们使用 Helix Server 来向观众分发视频点播(多比特率)内容。这意味着有一个 MP4 文件包含多个视频流和一个音频流。我们的 MP4 文件的来源是 Helix Producer(将原始视频编码为 MP4 文件)。

如果我们直接从 Helix Producer 使用 MP4 文件,Helix Server 确实会识别文件内的多个不同视频流。FFprobe 输出:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '..\..\validate\20140225095504.mp4':
  Metadata:
    major_brand     : 3gr6
    minor_version   : 0
    compatible_brands: 3gr63gp63gg63gp5isom
    creation_time   : 2014-02-25 08:55:04
  Duration: 01:35:54.14, start: 0.000000, bitrate: 1051 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 568x320, 285 kb/s, 23.80 fps, 25 tbr, 1k tbn, 50 tbc (default)
    Metadata:
      handler_name    : Video Stream
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 47 kb/s (default)
    Metadata:
      handler_name    : Audio Stream
    Stream #0:2(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 568x320, 653 kb/s, 23.80 fps, 25 tbr, 1k tbn, 50 tbc (default)
    Metadata:
      handler_name    : Video Stream
    Stream #0:3(und): Data: none (rtp  / 0x20707472), 17 kb/s (default)
    Metadata:
      handler_name    : Video Stream
    Stream #0:4(und): Data: none (rtp  / 0x20707472), 8 kb/s (default)
    Metadata:
      handler_name    : Audio Stream
    Stream #0:5(und): Data: none (rtp  / 0x20707472), 31 kb/s (default)
    Metadata:
      handler_name    : Video Stream
Unsupported codec with id 0 for input stream 3
Unsupported codec with id 0 for input stream 4
Unsupported codec with id 0 for input stream 5

但是,我们需要剪切文件 - 我们使用 FFmpeg 来保留多个视频流:

ffmpeg.exe -i ..\..\validate\20140225095504.mp4 -map 0:0 -map 0:1 -map 0:2 -acodec copy -vcodec copy -ss 00:30:00 -t 00:03:00 -movflags faststart+rtphint out.mp4

这就是问题开始的地方。Helix Server 不再识别不同的视频流,只向客户端提供第一个视频流。FFprobe 告诉我有关新文件的以下信息:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'out.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf55.34.101
  Duration: 00:03:00.00, start: 0.000000, bitrate: 2096 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 568x320, 286 kb/s, 23.87 fps, 25 tbr, 16k tbn, 50 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 47 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
    Stream #0:2(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 568x320, 655 kb/s, 23.87 fps, 25 tbr, 16k tbn, 50 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:3(eng): Data: none (rtp  / 0x20707472), 335 kb/s
    Metadata:
      handler_name    : HintHandler
    Stream #0:4(eng): Data: none (rtp  / 0x20707472), 3 kb/s
    Metadata:
      handler_name    : HintHandler
    Stream #0:5(eng): Data: none (rtp  / 0x20707472), 762 kb/s
    Metadata:
      handler_name    : HintHandler
Unsupported codec with id 0 for input stream 3
Unsupported codec with id 0 for input stream 4
Unsupported codec with id 0 for input stream 5

我已经尝试了相当多的 -movflags 选项和 -rtpflag 选项的组合。但都无济于事。

截屏

我还尝试使用 mp4box 设置 major_brand:

mp4box -brand 3gr6 out.mp4

并使用 mp4box 创建提示轨道:

mp4box -hint out.mp4

但我陷入困境。

有人将 Helix Server 与多比特率 MP4 文件结合使用过吗?或者还有其他方法可以剪切和连接 MP4 文件吗?

答案1

您仅绘制了前 3 条轨道。

ffmpeg.exe -i ..\..\validate\20140225095504.mp4 -map 0:0 -map 0:1 -map 0:2 ...

正常情况下它应该可以工作,但是您是否尝试过映射所有 5 条轨道?

我还注意到输出文件中的元数据已经改变。

Original: handler_name    : Video Stream
Output:   handler_name    : VideoHandler

音轨也一样。尽量-map_metadata像在原始文件中一样使用和设置它们。

相关内容