如何修改我的FFMPEG命令以使我的HTTP直播流更高效?

20

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

我正在使用FFMPEG创建一系列用于传输流的文件,用于HTTP直播流

./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

涉及复用的问题导致大量的开销添加到流中。 对于音频,如下图所示:

enter image description here

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

对于视频,I帧包相当大,因此它们可以很好地转换为.ts数据包,但是差异可能与音频包一样小,因此它们会遇到同样的问题。

解决方案是在将其打包成.ts之前将几个aac包组合成一个较大的流。使用FFMPEG是否可以直接实现?


似乎FFMPEG中存在一些错误。一位同事手动修复了源代码中的问题,这显著降低了多路复用的开销(不过,Apple的“mediastreamsegmenter”工具仍然更好)。 - Robert
我有一个类似的问题,我已经在FFmpeg数据库中开了一个错误报告 https://ffmpeg.org/trac/ffmpeg/ticket/2857 ,你可以点赞。我也考虑对这个问题提供赏金。 - Aviad Rozenhek
如果您的流只是音频,则无需将其混合到mpeg ts流中。您可以将其保留为aac格式,它仍然可以与HLS一起使用。 - Robert
喜欢这个图表,你用什么工具创建的? - fishfood
@fishfood - 在Mac上预览 - 我截屏了一个白色区域,并在其上绘制了文本和矩形。非常低技术 :) - Robert
2个回答

2
这是不可能的。编解码器依赖封装容器进行分帧,这意味着要发出开始和帧长度的信号。
你的图形实际上缺少一个元素,即PES数据包。你的音频帧将首先被放入一个PES数据包中(它指示了其长度),然后将把PES数据包切成较小的块,这些块将成为TS数据包。
按设计,您不能在已经包含数据的TS数据包中启动新的PES数据包(在您的情况下包含音频帧)。新的PES数据包将始终从新的TS数据包开始。否则就无法在中途开始播放(广播场景)- 无法知道新PES从TS的哪个字节开始(请记住,您已错过了当前PES的开头)。
有一些缓解因素,FF FF FF填充可能会被网络硬件压缩。此外,如果您使用HTTP(而不是UDP或RDP),可以启用gzip压缩(但我怀疑它不会有太大帮助)。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接