如何更改我的 FFMPEG 命令以使我的 HTTP Live Streams 更高效?

Posted

技术标签:

【中文标题】如何更改我的 FFMPEG 命令以使我的 HTTP Live Streams 更高效?【英文标题】:How do I alter my FFMPEG command to make my HTTP Live Streams more efficient? 【发布时间】:2013-03-17 16:48:14 【问题描述】:

我想在使用 FFMPEG 创建 .ts 文件时减少复用开销。

我正在使用FFMPEG 创建一系列用于HTTP live streaming 的transport stream 文件。

./ffmpeg -i myInputFile.ismv \
         -vcodec copy \
         -acodec copy \
         -bsf h264_mp4toannexb \
         -map 0 \
         -f segment \
         -segment_time 10\
         -segment_list_size 999999 \
         -segment_list output/myVarientPlaylist.m3u8 \
         -segment_format mpegts \
         output/myAudioVideoFile-%04d.ts

我的输入是 ismv 格式并包含视频和音频流:

Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 320x240, 348 kb/s, 29.97 tbr, 10000k tbn, 59.94 tbc
Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 63 kb/s

有一个与muxing 相关的问题导致大量开销被添加到流中。这就是我向我描述音频问题的方式:

因此对于给定的 aac 流,开销将是 88%(因为 200 字节将映射到 2 x 188 字节数据包)。

对于视频,iframe 数据包非常大,因此它们可以很好地转换为 .ts 数据包,但是,差异可以像音频数据包一样小,因此它们会遇到同样的问题。

解决方案是将多个 aac 数据包组合成一个更大的流,然后再将它们打包成 .ts。 FFMPEG 是否可以开箱即用?

【问题讨论】:

似乎 FFMPEG 中存在一些错误。一位同事在源代码中手动修复了该问题,这显着减少了复用开销(Apple 的 mediastreamsegmenter 工具仍然更好)。 我有一个类似的问题,我在 ffmpeg 数据库ffmpeg.org/trac/ffmpeg/ticket/2857 中打开了一个错误,你可以投票。我也在考虑在这个问题上提供赏金 如果您的流只是音频,则不需要将其复用到 mpeg ts 流中。您可以将其保留在 aac 中,它仍然可以与 HLS 一起使用。 喜欢这个图表,你用什么工具来创建它的? @fishfood - 在 Mac 上预览 - 我截取了一个白色区域并在顶部绘制了文本和矩形。技术含量很低:) 【参考方案1】:

不可能。编解码器依赖于封装容器进行成帧,这意味着发出帧的开始和长度的信号。

您的图形实际上遗漏了一个元素,即 PES 数据包。您的音频帧将首先被放入一个 PES 数据包(这表明它的长度),然后 PES 数据包将被切割成更小的块,这些块将成为 TS 数据包。

根据设计,您不能在已包含数据的 TS 数据包中启动新的 PES 数据包(在您的情况下包含音频帧)。一个新的 PES 包总是在一个新的 TS 包中开始。否则就不可能开始播放中流(广播位置)——不可能知道新 PES 从 TS 中的哪个字节开始(记住你错过了当前 PES 的开头)。

有一些缓解因素,FF FF FF 填充可能会被网络硬件压缩。此外,如果您使用的是 HTTP(而不是 UDP 或 RDP),则可以启用 gzip 压缩(但我怀疑它会有多大帮助)。

【讨论】:

【参考方案2】:

我已经修复了http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=75c8d7c2b4972f6ba2cef605949f57322f7c0361 中每个帧上同步 TS 输出的最严重问题 - 请尝试之后的版本。

【讨论】:

以上是关于如何更改我的 FFMPEG 命令以使我的 HTTP Live Streams 更高效?的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的网页中垂直排列水平排列的部分,以使我的页面在设备上响应

如何让我的 CSS @media 代码在移动设备上运行以使我的网站具有响应性?

(discord.py) 如何使我的 setprefix 命令正常工作?

如果我调用 Factory.build 以使我的控制器测试快速,如何让 Factory Girl 永远不会访问数据库?

如何检测 IOS 7 和 IOS 8 以及宽屏 iPhone 尺寸以使我的应用程序通用?

如何更改我的 C++ 代码以使其在 C 中可用?