直播音频流容器格式

时间:2011-07-17 13:11:39

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

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

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

像icecast这样的流使用HTTP响应中的标题,其中包含了流相关信息,但我想我可以跳过它们并直接处理蒸汽格式。

这是正确的吗? 问候,
斯登

4 个答案:

答案 0 :(得分:3)

Doom9有关于mpeg和aac帧格式的很好的启动信息。 Shoutcast会偶尔添加一些“元数据”,这真的很微不足道。我想与你分享的是这个;我有一个可以捕获各种流的应用程序,并且shoutcast,aac和mp3都在其中。第一个版本根据时间在任意点剪切文件,例如每5分钟,无论mp3 / aac帧如何。这对于mp3来说是好的(文件是可播放的),但对于aacplus来说非常糟糕。

问题是 - aacplus解码器不是对错误数据的原谅,而且我从接入违规到神秘的软件关闭都没有任何错误。

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

mp3 frame header:

aacplus frame header:

也是这样:

答案 1 :(得分:2)

当你看到SHOUTcast / Icecast时,遇到的数据是纯MPEG Layer III音频数据,仅此而已。 (如果您尚未请求元数据。)

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

我也在研究流数据,我发现频繁重复序列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 STeN