孫盼, 康維新
哈爾濱工程大學 信息與通信工程學院,黑龍江 哈爾濱 150001
?
基于DirectShow RTMP協(xié)議的視頻采集傳輸系統(tǒng)的設計與實現(xiàn)
孫盼, 康維新
哈爾濱工程大學 信息與通信工程學院,黑龍江 哈爾濱 150001
摘要:主要研究了DirectShow的視頻采集技術,并用該技術設計了一個基于RTMP( real time messaging protocol)協(xié)議的視頻采集與傳輸系統(tǒng)。DirectShow負責采集實時視頻、音頻,使用H.264和faac編碼器進行音視頻編碼。通過多線程技術對采集到的視頻和音頻數(shù)據(jù)進行封裝為可被流媒體服務器識別的可播放流,通過IP網(wǎng)絡,以流媒體的形式傳輸給流媒體服務器Nginx,Nginx服務器通過網(wǎng)絡接收各個客戶端的音視頻數(shù)據(jù)流,通過一定的緩沖機制,保證媒體數(shù)據(jù)的連續(xù)性,再以RTMP流式協(xié)議直播給客戶端。系統(tǒng)滿足了直播對視頻高實時性和有效性的要求。
關鍵詞:DirectShow;RTMP協(xié)議;Nginx;H.264;編碼器;視頻采集
康維新(1963-),男,教授,博士生導師.
隨著網(wǎng)絡視頻直播技術的發(fā)展,人們對視頻直播提出了更高要求,由于多媒體網(wǎng)絡傳輸具有高帶寬、高實時性特點,而當前網(wǎng)絡帶寬不夠高,在廣域網(wǎng)傳播傳輸多媒體數(shù)據(jù)時還普遍存在延遲和丟包現(xiàn)象,因此對于視頻的壓縮和編碼[1]、傳輸信道選取、不同網(wǎng)絡協(xié)議之間的的選擇、組播技術、媒體流幀率控制技術已經(jīng)成為了視頻直播系統(tǒng)中的關鍵技術,文中提出了“Internet+DirectShow+RTMP+H.264+Nginx”的方式來進行視頻傳輸系統(tǒng)的構建。利用了Internet的廣泛性[2]和DirectShow內(nèi)在的可擴展性以及H.264[3]的高壓縮比即在低帶寬情況下高效的傳輸數(shù)據(jù)特性和RTMP協(xié)議對有網(wǎng)絡缺陷的補償性,使得實時多媒體信息在網(wǎng)絡中的傳輸更為高效。本系統(tǒng)為純軟件實現(xiàn),對硬件要求低,具有穩(wěn)定性的Nginx服務器[4]、豐富的模塊庫配置、配置靈活和低系統(tǒng)資源的消耗等優(yōu)點降低了系統(tǒng)成本的同時又滿足了項目的需求。本系統(tǒng)可用于學校和企業(yè)的視頻會議、視頻監(jiān)控,能夠滿足不同層次的實時視頻直播的要求。
1DirectShow技術和RTMP
DirectShow是Windows平臺上的流媒體體系結構,是一個開放性的應用框架。是DirectX家族一員,是基于COM(component object model)的編程接口。DirectShow在Windows平臺上數(shù)字媒體程序的開發(fā)并負責系統(tǒng)總體任務和底層工作大大降低了開發(fā)的難度并且有很好的兼容性能夠支持多種硬件設備在Windows平臺上的音視頻采集。典型的DirectShow系統(tǒng)如圖1所示。
圖1 DirectShow系統(tǒng)框圖
在DirectShow使用中構建Filter Graph 模型成了DirectShow視頻捕獲技術的關鍵,在Filter Graph 中包含了各個能夠處理數(shù)據(jù)模塊的Filter[5],各個Filter按照特定的順序連接為一條線就能夠完成處理數(shù)據(jù)等功能,各個過濾器Filter 通過針腳Pin[6]連接,針腳Pin通過 GetMediaType()、CheckMediaType()和SetMediaType()3種方法來協(xié)商各個Filter之間傳輸數(shù)據(jù)的多媒體類型。
RTMP是由 Adobe 公司提出的一種在Flash平臺進行實時數(shù)據(jù)傳輸?shù)木W(wǎng)絡協(xié)議,RTMP 協(xié)議使用的是TCP 協(xié)議作為其傳輸層的網(wǎng)絡協(xié)議[7]。TCP協(xié)議是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議, 在網(wǎng)絡傳輸?shù)倪^程中沒有丟包的現(xiàn)象,從而使用戶能夠收看更加清晰流暢的視頻。 RTMP協(xié)議可以進行實時視頻流的傳輸和控制他的播放。因此本系統(tǒng)采用RTMP協(xié)議作為數(shù)據(jù)傳輸協(xié)。
2系統(tǒng)總體設計方案
本系統(tǒng)采用H.264編碼進行視頻流的的實時播出,主要有4大部分組成:視頻數(shù)據(jù)的捕獲、視頻編碼、視頻RTMP打包與傳輸及流媒體服務器的轉播。視頻捕獲部分負責實時捕獲視頻數(shù)據(jù);視頻編碼部分負責將捕獲的視頻數(shù)據(jù)進行實時H.264編碼壓縮,并可以選擇保存為本地文件;視頻播出部分負責將編碼完的數(shù)據(jù)進行RTMP包封裝,然后發(fā)送到Nginx服務器,最后由Nginx服務器向申請觀看的客戶端實時轉播視頻數(shù)據(jù)。工作原理如圖2所示。
圖2 系統(tǒng)整體結構
3軟件模塊設計與實現(xiàn)
3.1DirectShow實現(xiàn)視頻捕獲功能
在系統(tǒng)中正確安裝視頻采集卡后通過GraphEdit就能夠在“VideoCaptureSources”目錄下找到各個捕捉設備的Filter,一般以CaptureFilter形式出現(xiàn),1個Capture Filter至少有1個Capture Output Pin。選擇系統(tǒng)使用的捕捉卡后然后調(diào)用AddFilter把Capture Filter添加到Filter Graph。
本系統(tǒng)通過DirectShow實現(xiàn)視頻捕獲,具體分為以下4個步驟。
1)采集設備枚舉
在構造Video Capture Filter前,需要列舉出系統(tǒng)的所有采集設備,根據(jù)列舉的設備名稱創(chuàng)建需要的Video Capture Filter。核心代碼如下:
IID_ICreateDevEnum,(LPVOID *)&pDevEnum);
2)創(chuàng)建Video Capture Filter
由上一步驟得到采集設備,建立Video Capture Filter。具體代碼如下:
hr=pMoniker->BindToObject(0,0,IID_IBaseFilter,(void **)&m_pCapture);//創(chuàng)建采集Filter 實例[8]
3)創(chuàng)建視頻采集過濾器圖表[9]
使用ICaptureGraphBuilder2接口,創(chuàng)建視頻采集過濾器圖表,然后再將它添加到IGraphBuilder圖表管理器中。
4)將所有的的Smart Tee和Video Renderer Filter連接成完整的圖表。
利用ICaptureGraphBuilder2提供的RenderStream函數(shù),構建Smart Tee和Video Renderer Filter[10]并將它們連接成一個完整的圖表,從而完成視頻采集的功能。核心代碼如下;
pBuild->RenderStream(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Video,pCap, NULL, NULL);
該系統(tǒng)的發(fā)送端實現(xiàn)思路如下,用USB攝像頭采集數(shù)據(jù),用FFmpeg 支持的X264編碼對采集到的數(shù)據(jù)進行H.264編碼 ,對編碼好的數(shù)據(jù)連接到發(fā)送Filter并以RTMP協(xié)議打包,將打包好的數(shù)據(jù)發(fā)送至Nginx服務器。其中濾波圖如圖3所示。
圖3 發(fā)送端的Filter Graph
3.2視頻編碼技術
喬-彼 得· 威 特 金(Joel-Peter Witkin) 美國攝影師。他的作品常以死亡、尸體(或尸塊)為主題,以諸如侏儒、變性人以及畸形人等各式邊緣人物為拍攝對象。他創(chuàng)造的合成場景,常常使人聯(lián)想到某些宗教故事或經(jīng)典畫作。其作品因題材的驚世駭俗,時常令公眾輿論大驚。他的藝術作品常因挑戰(zhàn)常規(guī)而遭受排擠。
在本系統(tǒng)中利用DirectX SDK 將視頻編碼模塊封裝為H.264Filter,將視頻傳輸模塊封裝為H.264SenderFilter。利用開源的X264編碼器進行H.264的視頻編碼,使用librtmp進行對H.264數(shù)據(jù)進行RTMP協(xié)議的封裝和傳輸[11]。H.264編碼Filter重寫了函數(shù)CheckinputType(eonsteMediaType*mtln)該函數(shù)檢測Filter對輸入的媒體是否支持。DecideBuffersize()根據(jù)輸入媒體類型給出需要分配的緩沖區(qū)大小,給函數(shù)分配緩沖區(qū)。CompleteConnect(pINesDIRECTION direetion,Ipin*pReeeivepin)當輸入Pin連接成功后,會調(diào)用該函數(shù)對X264編碼器進行初始化,參數(shù)設置,編碼器打開,編碼空間分配。在本項目中使用的攝像頭采集到的視頻數(shù)據(jù)格式是RGB24,而X264支持的是標準的YUV420格式,因此編碼前要對采集模塊傳送過來的RGB格式的圖像進行格式轉換,在編碼前對RGB格式的圖像轉換為YUV420格式,然后用X264編碼進行編碼,X264編碼過程如下:
1)x264_param_default( x264_param_t *param )。對編碼器進行參數(shù)設定分配編碼器所需結構體。檢測參數(shù)有效性,初始化sps和pps,分配編碼器所需memory空間,包括參考幀和緩沖幀,初始化macroblock cache相應空間。根據(jù)cpu類型,初始化各指令集加速函數(shù)。
2)以宏塊為單位對視頻數(shù)據(jù)進行編碼,x264_macroblock_cache_load()函數(shù)將相關數(shù)據(jù)載入緩存。然后利用x264_macroblock_analyse()函數(shù)分析參數(shù),確定最佳編碼模式。確定好編碼模式后,首先用x264_macroblock_encode()函數(shù)對宏塊進行編碼,然后用x264_encoder_encode( h, &nal, &i_nal, pic, &pic_out )對幀進行編碼。
3)i_size = x264_nal_encode( data, &i_data, 1, &nal[i] ) 網(wǎng)絡打包編碼i_file += p_write_nalu( hout, data, i_size ) 把網(wǎng)絡包寫入到輸出文件中去返回對下一幀進行編碼。視頻編碼流程如圖4所示。
圖4 視頻編碼流程
3.3發(fā)送端 RTMP 打包
將編碼好的數(shù)據(jù)通過Output pin 輸入到H.264 RTMP SenderFilter,首先要將H.264數(shù)據(jù)進行RTMP協(xié)議封包,RTMP協(xié)議封包組成與含義如表1所示。
表1 RTMP協(xié)議封包組成與含義
將封裝好的數(shù)據(jù)包利用網(wǎng)絡傳輸?shù)搅髅襟w服務器。數(shù)據(jù)包是使用librtmp庫進行傳輸?shù)?。首先初始化RTMP結構,建立和流媒體服務器的RTMP連接,并設置輸入的RTMP連接的URL,然后將封裝好的RTMPPacket 調(diào)用RTMP_SendPacket()函數(shù),循環(huán)往流媒體服務器Nginx發(fā)送數(shù)據(jù)。這里RTMP Packet是已經(jīng)封裝好的加了時間戳的H264或者AAC數(shù)據(jù)流。發(fā)送端流程如圖5所示。
3.4流媒體服務器的搭建及轉播
nginx rtmp模塊能夠支持外部程序調(diào)用。本系統(tǒng)使用了nginx rtmp模塊,調(diào)用FFmpeg實現(xiàn)了對實時視頻流h.264編碼的功能。在nginx服務器上配置rtmp模塊具體步驟為首先安裝依賴包,然后安裝git工具,最后安裝FFmpeg及其依賴包。
1)安裝和編譯nginx rtmp模塊代碼如下./configure--add-module=/path/to/nginx-rtmp-module。
2)安裝對于HLS(HTTP Live Streaming)支持模塊的配置,./configure--add-module=/path/to/nginx-rtmp-module--add-module=/path/to/nginx-rtmp-module/hls。
對于HLS支持模塊的配置利用了Apple的動態(tài)碼率自適應技術,主要用于PC和Apple終端的音視頻服務。包括一個m3u(8)的索引文件、TS媒體分片文件和key加密串文件。使用FFmpeg轉流如下
exec/opt/ffmpeg/bin/ffmpeg-irtmp://localhost/myapp/$name-c:acopy-c:vlibx264-b:v512K-g30-fflvrtmp://localhost/hls/$name_low。
將視頻流轉推到hls,hls_variant會生成一個多碼率的m3u8文件,同時把切片文件存放到test_low目錄下,在觀看視頻時,訪問http://yourip/hls/test.m3u8,本系統(tǒng)中使用的實際碼流的URL http://IP /hls /livestream.m3u8為其中IP為服務器Nginx的IP地址,Nginx服務器對于RTMP直播配置在配置文件nginx.conf中加入rtmp直播配置代碼如下:
rtmp {
server {
listen 1935;
chunk_size 4000;
application live {
live on;
}
}
}
配置好直播模塊以后啟動Nginx服務器就可完成流媒體服務器的搭建和轉播的配置。
4系統(tǒng)測試
完成jwplayer下載后,解壓到/usr/local/nginx/html/,建立測試頁面player.html,也放到上面目錄下。系統(tǒng)采集視頻界面如圖6所示。
圖6 視頻采集界面
其中視頻設備采用攝像頭Gsou USB2.0 Camera 幀率為25 ,可根據(jù)項目需要自己選取幀率、分辨率和波特率,本系統(tǒng)也可以把本地保存的視頻文件推流到Nginx服務器,可以把攝像頭采集的實時視頻保存為本地文件。rtmp://111.117.58.223/mytv/livestream 為流媒體鏈接。其中111.117.58.223為Nginx服務器的IP地址錄制實時視頻之前需要啟動Nginx服務器然后點擊開始錄制,開始錄制界面如圖7所示。
實時視頻錄制系統(tǒng)啟動以后,需要查看服務器和客戶端的1955端口是否打開,因為1935通信的是RTMP協(xié)議。如果的1935端口沒有打開,需要在對應的TCP端口設置項中選中全部允許就可以了。設置完畢后,點確定按鈕使設置生效。打開PC機瀏覽器輸入111.117.58.223:9091/player.html 實時視頻可以清晰流暢地觀看,如圖8。同時通過長時間的視頻系統(tǒng)的運行和實時視頻網(wǎng)頁和手機客戶端播放,可以很直觀地測試系統(tǒng)的準確性、穩(wěn)定性和可靠性。
圖7 錄制開始界面
圖8 瀏覽器收看界面
5結束語
文中通過對實時視頻直播系統(tǒng)的介紹,詳細的描述了實現(xiàn)軟件系統(tǒng)的步驟和方法,主要包括DirectShow進行視頻數(shù)據(jù)的捕獲,H.264編碼器進行實時編碼,使用RTMP協(xié)議作為視頻網(wǎng)絡傳輸協(xié)議,配置穩(wěn)定高效的Nginx作為本系統(tǒng)的流媒體服務器,用戶不需要使用任何客戶端僅僅在裝過Flash的瀏覽器就可以觀看視頻直播,本系統(tǒng)完美解決多平臺的兼容問題RTMP解決PC端,HLS解決Android、Apple終端,使用RTMP協(xié)議保證了實時視頻數(shù)據(jù)質(zhì)量避免了在廣域網(wǎng)傳播中丟包現(xiàn)象,經(jīng)過測試系統(tǒng)性能可靠穩(wěn)定,很好地滿足了復雜場景和網(wǎng)絡帶寬低的情況下視頻直播系統(tǒng)的要求。
參考文獻:
[1]王洪偉. 基于DM3730和GStreamer的網(wǎng)絡視頻傳輸技術設計與實現(xiàn)[J]. 應用科技, 2014, 41(3): 19-22.
[2]SERGIO S. The embedded internet: TCP/IP basics, implementation and applications[M]. Buenos Aires: Addison Wesley Professional, 2008: 47-59.
[3]KIM W J, CHO K, CHUNG K S. Stage-based frame-partitioned parallelization of H. 264/AVC decoding[J]. IEEE Transactions on Consumer Electronics, 2010, 56(2): 3-10.
[4]林志偉. 面向移動終端的流媒體實時通信服務器關鍵技術研究[D]. 廈門: 廈門大學, 2012: 72-73.
[5]楊晨. 移動流媒體服務器設計和性能分析[D]. 武漢: 華中科技大學, 2006: 57-58.
[6] 曾華山, 宋鈺. 基于Directshow的VMR視頻捕獲的實現(xiàn)[J]. 電腦知識與技術, 2010, 6(25): 7110-7111.
[7]于洋. 基于DirectShow的多線程AVS轉碼器的研究與實現(xiàn)[D]. 哈爾濱: 哈爾濱工業(yè)大學, 2009: 53-54.
[8]章洪兵, 于永彥, 趙歡, 等. 基于DirectX的視頻采集與處理系統(tǒng)[J]. 電腦知識與技術, 2008, 4(5): 1204-1207.
[9]余永勝. 探究基于TCP協(xié)議的網(wǎng)絡應用設計與開發(fā)[J]. 電子制作, 2013, (22): 58.
[10]姜浩然, 徐林. 基于RTMP的流媒體服務器的研究[J]. 計算機與數(shù)字工程, 2011(10): 104-108.
[11]葉秀芬, LIU Peter Xiaoping, 馮偉興, 等. 用于互聯(lián)網(wǎng)遙操作的基于速率的點對點傳輸協(xié)議的研究[J]. 哈爾濱工程大學學報, 2003, 24(3): 273-277.
網(wǎng)絡出版地址:http://www.cnki.net/kcms/detail/23.1191.u.20151205.1505.002.html
Design and realizaiton of video capture and transmission system
based on DirectShow RTMP protocol
SUN Pan,KANG Weixin
College of Information and Communication Engineering, Harbin Engineering University, Harbin 150001, China
Abstract:The DirectShow video capture technology was studied, and by using this technology, a video capture and transmission system was designed based on real time messaging protocol protocol. DirectShow is responsible for capturing real-time video and audio, and H.264 and faac encoders are used to encode audio and video. By using multithreading technology, the captured videos and audios are encapsulated into streams that can be played and can be recognized by streaming media server. Through an IP network, the streams in the form of streaming media are transferred to Nginx streaming media server. Nginx server receives the audio and video data streams of each client through the network. By using a certain buffer mechanism, the continuity of media data is ensured. Then the streams are broadcasted to clients through RTMP streaming protocol in real time. The system realizes high real time and high availability required by live broadcast for video.
Keywords:DirectShow; RTMP protocol; Nginx; H.264; encoder; video capture
通信作者:孫盼,E-mail:419811304@qq.com.
作者簡介:孫盼 (1990-),男,碩士研究生;
基金項目:黑龍江省交通運輸廳資助項目(P083314005).
收稿日期:2015-04-10.網(wǎng)絡出版日期:2015-12-05.
中圖分類號:TP368.5
文獻標志碼:A
文章編號:1009-671X(2015)06-040-05
doi:10.11991/yykj.201504015