【问题标题】:Live audio streaming container formats实时音频流容器格式
【发布时间】:2011-10-07 03:06:43
【问题描述】:

当我开始接收实时音频(无线电)流(例如 MP3 或 AAC)时,我认为接收到的数据不是原始比特流(即原始编码器输出),但它们总是被包装成某种容器格式。如果这个假设是正确的,那么我想我无法从流的任意位置开始流式传输,但我必须等待某个同步字节。那正确吗?通常有一些同步字节吗?同步字节后面是否有任何标题,我可以从中猜测使用的编解码器、通道数、采样率等?

当我连接到直播时,我会从最近的同步字节开始接收数据,还是从实际位置获取数据,我必须先检查同步字节?

像icecast这样的一些流在HTTP响应中使用标头,其中包含流相关信息,但我认为我可以跳过它们并直接处理steam格式。

对吗?
问候,
不锈钢

【问题讨论】:

    标签: audio mp3 audio-streaming live-streaming icecast


    【解决方案1】:

    Doom9 有关于 mpeg 和 aac 帧格式的很好的起始信息。 Shoutcast 会时不时地添加一些“元数据”,这真的很简单。我想和你分享的是这个;我有一个可以捕获各种流的应用程序,并且其中包括 aac 和 mp3 的广播。第一个版本根据时间在任意点剪切文件,例如每 5 分钟一次,无论 mp3/aac 帧如何。对 mp3 来说还可以(文件可以播放),但对 aacplus 来说就很糟糕了。

    问题是 - aacplus 解码器不能容忍错误的数据,而且我拥有从访问违规到神秘的软件关闭的一切,没有任何错误。

    无论如何,如果你想捕获流,打开到服务器的套接字,读取响应,你会有一些标题,然后使用该信息来剥离将不时注入的元数据。使用 aacplus 和 mp3 的标头信息来确定帧边界,并尝试尊重它们并在正确的位置拆分文件。

    mp3帧头:

    aacplus 帧头:

    还有这个:

    【讨论】:

    • 嗨,如果您可以分享更多链接/信息,了解在分析 aacplus 和 mp3 以确定帧边界时我应该查看的确切标题信息,我将非常感激。谢谢1
    • 任意分割 MP3 文件通常是可行的,因为每个 MP3 帧都是自包含的,并且包含一个单独的标题。这就是为什么您可以例如将多个 mp3 文件组合在一起(例如使用 cat)并播放结果。 MP3 最初是为卫星广播流设计的。后来的格式(例如 AAC 和其他格式)不是那么健壮,它们在文件开头包含单个标题
    【解决方案2】:

    我将通过回答自己来继续讨论(即使我们不鼓励这样做):

    我也在研究流数据,发现经常重复序列 ff f3 82 70 - 我建议这是 MPEG 帧头,所以我试着看看这意味着什么:

    ff f3 82 70 (hex) = 11111111 11110011 10000010 01110000 (bin)
    
    Analysis
    11111111111 | SYNC
    10          | MPEG version 2
    01          | Layer III
    1           | No CRC
    1000        | 64 kbps
    00          | 22050Hz
    1           | Padding
    0           | Private 
    01          | Joint stereo
    11          | ...
    

    有什么相关的吗?

    当开始接收流数据时,我是否应该在将缓冲区提供给处理 DSP 的类之前丢弃此标头之前的所有数据?我知道这可能是特定于实现的,但我想知道这里的程序一般是什么......

    BR 斯滕

    【讨论】:

    • 根据您使用的 DSP,您甚至可以将垃圾喂给它,它会播放可播放的内容并丢弃其余部分。
    • 是的 - 我也认为这取决于硬件/驱动程序。目前,如果我根本不关心 MP3/AAC 流,在开始播放实时流之前,我总是有 1-2 秒的随机声音(在更高的比特率上更长,而 AAC 则比 MP3 更糟)。我认为在 MPEG 同步标头出现之前剪切流可能会有所帮助...但是我正在描述我正在寻找的帧的“MPEG 帧标头”还是其他内容? MP3 和 AAC 流是否相同?我也捕获了AAC流并尝试分析,但我不确定它是否使用与MP3相同的格式。
    • Mpeg 帧头是您在去除元数据时需要知道的全部内容。 aac 和 mp3 是完全不同的东西。
    【解决方案3】:

    当您查看 SHOUTcast/Icecast 时,遇到的数据是纯 MPEG Layer III 音频数据,仅此而已。 (前提是您没有请求元数据。)

    可以在任意位置剪切,所以你需要同步到流。这通常是通过查找潜在的标头并使用该标头中的数据来查找顺序标头来完成的。找到一些帧头后,您可以放心地假设您已同步到流并开始解码以进行播放。

    同样,这些没有“容器格式”。这只是原始数据。

    现在,如果您需要元数据,您必须从服务器请求它。然后每隔x 个字节将数据注入到流中。见http://www.smackfu.com/stuff/programming/shoutcast.html

    【讨论】:

    • 感谢您的回答,我知道 SHOUTcast 元数据插入,但我想避免这种情况。无论如何,您说这些是原始数据,但是查看“yi_H”建议的链接,我发现编码数据分为帧,即整个流是由帧构成的,而它们有自己的标头和音频信息-那就是正是我想要的。但我不知道(抱歉,缺乏知识)这种格式对于 MP3 和 AAC 流是否相同......
    • 我还想知道“MPEG-4 第 14 部分”如何适应这一点 (en.wikipedia.org/wiki/MPEG-4_Part_14)。很抱歉问这个问题,但第一步很难......
    【解决方案4】:

    不幸的是,这并不总是那么容易,请在此处查看格式和注释: MPEG frame header format

    【讨论】:

    • 酷!我终于发现了一个错误 - 我已经捕获了数据,找到了帧头并与我拥有的流信息进行了比较,并且采样率存在差异......你知道AAC是否有类似的格式或者它们都使用一样吗?
    猜你喜欢
    • 2012-04-03
    • 2016-10-13
    • 2016-05-12
    • 1970-01-01
    • 2020-03-22
    • 2014-05-29
    • 2015-03-23
    • 1970-01-01
    • 2021-10-20
    相关资源
    最近更新 更多