2011-07-17 42 views
1

當我開始接收現場音頻(無線電)流(例如MP3或AAC)時,我認爲接收的數據不是原始比特流的種類(即原始編碼器輸出),但它們總是被包裹到一些容器格式。如果這個假設是正確的,那麼我想我無法從流的任意位置開始流式傳輸,但我必須等待一些同步字節。是對的嗎?通常有一些同步字節?在同步字節後面是否有任何標題,我可以從中猜出使用的編解碼器,通道數量,採樣率等?現場音頻流媒體容器格式

當我連接到實時流時,我是否會收到以最近的同步字節開始的數據,或者我會從實際位置獲取它們,並且必須先檢查同步字節?

有些流如icecast在HTTP響應中使用標題,其中包含流相關信息,但我想我可以跳過它們直接處理蒸汽格式。

這是正確的嗎?
問候,
斯登

回答

1

遺憾的是它並不總是那麼容易,檢查格式,並注意到在這裏: MPEG frame header format

+0

酷!我最終發現了一個錯誤 - 我已經捕獲了數據,找到了幀頭,並與我的流信息進行了比較,並且採樣率存在差異...您是否知道AAC是否有類似的格式,或者它們都使用一樣? – STeN

2

當你看Shoutcast一樣/的Icecast,即遇到純粹的MPEG Layer III音頻數據數據等等。 (假設你還沒有請求元數據)。

可以被剪切在任意位置,所以你需要同步到流中。這通常是通過查找潛在的標題並使用該標題中的數據來查找順序標題來完成的。一旦找到了幾個幀頭,就可以安全地假定你已經同步到了流並開始解碼播放。

同樣,這裏沒有「容器格式」。這只是原始數據。

現在,如果你想要元數據,你必須從服務器請求它。然後將數據每隔x字節注入流中。見http://www.smackfu.com/stuff/programming/shoutcast.html

+0

感謝您的回答,我知道SHOUTcast元數據插入,但這是我想避免的。無論如何,你說這些都是原始數據,但看看'yi_H'建議的鏈接,我發現編碼後的數據被分成幾個幀,即整個流是從幀構建的,而它們有自己的頭部和音頻信息 - 這就是正是我所期待的。但我不知道(對不起,缺乏知識),如果這種格式是相同的MP3和AAC流... – STeN

+0

我想也想知道'MPEG-4部分14'如何適用於此(http:///en.wikipedia.org/wiki/MPEG-4_Part_14)。不好意思問,但是第一步很難... – STeN

0

我會繼續討論BYU回答我自己(甚至我們不鼓勵這樣做):

我也尋找到流數據,我發現,頻繁的序列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 斯登

+0

根據你使用的DSP,你甚至可以餵它垃圾,它會播放什麼可播放和丟棄其餘的。 –

+0

是的 - 我也認爲這取決於硬件/驅動程序。目前,如果我根本不關心MP3/AAC流,那麼在直播流開始播放之前,我總是有1-2秒(較高的比特率和較長的AAC,然後是MP3)的隨機聲音。我認爲切割流直到MPEG同步頭可能有幫助...但是'MPEG幀頭'我正在描述我正在尋找的幀還是還有別的東西? MP3和AAC流是否相同?我也捕獲了AAC流,並試圖分析,但我不確定它是否使用與MP3相同的格式。 – STeN

+0

當您去除元數據時,您只需要知道Mpeg幀頭。 AAC和MP3是完全不同的東西。 –

3

Doom9大約有MPEG和AAC幀格式大的起動信息。 Shoutcast會不時添加一些'元數據',這實在是微不足道的。我想與你分享的是這個;我有一個應用程序可以捕捉所有類型的流,並且shoutcast,aac和mp3都在其中。不管mp3/aac幀如何,第一個版本都會根據時間在任意點切割文件,例如每5分鐘一次。對於mp3(這些文件是可播放的)它有點不錯,但對於aacplus來說非常糟糕。

事情是 - aacplus解碼器不是那種對錯誤數據的寬容,而且我擁有從訪問違規到神祕軟件關機的所有內容,沒有任何錯誤。

無論如何,如果你想捕獲流,打開服務器的套接字,讀取響應,你將有一些標題,然後使用該信息去掉現在和之後注入的元數據。使用aacplus和mp3的標題信息來確定幀邊界,並嘗試對它們進行兌現並將文件分割到正確的位置。

MP3幀報頭:

aacPlus的幀頭:

也這樣:

+0

嗨,如果你可以分享一些更多的鏈接/信息,我應該看看什麼時候分析aacplus和mp3來確定幀邊界,我將高度讚賞。 Thanks1 – STeN

+0

任意拆分MP3文件通常是可行的,因爲每個MP3幀都是獨立的,並且包含一個單獨的頭文件。這就是爲什麼你可以將幾個mp3文件組合在一起(例如用貓),結果就會播放。 MP3最初是爲衛星廣播流媒體而設計的。後來的格式如AAC和其他格式不夠健壯,它們在文件的開頭包含一個單一的標題 – PkP