当我开始接收现场音频(无线电)流(例如MP3或AAC)时,我认为接收的数据不是原始比特流(即原始编码器输出),但它们总是被包装成某种容器格式。如果这个假设是正确的,那么我想我无法从流的任意位置开始流式传输,但我必须等待一些同步字节。是对的吗?通常有一些同步字节?同步字节后面是否有任何标题,我可以从中猜出所使用的编解码器,通道数,采样率等?
当我连接到实时流时,是否会从最近的同步字节开始接收数据,或者我将从实际位置获取数据,我必须先检查同步字节?
像icecast这样的流使用HTTP响应中的标题,其中包含了流相关信息,但我想我可以跳过它们并直接处理蒸汽格式。
这是正确的吗?
问候,
斯登
答案 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