ffmpeg:将 H264@MPEGTS 打包成 Smooth Streaming

ffmpeg:将 H264@MPEGTS 打包成 Smooth Streaming

我有一组(相当大)的文件,它们都是H264在一个码流容器。由于时间限制,我需要将这些内容重新打包成流畅的流媒体,而无需对其进行转码(转码会花费太长时间)。

我一直在尝试弄清楚如何使用 ffmpeg 来实现这一点,因为它似乎有 2 个不同的复用器可以完成这项任务。我尝试了“smoothstreaming”复用器和“ismv”复用器,但使用它们时我都遇到了问题。

ffmpeg -i input.mpg -codec copy -f smoothstreaming ss_out

这样,我收到以下错误:

ffmpeg 版本 N-79695-g675cfb2 版权所有 (c) 2000-2016 FFmpeg 开发人员
  使用 gcc 5.3.1 (Debian 5.3.1-14) 构建 20160409
  配置:
  libavutil 55. 23.100 / 55. 23.100
  libavcodec 57. 38.100 / 57. 38.100
  libavformat 57. 35.100 / 57. 35.100
  libavdevice 57. 0.101 / 57. 0.101
  libavfilter 6. 44.100 / 6. 44.100
  libswscale 4. 1.100 / 4. 1.100
  libswresample 2. 0.101 / 2. 0.101
输入 #0,mpegts,来自‘input.mpg’:
  时长:01:28:41.98,开始:2.040000,比特率:2500 kb/s
  计划 1
    流 #0:0[0x1e1]: 视频:h264 (主) ([27][0][0][0] / 0x001B),yuv420p,720x576 [SAR 16:11 DAR 20:11],25 fps,25 tbr,90k tbn
    流 #0:1[0x1e2](eng): 音频:mp2 ([4][0][0][0] / 0x0004),48000 Hz,立体声,s16p,192 kb/s
[smoothstreaming @ 0x2616340] 使用 AVStream.codec 将编解码器参数传递给多路复用器已被弃用,请改用 AVStream.codecpar。
    最后一条消息重复了 1 次
[smoothstreaming @ 0x2616340] 未为流 0 设置比特率
输出 #0,平滑流,至‘ss_out’:
  元数据:
    编码器:Lavf57.35.100
    流 #0:0:视频:h264 ([33][0][0][0] / 0x0021),yuv420p,720x576 [SAR 16:11 DAR 20:11],q=2-31,25 fps,25 tbr,50 tbn
    流 #0:1(eng):音频:mp2 (i[0][0][0] / 0x0069),48000 Hz,立体声,192 kb/s
流映射:
  流 #0:0 -> #0:0 (复制)
  流 #0:1 -> #0:1 (复制)
无法为输出文件 #0 写入标题(编解码器参数不正确?):参数无效

我尝试的另一件事是使用 ffmpeg 将其打包成 ismv:

ffmpeg -i input.mpg -c copy -movflags isml+frag_keyframe -f ismv ss_out.ismv

到目前为止,一切都正常,但是我需要 ismindex 工具来创建清单文件,但却失败了:

ismindex -n ss_out ss_out.ismv

Unable to read the MFRA atom in ss_out.ismv (mfra size mismatch)

是我做错了什么,还是我的输入文件有问题?

答案1

因此,我认为我的问题有两个可能的解决方案,两个都可以实现,但是最终结果却不同。

ISMV 多路复用器 + ismindex

我需要的是一组服务器端文件(.ism、.ismc、.ismv)。为了实现这一点,我最终做了以下两件事:

ffmpeg -i input.mpg -c:v copy -c:a aac -b:a 192k -movflags frag_keyframe -f ismv ss_out.ismv

上述命令复制视频流而不对其进行转码,将音频转码为 AAC(尽管 ffmpeg 和 ismindex 似乎都不介意 MP2 音频)并将其打包为 .ismv。

ismindex -n ss_out ss_out.ismv

然后 ismindex 工具可以创建我需要的 .ism 和 .ismc 文件。

我从中获取的文件可以通过带有媒体服务的 IIS 进行流式传输。

平滑流复用器

最后,我还让“smoothstreaming”复用器开始工作,诀窍在于它也需要一个 .ismv 文件作为输入。因此,我首先运行与上述相同的 ffmpeg 命令,然后可以再次使用 ffmpeg 将其与“smoothstreaming”复用器重新打包。

不过,我对此解决方案的问题是,它会导致传统网络服务器需要一些文件才能流畅地进行流式传输。因此,它将视频片段拆分,并将元数据按块进行分配。这些通常都由流式传输服务器处理。

相关内容