(1st week)RTMP中的speex音頻流與RTP的對接


    之前寫過一篇《RTMP中FLV流到標准h264、acc的轉換》,鏈接地址

http://www.cnblogs.com/chef/archive/2012/07/18/2597279.html

。着重分析了RTMP協議中h264的抽取。

    帶音視頻交互的flash項目中,音頻編碼只能選擇speex格式。

    這篇文章分為三部分。分別為flex中提供的音頻接口、RTMP中的speex數據、如何轉換為RTP流。

 

一、flex中提供的音頻接口

    用flex編寫客戶端,它提供的接口是封裝過的,與speex標准編解碼器之間的調用實際上相當於一個黑盒,它們之間的差異需要我們分析。

    麥克風音頻的接口由類Mircophone提供,大多都有中文注釋,我就不一一贅述了,只挑出其中一些做自己的講解。

codec

編碼格式,只支持Nellymoser、speex兩種格式,

Nellymoser多用於游戲開發,而且商業使用限制較多

rate

設置采樣頻率,注意是麥克風采樣率,而編碼采樣率

framesPerPacket

一個音頻包中包含的音頻幀數量(后文會有更詳細的說明)

encodeQuality

編碼質量,在同等編碼采樣率下,質量越高,效果越好,

每幀所包含的數據越多。當該值也確定下來時,

每幀數據的字節大小也就確定

enableVAD

是否開啟Voice Activation Detection。它的作用自己google。

當開啟時,靜音狀態下speex編碼器將持續編碼10字節大小的音頻幀

 

    speex編碼有三種模式

模式 編碼采樣率

一幀數據

所表示的時間

編碼一幀需要的

sample數量

narrow band(窄帶) 8khz 20ms 160
wide band(寬帶) 16khz 20ms 320
ultra-wide band(超寬帶) 32khz 20ms 640

 

二、RTMP中的speex數據

    每個音頻包(相當於FLV中的audiotag)中,第一個字節的前四位表示編碼格式,等於11說明為speex編碼。后4個字節分別表示編碼采樣率、單聲道or立體聲、每個sample大小8位or16位。但采用speex編碼時,它們是固定不變的,協議中的為無效數據。編碼采樣率恆為16khz,單聲道,16bit/sample。

    剩余的數據為音頻幀數據,可以為多幀的集合,取決於前文提到過的framesPerPacket。在flex中的默認值為2,故每個音頻包中有兩幀數據。注意,當前文所說的VAD功能開啟時,兩幀數據可以是兩幀實際數據,也可以是兩幀10字節數據,還可以各占一幀。

 

三、如何轉換為RTP流

    完成上面兩步,這部分的工作就不難了。將音頻幀數據打上RTP頭就行了。具體參加rfc5574(rtp_payload_format_for_the_speex_codec)。

    唯一值得注意的一點是,在RTMP協議中,音頻數據的間隔是用時間做單位的,而RTP中的時間戳(timestamp),是sample數量。故當RTMP中兩包音頻包相差20MS時,RTP的時間戳就應該加上320(加320是因為恆采用16khz編碼采樣率)。

 

轉載請注明出處:www.cnblogs.com/chef


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM