之前寫過一篇《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