《電子技術應用》
您所在的位置:首頁 > 通信与网络 > 设计应用 > 基于流媒体的移动视频直播系统的设计与实现
基于流媒体的移动视频直播系统的设计与实现
2014年电子技术应用第9期
彭 宏1,吴海巍1,叶敏展2,陈 娴1
1.浙江工业大学 信息工程学院 浙江省通信网技术应用研究重点实验室,浙江 杭州310023; 2.中国电信股份有限公司浙江分公司,浙江 杭州310023
摘要: 视频直播是最能体现媒体信息实时传播的媒体形态,介绍了一个利用3G/4G手机进行视频拍摄和传输的移动直播系统。分析了当今移动直播系统的发展趋势,介绍了如何设计并实现一个基于流媒体技术的移动视频直播系统。实际测试结果表明,用户可以随时随地地利用3G/4G 的iPhone手机进行直播,观众可以在远程PC端利用VLC播放器进行观看,提高直播系统的便捷性。
中圖分類號: TP37
文獻標識碼: A
文章編號: 0258-7998(2014)09-0111-03
Design and implementation of mobile video live system based on streaming media technology
Peng Hong1,Wu Haiwei1,Ye Minzhan2, Chen Xian1
1.Zhejiang Provincial Key Laboratory of Communication Networks and Application, College of Information Engineering,Zhejiang University of Technology,Hangzhou 310023,China;2.Zhejiang Branch of China Telecom Corporation Limited,Hangzhou 310023,China
Abstract: Live video is one of the best media forms to reflect the real-time information dissemination. This paper describes how to implement a mobile live system through video capture and transmission functions of 3G/4G mobile.The current status of the development of mobile live system is given,then a mobile video live system based on streaming media technology is designed and realized. The actual effect of the system indicates that users can make a live video on internet with 3G/4G mobile anytime and anywhere,and remote viewers can use VLC player based on personal computers to watch live video. The system brings convenience to people using it.
Key words : streaming media;mobile live system;HLS protocol

    流媒體指視頻、音頻、文本字幕等不同格式的多媒體數據用實時網絡傳輸協(xié)議作為媒介承載,并以連續(xù)媒體流的形式從源發(fā)送端向目的接收端傳輸,在目的端接收到一定的緩存數據后,就可以將上述流播放出來的網絡多媒體內容,是在網絡上按時間先后次序傳輸和播放的連續(xù)音/視頻數據流[1]。3G、4G的普及和移動終端日新月異的發(fā)展為移動直播系統(tǒng)提供了一定的技術保證,視頻拍攝和視頻數據傳輸是3G/4G手機的基本功能,隨著計算機處理能力的提升以及圖像處理能力和網絡通信的不斷成熟,每個手機用戶都有了進行視頻直播的可能,使得直播系統(tǒng)已經進入高速發(fā)展的時期。

1 總體框架設計

    移動直播系統(tǒng)主要包括移動設備端、服務器端和播放器三部分,基本流程包括移動終端現(xiàn)場視頻的拍攝、壓縮編碼、視頻數據格式封裝、RTP封裝和數據發(fā)送,及本地錄像數據的保存并在3G/Wi-Fi下進行上傳;接收端實現(xiàn)接收數據、解封裝、數據儲存、視頻信號發(fā)生,主要采用市場已有的支持rtsp協(xié)議的主流播放器,可進行二次開發(fā)擴展;流媒體服務器實現(xiàn)根據播放器的請求對移動設備端的視頻數據進行轉發(fā),以及采用RTCP控制協(xié)議優(yōu)化移動設備端的碼率,自適應網絡帶寬,以求最佳的用戶體驗;RTSP信令服務器負責系統(tǒng)中信令消息的傳輸、轉發(fā),是系統(tǒng)通信協(xié)議實現(xiàn)的關鍵部分,同時又要負責對系統(tǒng)中各個終端的管理,完成發(fā)送端、接收端和RTSP信令服務器的交互會話。這種平臺化的設計既方便了對移動設備端和播放器端的統(tǒng)一管理,又能增強系統(tǒng)整體的負載能力。移動直播系統(tǒng)的設計框架如圖1所示。

jsj1-t1.gif

2 移動直播系統(tǒng)模塊設計

    由于移動直播系統(tǒng)的播放器軟件采用VLC開源播放器為例,所以主要介紹流媒體服務器的模塊設計和iOS數據采集軟件的模塊設計。

2.1 流媒體服務器模塊設計

    流媒體服務器主要包括如圖2所示的功能模塊。

jsj1-t2.gif

    圖2中各模塊功能:(1)VLC視頻請求模塊:主要負責當VLC播放器發(fā)生視頻請求時,根據視頻請求查找請求的設備是否在線,如果在線則通知視頻直播數據轉發(fā)模塊轉發(fā)所請求的視頻數據;(2)直播數據轉發(fā)模塊:負責所有的視頻數據轉發(fā),主要實現(xiàn)同時直播多路時的負載均衡,最大程度地減輕服務器壓力;(3)視頻點播模塊:主要是采用蘋果公司所特有的HLS(HTTP Live Streaming)技術,實現(xiàn)對iOS直播軟件端保存的視頻文件進行隨時隨地的點播回放。

    項目選擇以live555開源庫作為基礎庫,設計出符合功能和性能要求的流媒體轉發(fā)服務器。以下簡單介紹利用live555開源庫開發(fā)出一個實現(xiàn)流媒數據流轉發(fā)的服務器。

    TaskScheduler* scheduler=BasicTaskScheduler::createNew();

    UsageEnvironment* env=BasicUsageEnvironment::createNew(*scheduler); 

    這里創(chuàng)建兩個關鍵的對象用于事件調度,實現(xiàn)了對事件的異步讀取、對事件句柄的設置及對錯誤信息的輸出等,是整個事件驅動的核心。

    RTSPServer* rtspServer=RTSPServer::createNew(*env,8554,authDB);//authDB為用戶驗證的用戶數據庫

    ServerMediaSession* sms=ServerMediaSession::createNew(*env, streamName, streamName,descriptionString);

    MPEG2TransportUDPServerMediaSubsession* mpeg2=MPEG2TransportUDPServerMediaSubsession::createNew(*env,inputAddressStr,inputPortNum, inputStreamIsRawUDP);

    sms->addSubsession(mpeg2);

    rtspServer->addServerMediaSession(sms);

    這里是在端口8554上建立一個RTSP服務負責與VLC客戶端之間的會話,并新建一個MPEG2數據流轉發(fā)的MediaSession添加到RTSP服務中。MPEG2對應一個數據源,sms作為RTSP服務的數據源會話。當有VLC客戶端請求時,進行用戶驗證,如驗證通過則從數據源獲取數據進行數據轉發(fā)。這樣一個簡單的服務就建立起來了。

2.2 iOS數據采集軟件的模塊設計

    iOS設備數據采集端主要包括如圖3所示的功能模塊。

jsj1-t3.gif

    圖3中各主要模塊的功能:(1)H.264編碼:將攝像頭采集到的原始圖像數據進行H.264壓縮編碼,便于在網絡中傳輸,減少發(fā)送到網絡中的碼率[2];(2)TS碼流封裝:基于MPEG-2標準(ISO13818-1)的視頻壓縮編碼,將H.264編碼出的ES流打包成PES流, PES流再按188 B的固定長度加上必要的節(jié)目專用信息PSI組成傳送TS碼流;(3)本地保存:設備在直播的同時對攝像頭采集編碼出的TS流數據進行保存,為了用戶能實現(xiàn)對歷史錄像進行觀看,主要包含兩個文件,一個是.M3U8文件,用于單碼率適配流的HLS技術,項目中只用到了一種CIF碼率,另一個是.ts文件,存儲視頻數據的切片媒體文件;(4)本地HLS和本地播放:建立本地HLS服務,本地回看錄像文件。

    以下是軟件實現(xiàn)過程的簡單介紹。

    do {

       if (self.avCaptureSession!=nil) break;

       [self vcrEncoderInit]; 

           //對原始數據采集所需的一些變量進行初始化

       [self cameraSetting]; //對攝像頭的參數進行設置

       } while (0);

    [self startVideoCapture]; //啟動攝像頭采集實時視頻幀

    將采集的原始數據通ffmpeg庫進行H.264編碼,根據MPEG-2標準(ISO13818-1)的視頻壓縮編碼,將H.264編碼出的ES流打包成PES流,PES流再按188 B的固定長度加上必要的節(jié)目專用信息PSI組成傳送TS碼流[3-4],并進行本地保存。

    av_register_all();//注冊編碼器

    pCodec=avcodec_find_encoder(AV_CODEC_ID_H264);//查找H264編碼器

    pcodecCtx=avcodec_alloc_context3(pCodec);//分配編碼器上下文內存空間

    avcodec_open2(pcodecCtx, pCodec, NULL);//打開H264編碼器

    _m_yuvFrame=avcodec_alloc_frame();//分配yuv圖像幀內存空間

    m_rgbFrame=avcodec_alloc_frame();//分配rgb圖像格式的內存空間

    swsCtx=sws_getContext(pcodecCtx->width, pcodecCtx->height, PIX_FMT_BGRA, pcodecCtx->width, pcodecCtx->

    height, PIX_FMT_YUV420P, SWS_FAST_BILINEAR, NULL, NULL, NULL);//rgb轉為yuv圖像轉換的上下文句柄

    int nbytes=avpicture_get_size(PIX_FMT_YUV420P, pcodecCtx->width, pcodecCtx->height);

    outbuffer=(uint8_t*)av_malloc(nbytes);

    avpicture_fill((AVPicture*)_m_yuvFrame, outbuffer, 

    PIX_FMT_YUV420P, pcodecCtx->width, pcodecCtx->height);//設置outbuffer為yuv圖像幀buffer

    ofmt = av_guess_format("mpegts", NULL, NULL);//輸出格式為mpegts

    _oc = avformat_alloc_context();//分配輸出到文件的上下文內存空間

    _oc->oformat = ofmt;//設置輸出格式

    avio_open(&_oc->pb, output, AVIO_FLAG_WRITE);//以寫格式打開文件

    avformat_write_header(_oc, &pAVDictionary);//寫入ts的節(jié)目專用信息頭

    上面都是為接下來的編碼和本地保存做準備工作。

    avpicture_fill((AVPicture*)m_rgbFrame, buffer, PIX_FMT_BGRA, width, height);

    int rec=sws_scale(swsCtx, (const uint8_t**)m_rgbFrame->data, m_rgbFrame->linesize, 0, pcodecCtx->height,_m_yuvFrame->data, _m_yuvFrame->linesize);

    int state=avcodec_encode_video2(pcodecCtx, &avpakt, _m_yuvFrame, &got_packet_ptr);//將原始數據編碼成H264裸數據

    [self TSpacket:&avpakt];//打包

    int nRet = av_interleaved_write_frame(_oc, packet);//將ts數據寫入本地文件

    [delegate_sendData SendH264Data:_oc->pb->buffer+havepk*188 Size:tspk*188];//rtp打包ts流數據進行流媒體直播

    av_free_packet(packet);//釋放內存

    HLS是一個由蘋果公司提出的基于HTTP的流媒體網絡傳輸協(xié)議。本項目的本地播放錄像功能所采用的也是HLS協(xié)議,在手機本地搭建一個輕量級的Web服務,只需要支持靜態(tài)文件訪問,然后調用系統(tǒng)的播放器類播放本地的M3U8文件即可。實現(xiàn)如下:

    httpServer = [[HTTPServer alloc] init];[httpServer setType:@"_http._tcp."]; [httpServer setPort:52479];[httpServer setDocumentRoot:filePath]; [httpServer start:&error];//建立輕量級本地Web服務

    然后即可調用系統(tǒng)播放組件MPMoviePlayerController進行播放,這樣一個基于流媒體技術的移動視頻直播系統(tǒng)的實現(xiàn)基本完成。

3 移動直播系統(tǒng)測試

    在實驗室網絡條件下,分別從RTSP用戶驗證、VLC視頻請求播放、流媒體視頻轉發(fā)、iOS視頻采集軟件、本地播放錄像四方面對移動直播系統(tǒng)進行測試。結果軟件運行正常,VLC視頻直播圖像較為清晰流暢,無明顯時延,用戶體驗較好,達到了實時播放的效果。各界面效果如圖4~圖7所示。

jsj1-t4-7.gif

    綜上所述,該移動直播系統(tǒng)利用手機終端的便利性,能夠在任何場景利用手機進行拍攝;并且使用3G/4G網絡連接手機移動直播平臺,就可以在互聯(lián)網上實現(xiàn)對突發(fā)事件的現(xiàn)場同步播出,或者在網絡條件不好的情況下保存本地,而后進行上傳,供其他用戶隨時隨地地點播錄像視頻,足以應付基本的突發(fā)事件。利用手機的視頻拍攝和傳送能力,開發(fā)即時視頻直播系統(tǒng)將會帶來巨大的市場效應。

參考文獻

[1] 程瀅穎.移動終端上視頻直播系統(tǒng)的研究與設計[D].上海:華東理工大學,2012.

[2] 方濤.數字電視業(yè)務信息及其編碼[M].北京:國防工業(yè)出版社,2003.

[3] 路錦正.MPEG-4/H.264視頻編解碼工程實踐[M].北京:電子工業(yè)出版社,2011.

[4] ISO/IEC 13818-1 information technology-generic coding of moving pictures and associated audio[S]:Syetems Recommendation H.222.0,1994.

此內容為AET網站原創(chuàng),未經授權禁止轉載。

相關內容