廢話頗多,下面讓我們一起來看看如何對 RTMP 包進行解析和重組。
RTMP 音頻包的解析及 AAC 重組
根據 ADTS 屬性的描述,我們不難抽象出一個反映該資訊的結構體如下:
<a href="http://s3.51cto.com/wyfs02/M00/4A/F1/wKiom1QneDSCSvzZAAEoq6e7vv0953.jpg" target="_blank"></a>
接着讓我們回顧一下前文提到的音頻同步包的結構:
<a href="http://s3.51cto.com/wyfs02/M01/4A/F3/wKioL1QneQ7gzPzqAAKNXyQMvTU227.jpg" target="_blank"></a>
我們隻需要從伺服器獲得的音頻同步包中擷取 AACDecoderSpecificInfo 以及 AudioSpecificConfig 這 4 個位元組,并将其中的内容解析到 RtmpLiveAudioMetadataTy 這個結構中以備使用。示例代碼如下:
<a href="http://s3.51cto.com/wyfs02/M00/4A/F2/wKiom1QneyCy6Vu9AAMM-JEbp-c240.jpg" target="_blank"></a>
在獲得了 AAC 音頻所必要的資訊之後,我們便可構造 ADTS 并重組 RTMP 伺服器下發來的後續音頻包。構造ADTS 示例代碼如下:
<a href="http://s3.51cto.com/wyfs02/M01/4A/F4/wKiom1QnfOPwtSxZAAKoOmSuPco828.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M02/4A/F6/wKioL1QnfXHDe2AxAAGBFuLv1vg211.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M01/4A/F5/wKiom1Qnfbvjs0rrAAGPacckG4E928.jpg" target="_blank"></a>
至此,ADTS 7個位元組便重構完畢,我們隻需要在這 7 個位元組後面添加上 AAC 的原始資料便可重組一個 AAC 音頻幀。針對之後的每一個 RTMP 音頻包,都進行上述步驟,不斷将重組後的 AAC 音頻幀寫入檔案,使用支援的播放器播放以驗證解析正确與否。
RTMP 視訊包的解析及 H.264 重組
與重組音頻幀類似的,我們首先會從伺服器獲得視訊同步包,首先對視訊同步包進行拆包解析,得到本次 H264碼流的 Sps 以及 Pps,并從 Sps 中擷取視訊的寬高資訊以備使用。根據前文提到的視訊同步包封包流程,我們進行逆向解析的示例如下:
<a href="http://s3.51cto.com/wyfs02/M02/4A/F6/wKiom1QngRKCQGkjAALprfsuRBc380.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M00/4A/F6/wKiom1QngUPhgjl-AAGPsu_PbYs052.jpg" target="_blank"></a>
其中從 Sps 擷取視訊的寬高資訊請讀者自行 Google,Bill 不再贅述。解析完視訊同步包,我們隻需要對接下來的視訊包進行分類即可,針對 H264 P 幀,我們直接将原始資料寫入檔案,針對 I 幀,我們在其前面添加儲存好的 Sps以及 Pps,然後寫入原始資料即可。針對之後從 RTMP 伺服器接收的每一個視訊包,均進行上述重組操作,并将獲得的 H264 編碼寫入檔案,使用 Elecard StreamEye Tools 播放即可。
參考博文
本文轉自Bill_Hoo 51CTO部落格,原文連結:http://blog.51cto.com/billhoo/1558209,如需轉載請自行聯系原作者