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

标签 audio video ffmpeg http-live-streaming transport-stream

我想减少使用 FFMPEG 创建 .ts 文件时的混合开销。

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

./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 相关的问题这导致大量开销被添加到流中。这是向我描述音频问题的方式:

enter image description here

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

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

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

最佳答案

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

您的图形实际上缺少一个元素,即 PES 数据包。您的音频帧将首先放入 PES 数据包(指示其长度),然后 PES 数据包将被切割成更小的 block ,即 TS 数据包。

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

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

关于audio - 如何更改我的 FFMPEG 命令以使我的 HTTP Live Streams 更高效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15661664/

相关文章:

matlab - 按频率选择样本的一部分

c# - 可以正确读取WAV文件的数据

image - ffmpeg 图像到视频脚本有人吗?

android - FFMPEG 图像到视频 - 命令中出现 'file not found' 错误 - 我确信这很明显

audio - 使用 ffmpeg 将 MP3 文件拆分为多个相同长度的文件

php - 如何使用PHP从WAV和FLAC文件中获取音频信息?

android - Android上的Chrome在拒绝来电后切换音频输出

javascript - 访问网络摄像头视频流的像素 (JS/WebRTC/MediaStreamTrack)

javascript - 类型属性视频标签

c++ - ffmpeg 调试