一蜜笤、概述
live555庫(kù)本身實(shí)現(xiàn)了做rtsp服務(wù)器,客戶端可以通過(guò)rtsp客戶端訪問(wèn)服務(wù)器上的文件并播放,支持的文件格式如下:
本次任務(wù)實(shí)現(xiàn)了把live555移植到嵌入式海思芯片hi3516上做rtsp服務(wù)器,除了支持客戶端播放服務(wù)器上上面格式文件外侦高,另添加了實(shí)時(shí)播放hi3516攝像頭圖像與音頻的功能。
二厌杜、源碼結(jié)構(gòu)分析
live555源碼目錄如下:
四個(gè)基本的庫(kù)分別是:BasicUsageEnvironment, groupsock, liveMedia和UsageEnvironment奉呛。
編譯后即生成這4個(gè)庫(kù)文件:
這里我只簡(jiǎn)單說(shuō)下liveMedia庫(kù)的功能,其他三個(gè)庫(kù)是live555運(yùn)行的基礎(chǔ)庫(kù)夯尽,太(mei)簡(jiǎn)(yan)單(jiu),就不說(shuō)了瞧壮。
liveMedia庫(kù)包含了音視頻相關(guān)的所有功能,包含音視頻文件的解析呐萌,RTP傳輸封裝等馁痴,我們可以看到這個(gè)目錄下有對(duì)h264、AAC等文件解析的支持:
源碼目錄下還有一個(gè)mediaServer的文件夾肺孤,這個(gè)是使用live555做rtsp文件服務(wù)器的一個(gè)示例程序。
三济欢、移植到hi3516上
交叉編譯過(guò)程:略
這里我主要是修改mediaServer文件夾下的示例程序赠堵,添加實(shí)時(shí)預(yù)覽攝像頭圖像與mic聲音功能。
hi3516芯片法褥,視頻編碼格式為h264,音頻編碼格式為AAC茫叭。
1.添加音頻AAC支持
添加類ADTSAudioLiveSource,繼承自FramedSource
在該類的doGetNextFrame函數(shù)里實(shí)現(xiàn)獲取hi3516音頻數(shù)據(jù)做為rtsp服務(wù)器音頻源。
注意點(diǎn):
1.1 adts默認(rèn)是帶7字節(jié)或者9字節(jié)的頭半等,傳給rtsp的時(shí)候是要去掉頭的揍愁,實(shí)際上RTSP通過(guò)rtp傳輸AAC幀的時(shí)候是不帶adts頭的,而是帶4個(gè)字節(jié)的mpeg4-generic頭杀饵。
1.2 從FramedSource繼承而來(lái)的變量
fMaxSize----本次最多讀多少字節(jié)
fNumTruncatedBytes---buf中有多少字節(jié)未處理
fFrameSize---本次處理多少字節(jié)
fTo----rtsp的輸入buf
每次doGetNextFrame幀時(shí)莽囤,從FIFO里取一個(gè)完整的AAC幀,把幀拷貝到fTo buf里面切距,然后比較幀大小與fMaxSize來(lái)賦值幾個(gè)關(guān)鍵的變量:
注意朽缎,不管幀長(zhǎng)是否大于fMaxSize,每次都需要把完整的幀拷貝到fTo指針,live555內(nèi)部會(huì)根據(jù)fNumTruncatedBytes等變量自行處理分包话肖。
1.3 doGetNextFrame函數(shù)最后不管有沒(méi)有取到幀北秽,都需要執(zhí)行FramedSource::afterGetting
1.4 采樣率,通道數(shù)最筒,configstr等的計(jì)算
這幾個(gè)變量在mediaSubbsession建立RTPsink時(shí)要用到贺氓,它直接影響了SDP里對(duì)于AAC音頻描述字段的產(chǎn)生
添加類AACAudioLiveServerMediaSubsession,繼承自ADTSAudioFileServerMediaSubsession
createNewStreamSource函數(shù)創(chuàng)建上面的ADTSAudioLiveSource做為音頻輸入源,參數(shù)estBitrate為預(yù)估的碼率床蜘,海思AAC編碼碼率設(shè)置為24kbps,所以estBitrate設(shè)置為24.
createNewRTPSink有必要繼承辙培,因?yàn)樾枰鶕?jù)音頻源的采樣率、通道數(shù)等創(chuàng)建RTPSink.
2.添加h264支持
添加H264FramedLiveSource,繼承自FramedSource
unsigned maxFrameSize()函數(shù)必須繼承悄泥,里面設(shè)置幀最大可能的大小虏冻,我設(shè)置為100000,如果不繼承就是默認(rèn)的弹囚,會(huì)出現(xiàn)畫(huà)面馬賽克
doGetNextFrame函數(shù)里面和AAC取幀的處理差不多厨相,我加多了一個(gè)步驟,就是第一次取幀的時(shí)候會(huì)調(diào)用接口去產(chǎn)生一個(gè)關(guān)鍵幀鸥鹉,并且等待這個(gè)關(guān)鍵幀到來(lái)才處理蛮穿,這樣連接后出圖會(huì)比較快。
添加類H264VideoLiveServerMediaSubsession,繼承自H264VideoFileServerMediaSubsession
這個(gè)類就是實(shí)現(xiàn)createNewStreamSource時(shí)創(chuàng)建H264FramedLiveSource
3.修改DynamicRTSPServer
修改類DynamicRTSPServer毁渗,在lookupServerMediaSession函數(shù)里動(dòng)點(diǎn)手腳践磅,默認(rèn)在這個(gè)函數(shù)里面會(huì)根據(jù)文件名去尋找服務(wù)器下相應(yīng)的文件做為直播源,我這里比較如果是我特定的live源名字則直接返回灸异,相應(yīng)的live源創(chuàng)建rtsp服務(wù)器的時(shí)候就添加好
4.初始化rtsp server
初始化rtsp服務(wù)器府适,添加一個(gè)ServerMediaSession,該mediaSession添加一個(gè)AACAudioLiveServerMediaSubsession和一個(gè)H264VideoLiveServerMediaSubsession肺樟,然后把該mediaSession添加給rtsp服務(wù)器檐春。
客戶端訪問(wèn)rtsp://x.x.x.x/ch0.live時(shí)就可以看到實(shí)時(shí)的攝像頭圖像與聲音啦!