当我开始接收实时音频(无线电)流(例如MP3或AAC)时,我认为接收到的数据不是一种原始比特流(即原始编码器输出),但它们总是被包装成某种容器格式。如果这个假设是正确的,那么我猜我不能从流的任意位置开始流式传输,但我必须等待一些同步字节。是那么回事吗?通常会有一些同步字节吗?同步字节后面有没有任何报头,我可以从中猜测所使用的编解码器、通道数、采样率等?
当我连接到直播流时,我是从最近的同步字节开始接收数据,还是从实际位置获取数据,并首先检查同步字节?
一些流,如icecast,在HTTP响应中使用报头,其中包含与流相关的信息,但我认为我可以跳过它们,直接处理steam格式。
对吗?
致以敬意,
STeN
发布于 2011-07-18 13:59:53
Doom9有很好的关于mpeg和aac帧格式的起始信息。Shoutcast会时不时地添加一些“元数据”,这真的很简单。我想和大家分享的是:我有一个应用程序,可以捕获所有类型的流,并进行广播,aac和mp3都在其中。最初的版本根据时间在任意点上剪切文件,例如每5分钟一次,而不考虑mp3/aac帧。这在某种程度上对mp3来说还可以(文件是可以播放的),但对aacplus来说就很糟糕了。
问题是- aacplus解码器对错误的数据不是那么宽容,我有从访问违规到神秘的软件关闭的一切,没有任何类型的错误。
无论如何,如果你想捕获流,打开到服务器的套接字,读取响应,你将在那里有一些头,然后使用这些信息来剥离将不时注入的元数据。使用aacplus和mp3的头信息来确定帧边界,并尝试遵守它们并在正确的位置拆分文件。
mp3帧头:
aacplus帧头:
还有这一点:
发布于 2011-07-17 21:24:55
不幸的是,这并不总是那么容易,在这里检查格式和注释:MPEG frame header format
发布于 2011-07-18 03:43:46
当您查看SHOUTcast/Icecast时,出现的数据是纯MPEG Layer III音频数据,仅此而已。(假设您尚未请求元数据。)
它可以在任意位置被剪切,所以你需要同步到流。这通常是通过查找潜在的报头,并使用该报头中的数据来查找连续的报头来完成的。一旦你找到了几个帧头,你就可以放心地假设你已经同步到流,并开始解码以进行回放。
同样,对于这些没有“容器格式”。这只是原始数据。
现在,如果您需要元数据,您必须从服务器请求它。然后,每隔x字节将数据注入到流中。参见http://www.smackfu.com/stuff/programming/shoutcast.html。
https://stackoverflow.com/questions/6723999
复制相似问题