【基於libRTMP的流媒體直播之 AAC、H264 推送】
這段時間在搗騰基於 RTMP 協議的流媒體直播框架,其間參考了眾多博主的文章,剩下一些細節問題自行琢磨也算摸索出個門道,現將自己認為比較惱人的 AAC 音訊幀的推送和解析、H264 碼流的推送和解析以及網上沒說清楚的地方分享給各位。
RTMP 協議棧的實現,Bill 直接使用的 libRTMP,關於 libRTMP 的編譯、基本使用方法,以及簡單的流媒體直播框架,請參見博文[C++實現RTMP協議傳送H.264編碼及AAC編碼的音視訊],言簡意賅,故不再贅述。
言歸正傳,我們首先來看看 AAC 以及 H264 的推送。
不論向 RTMP
AAC 音訊幀的推送
我們首先來看看音訊 Tag,根據 FLV 標準 Audio Tags 一節的描述:
我們可以將其簡化並得到 AAC 音訊同步包的格式如下:
音訊同步包大小固定為 4 個位元組。前兩個位元組被稱為 [AACDecoderSpecificInfo]
[AACDecoderSpecificInfo] 倆位元組可以直接使用 FAAC 庫的 faacEncGetDecoderSpecificInfo 函式來獲取,也可以根據自己的音訊源進行計算。一般情況下,雙聲道,44kHz 取樣率的 AAC 音訊,其值為 0xAF00,示例程式碼:
根據 FLV 標準 不難得知,[AACDecoderSpecificInfo] 第 1 個位元組高 4 位 |1010| 代表音訊資料編碼型別為 AAC,接下來 2
音訊同步包的後兩個位元組 [AudioSpecificConfig] 的結構,援引其他博主圖如下:
我們只需參照上述結構計算出對應的值即可。至此,4 個位元組的音訊同步包組裝完畢,便可推送至 RTMP 伺服器,示例程式碼如下:
網上有博主說音訊取樣率小於等於 44100 時 SamplingFrequencyIndex 應當選擇3(48kHz),Bill 測試發現取樣率等於 44100 時設定標記為 3 或 4 均能正常推送並在客戶端播放,不過我們還是應當按照標準規定的行事,故此處的 SamplingFrequencyIndex 選 4。
完成音訊同步包的推送後,我們便可向伺服器推送普通的 AAC 資料包,推送資料包時,[AACDecoderSpecificInfo] 則變為 0xAF01,向伺服器說明這個包是普通 AAC 資料包。後面的資料為 AAC 原始資料去掉前 7 個位元組(若存在 CRC 校驗,則去掉前 9 個位元組),我們同樣以一張簡化的表格加以闡釋:
推送普通 AAC 資料包的示例程式碼:
至此,我們便完成了 AAC 音訊的推送流程。此時可嘗試使用 VLC 或其他支援 RTMP 協議的播放器連線到伺服器測試正在直播的 AAC 音訊流。
H264 碼流的推送
前面提到過,向 RTMP 伺服器傳送 H264 碼流,需要按照 FLV 格式進行封包,並且首先需要傳送視訊同步包 [AVC
Sequence Header]。我們依舊先閱讀 FLV 標準 Video
Tags 一節:
由於視訊同步包前半部分比較簡單易懂,仔細閱讀上述標準便可明白如何操作,故 Bill 不另作圖闡釋。由上圖可知,我們的視訊同步包 FrameType
== 1,CodecID == 7,VideoData == AVCVIDEOPACKET,繼續展開 AVCVIDEOPACKET,我們可以得到 AVCPacketType
== 0x00,CompositionTime == 0x000000,Data == AVCDecoderConfigurationRecord。
因此構造視訊同步包的關鍵點便是構造 AVCDecoderConfigurationRecord。同樣,我們援引其他博主的圖片來闡釋這個結構的細節:
其中需要額外計算的是 H264 碼流的 Sps 以及 Pps,這兩個關鍵資料可以在開始編碼 H264 的時候提取出來並加以儲存,在需要時直接使用即可。具體做法請讀者自行 Google 或參見 參考博文[2],在此不再贅述。
當我們得到本次 H264 碼流的 Sps 以及 Pps 的相關資訊後,我們便可以完成視訊同步包的組裝,示例程式碼如下:
至此,視訊同步包便構造完畢並推送給 RTMP 伺服器。接下來只需要將普通 H264 碼流稍加封裝便可實現 H264 直播,下面我們來看一下普通視訊包的組裝過程。
回顧 FLV 標準 的 Video
Tags 一節,我們可以得到 H264 普通資料包的封包資訊,FrameType == (H264
I 幀 ? 1 : 2),CodecID == 7,VideoData
== AVCVIDEOPACKET,繼續展開,我們可以得到 AVCPacketType == 0x01,CompositionTime 此處仍然設定為 0x000000,具體原因 TODO(billhoo),Data
== H264 NALU Size + NALU Raw Data。
構造視訊資料包的示例程式碼如下:
至此 H264 碼流的整個推送流程便已完成,我們可以使用 VLC 或其他支援 RTMP 協議的播放器進行測試。
關於 AAC 音訊幀及 H264 碼流的時間戳
通過前文的步驟我們已經能夠將 AAC 音訊幀以及 H264 碼流正常推送到 RTMP 直播伺服器,並能夠使用相關播放器進行播放。但播放的效果如何還取決於時間戳的設定。
在網路良好的情況下,自己最開始使用的音訊流時間戳為 AAC 編碼器剛輸出一幀的時間,視訊流時間戳為 H264 編碼器剛編碼出來一幀的時間,VLC 播放端就頻繁報異常,要麼是重新緩衝,要麼直接沒聲音或花屏。在排除了推送步驟實現有誤的問題後,Bill 發現問題出在時間戳上。
之後有網友說直播流的時間戳不論音訊還是視訊,在整體時間線上應當呈現遞增趨勢。由於 Bill最開始的時間戳計算方法是按照音視訊分開計算,而音訊時戳和視訊時戳並不是在一條時間線上,這就有可能出現音訊時戳在某一個時間點比對應的視訊時戳小,
在某一個時間點又跳變到比對應的視訊時戳大,導致播放端無法對齊。
目前採用的時間戳為底層傳送 RTMP 包的時間,不區分音訊流還是視訊流,統一使用即將傳送RTMP 包的系統時間作為該包的時間戳。目前區域網測試播放效果良好,音視訊同步且流暢。
參考博文
引自:http://billhoo.blog.51cto.com/2337751/1557646
相關推薦
【基於libRTMP的流媒體直播之 AAC、H264 推送】
這段時間在搗騰基於 RTMP 協議的流媒體直播框架,其間參考了眾多博主的文章,剩下一些細節問題自行琢磨也算摸索出個門道,現將自己認為比較惱人的 AAC 音訊幀的推送和解析、H264 碼流的推送和解析以及網上沒說清楚的地方分享給各位。 RTMP 協議棧的實
基於libRTMP的流媒體直播之音訊推送
其中最重要的就是E,F,H。 E就是型別了 0: AAC Main 1: AAC LC (Low Complexity) 2: AAC SSR (Scalable Sample Rate) 3: AAC LTP (Long Term Prediction) F就是取樣頻率 0: 96000 Hz
流媒體直播之二imx6 arm板的live555的交叉編譯
Author: CaoHu E-Mail: [email protected] Version:0.1 Date: 2018-01-29 10:28 Description: My level is limited, if
CentOS7下搭建基於Nginx的HLS,RTMP流媒體直播伺服器
CentOS7下搭建基於Nginx的HLS,RTMP流媒體直播伺服器 安裝wget 更改yum源 安裝依賴庫 複製nginx-1.6.2.tar.gz、nginx-rtmp-module 安裝、編譯Nginx 編輯修改nginx.conf
基於Rtmp協議的流媒體直播實現
最近需要實現一個類似於視訊直播這樣的功能,很幸運的是,在網上找到了兩篇博文,寫的不錯,省了很多時間精力,在此感謝博主的分享,原博文的地址在下方。 由於博主的文章較長且散,我在此對程式碼進行了整理和打包
Android流媒體開發之路三:基於NDK開發Android平臺RTSP播放器
基於NDK開發Android平臺RTSP播放器 最近做了不少android端的開發,有推流、播放、直播、對講等各種應用,做了RTMP、RTSP、HTTP-FLV、自定義等各種協議,還是有不少收穫和心得的。我這邊做,核心模組和核心程式碼部分,都是基於NDK,用C++開發的,然後將so動態庫,在Android
day122:MoFang:OSSRS流媒體直播伺服器&基於APICloud的acLive直播推流模組實現RTMP直播推流
目錄 1.docker安裝OSSRS流媒體直播伺服器 2.基於APICloud的acLive直播推流模組實現RTMP直播推流 3.直播流管理 1.docker安裝OSSRS流媒體直播伺服器 1.OSSRS簡介 在外界開發中, 如果要實現直播功能.常用的方式有: 1. 通過第三方介面來實現. 可以申請阿里雲
用手機APP觀看熱門劇《楚喬傳》的P2P流媒體直播系統解決方案
P2P直播 流媒體系統 手機追劇 近期熱播的大劇《楚喬傳》,網友們對最新劇情討論得熱火朝天:楚喬傳》什麽時候結局? 最新劇情預告呢?楚喬燕洵是否分手?蒙楓喜歡宇文玥嗎?掀起了一股觀看風潮。 隨著這部勵誌大劇熱播,一些關於手機觀看《楚喬傳》的APP的搜索關鍵詞迅速鋪開來:
流媒體協議之RTSP客戶端的實現20171014
叠代 jrtplib 訪問 pac .cpp 服務端 blog 文件 僅支持 RtspClient是基於jrtplib實現的,目前僅支持h264格式,後續將不斷叠代優化,加入對其他格式的支持,並且將實現RTSP的服務端。 RtspClient的功能是接收服務端過來流,然後寫
基於HLS流媒體協議的視訊加密方案
本文只討論應用於瀏覽器環境的流媒體協議的加密。 背景 付費觀看視訊的模式是很多平臺的核心業務,如果視訊被錄製並非法傳播,付費業務將受到嚴重威脅。因此對視訊服務進行加密的技術變得尤為重要。 本文所指的視訊加密是為了讓要保護的視訊不能輕易被下載,即使下載到了也是加密後的內容,其它人解開加密後
Android流媒體開發之路一:Camera2採集攝像頭原始資料並手動預覽
Android Camera2採集攝像頭原始資料並手動預覽 最近研究了一下android攝像頭開發相關的技術,也看了Google提供的Camera2Basic呼叫示例,以及網上一部分程式碼,但都是在TextureView等預覽基礎上實現,而我想要做的是在不預覽的情況下,能獲取到攝
流媒體開發之--HLS--M3U8解析(2): HLS草案
目錄 1 簡介 2 2 概述 2 3 播放列表檔案 3 3.1 介紹 3 3.2新標籤 4 3.2.1 EXT-X-TARGETDURATION 4 3.2.2 EXT-X-MEDIA-SEQUENCE 4 3.2.3 EXT-X-KEY 4 3.2.4 EXT-X-PR
利用nginx的nginx-rtmp-module搭建流媒體直播伺服器
Nginx除了做web伺服器之外在流媒體方面的支援也是有對應的模組,nginx-rtmp-module就是nginx的一個擴充套件模組,支援rtmp視訊推流,同時利用nginx作為web伺服器的有時可以很方便的實現直播拉流,專案官方地址是https://github.com/arut/nginx-r
通過nginx,nginx-rtmp-module實現流媒體直播
1、 下載nginx http://nginx.org/en/download.html 下載nginx-rtmp-module: nginx-rtmp-module的官方github地址:https://github.com/arut/nginx-rtmp-module
Adobe將支援HTTP流媒體直播 預示著ipad將可以用flash嗎?
Adobe Flash Media Server的產品經理Kevin Towes預覽HTTP流媒體直播 Adobe宣佈計劃在iPad 2支援視訊流功能,新增蘋果的HTTP流媒體直播標準到他們的Flash多媒體伺服器(Flash Media Server)產品。此舉將可緩和兩
阿里雲 實現流媒體 直播 demo
原理圖: 我們使用是h5 所以我們直播通過手機端進行訪問 讓我們一起開始奇妙的流媒體之旅吧! 1、下載nginx-rtmp-module: 使用命令: git clone https://github.com/arut/nginx-rtmp
【基於WPF+OneNote+Oracle的中文圖片識別系統階段總結】之篇一:WPF常用知識以及本專案設計總結
【小記】:大膽嘗試才能突破,某個中醫藥大學有一批圖片需要處理(ORC),然後進行資料探勘。之前沒有接觸過ORC這個東西,但是還是應允了。在網上搜索一番,關於中文圖片識別,最終敲定為基於微軟的OneNote,其識別率相對較高。網上這個技術點的資料真心不多,後來於部落格園找到一篇博文,但是那個
【基於WPF+OneNote+Oracle的中文圖片識別系統階段總結】之篇三:批量處理後的txt檔案入庫處理
【小記】:大膽嘗試才能突破,某個中醫藥大學有一批圖片需要處理(ORC),然後進行資料探勘。之前沒有接觸過ORC這個東西,但是還是應允了。在網上搜索一番,關於中文圖片識別,最終敲定為基於微軟的OneNote,其識別率相對較高。網上這個技術點的資料真心不多,後來於部落格園找到一篇博文,但是那個
【基於WPF+OneNote+Oracle的中文圖片識別系統階段總結】之篇四:關於OneNote入庫處理以及稽核
namespace OnenoteOCRDemo { /// <summary> /// falg.xaml 的互動邏輯 /// </summary> public partial class falg : Window {
【基於WPF+OneNote+Oracle的中文圖片識別系統階段總結】之篇二:基於OneNote難點突破和批量識別
【小記】:大膽嘗試才能突破,某個中醫藥大學有一批圖片需要處理(ORC),然後進行資料探勘。之前沒有接觸過ORC這個東西,但是還是應允了。在網上搜索一番,關於中文圖片識別,最終敲定為基於微軟的OneNote,其識別率相對較高。網上這個技術點的資料真心不多,後來於部落格園找到一篇博文,但是那個