19

我想在使用 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

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

在此处输入图像描述

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

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

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

4

2 回答 2

2

这是不可能的。编解码器依靠封装容器进行成帧,这意味着用信号通知帧的开始和长度。

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

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

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

于 2013-12-17T18:44:33.153 回答
1

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

于 2014-10-17T21:45:46.103 回答