《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 通信与网络 > 设计应用 > 基于流媒体的移动视频直播系统的设计与实现
基于流媒体的移动视频直播系统的设计与实现
2014年电子技术应用第9期
彭 宏1,吴海巍1,叶敏展2,陈 娴1
1.浙江工业大学 信息工程学院 浙江省通信网技术应用研究重点实验室,浙江 杭州310023; 2.中国电信股份有限公司浙江分公司,浙江 杭州310023
摘要: 视频直播是最能体现媒体信息实时传播的媒体形态,介绍了一个利用3G/4G手机进行视频拍摄和传输的移动直播系统。分析了当今移动直播系统的发展趋势,介绍了如何设计并实现一个基于流媒体技术的移动视频直播系统。实际测试结果表明,用户可以随时随地地利用3G/4G 的iPhone手机进行直播,观众可以在远程PC端利用VLC播放器进行观看,提高直播系统的便捷性。
關(guān)鍵詞: 流媒体 移动直播 HLS协议
中圖分類號(hào): TP37
文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 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

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

1 總體框架設(shè)計(jì)

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

jsj1-t1.gif

2 移動(dòng)直播系統(tǒng)模塊設(shè)計(jì)

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

2.1 流媒體服務(wù)器模塊設(shè)計(jì)

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

jsj1-t2.gif

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

    項(xiàng)目選擇以live555開(kāi)源庫(kù)作為基礎(chǔ)庫(kù),設(shè)計(jì)出符合功能和性能要求的流媒體轉(zhuǎn)發(fā)服務(wù)器。以下簡(jiǎn)單介紹利用live555開(kāi)源庫(kù)開(kāi)發(fā)出一個(gè)實(shí)現(xiàn)流媒數(shù)據(jù)流轉(zhuǎn)發(fā)的服務(wù)器。

    TaskScheduler* scheduler=BasicTaskScheduler::createNew();

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

    這里創(chuàng)建兩個(gè)關(guān)鍵的對(duì)象用于事件調(diào)度,實(shí)現(xiàn)了對(duì)事件的異步讀取、對(duì)事件句柄的設(shè)置及對(duì)錯(cuò)誤信息的輸出等,是整個(gè)事件驅(qū)動(dòng)的核心。

    RTSPServer* rtspServer=RTSPServer::createNew(*env,8554,authDB);//authDB為用戶驗(yàn)證的用戶數(shù)據(jù)庫(kù)

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

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

    sms->addSubsession(mpeg2);

    rtspServer->addServerMediaSession(sms);

    這里是在端口8554上建立一個(gè)RTSP服務(wù)負(fù)責(zé)與VLC客戶端之間的會(huì)話,并新建一個(gè)MPEG2數(shù)據(jù)流轉(zhuǎn)發(fā)的MediaSession添加到RTSP服務(wù)中。MPEG2對(duì)應(yīng)一個(gè)數(shù)據(jù)源,sms作為RTSP服務(wù)的數(shù)據(jù)源會(huì)話。當(dāng)有VLC客戶端請(qǐng)求時(shí),進(jìn)行用戶驗(yàn)證,如驗(yàn)證通過(guò)則從數(shù)據(jù)源獲取數(shù)據(jù)進(jìn)行數(shù)據(jù)轉(zhuǎn)發(fā)。這樣一個(gè)簡(jiǎn)單的服務(wù)就建立起來(lái)了。

2.2 iOS數(shù)據(jù)采集軟件的模塊設(shè)計(jì)

    iOS設(shè)備數(shù)據(jù)采集端主要包括如圖3所示的功能模塊。

jsj1-t3.gif

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

    以下是軟件實(shí)現(xiàn)過(guò)程的簡(jiǎn)單介紹。

    do {

       if (self.avCaptureSession!=nil) break;

       [self vcrEncoderInit]; 

           //對(duì)原始數(shù)據(jù)采集所需的一些變量進(jìn)行初始化

       [self cameraSetting]; //對(duì)攝像頭的參數(shù)進(jìn)行設(shè)置

       } while (0);

    [self startVideoCapture]; //啟動(dòng)攝像頭采集實(shí)時(shí)視頻幀

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

    av_register_all();//注冊(cè)編碼器

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

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

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

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

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

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

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

    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);//設(shè)置outbuffer為yuv圖像幀buffer

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

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

    _oc->oformat = ofmt;//設(shè)置輸出格式

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

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

    上面都是為接下來(lái)的編碼和本地保存做準(zhǔn)備工作。

    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);//將原始數(shù)據(jù)編碼成H264裸數(shù)據(jù)

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

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

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

    av_free_packet(packet);//釋放內(nèi)存

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

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

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

3 移動(dòng)直播系統(tǒng)測(cè)試

    在實(shí)驗(yàn)室網(wǎng)絡(luò)條件下,分別從RTSP用戶驗(yàn)證、VLC視頻請(qǐng)求播放、流媒體視頻轉(zhuǎn)發(fā)、iOS視頻采集軟件、本地播放錄像四方面對(duì)移動(dòng)直播系統(tǒng)進(jìn)行測(cè)試。結(jié)果軟件運(yùn)行正常,VLC視頻直播圖像較為清晰流暢,無(wú)明顯時(shí)延,用戶體驗(yàn)較好,達(dá)到了實(shí)時(shí)播放的效果。各界面效果如圖4~圖7所示。

jsj1-t4-7.gif

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

參考文獻(xiàn)

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

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

[3] 路錦正.MPEG-4/H.264視頻編解碼工程實(shí)踐[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.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。

相關(guān)內(nèi)容