LIVE555再学习 -- live555实现RTSP直播服务器 分析
上一篇文章?講到了 live555實現RTSP直播服務器,但是篇幅有點長,沒有來得及對源碼進行分析。
這篇文章就好好看看,源碼部分這次參看Linux版本下的?通過live555實現H264 RTSP直播?(代碼太繁瑣)
然后還可以結合?live555直播(準備2)-重寫doGetNextFrame()和doEventLoop()?這篇文章來講。
這哥們寫的這幾篇文章,都是很不錯的。可以關注一下。
他的?DM365+live555實現RTSP直播服務器(廣播)?,正是我要實現的結果。
一、源碼分析
一下源碼分析以參看?通過live555實現H264 RTSP直播(Windows版)?為主。
查看?testOnDemandRTSPServer.cpp 源碼 h264 部分。
你可以看到,我參看的這幾篇文章里,都是 修改為自己實現的H264LiveVideoServerMediaSubssion ?
然后就涉及到自寫?H264LiveVideoServerMediaSubssion.hh、H264LiveVideoServerMediaSubssion.cpp
可以對比官方源碼,看看自己實現的和官網源碼有啥不一樣。
H264LiveVideoServerMediaSubssion.hh 主要移植這幾部分,省去了 fileName?
再有就是創建類,繼承自 H264VideoFileServerMediaSubsession
但是我看到 Linux 那篇是用的?OnDemandServerMediaSubsession ?
H264LiveVideoServerMediaSubssion.cpp?主要移植這幾部分
最后這里有一個?H264LiveFramedSource 它是自己建的類,對應的即官網源碼的 ByteStreamFileSource
然后就涉及到自寫?h264LiveFramedSource.hh、h264LiveFramedSource.cpp
可以對比官方源碼,看看自己實現的和官網源碼有啥不一樣。
h264LiveFramedSource.hh?主要移植這幾部分,還是將 fileName 去掉了。
再有就是創建類,繼承自 ByteStreamFileSource 這里有點懵逼,不知道為什么要用?ByteStreamFileSource 因為我看其他兩個博客里用的是 FramedSource?
PS:window版本博文了已經說明了
通過“基礎”中的分析可以得出,想實現自定義服務器,需要將sms->addSubsession(H264VideoFileServerMediaSubsession::createNew(*env, inputFileName,reuseFirstSource)),中的H264VideoFileServerMediaSubsession替換成自己的子會話。H264VideoFileServerMediaSubsession類在其createNewStreamSource(unsigned /*clientSessionId*/, unsigned& estBitrate)函數中調用了ByteStreamFileSource::createNew(envir(), fFileName),而 frame 的獲取正是在 ByteStreamFileSource 類中的 doGetNextFrame() 函數中實現的。因此,這里需要繼承H264VideoFileServerMediaSubsession 和 ByteStreamFileSource類,并重寫其中的createNewStreamSource 和 doGetNextFrame 函數。
這部分概念:
參看:live555學習-ByteStreamFileSource和H264VideoStreamFramer
參看:live555學習-FramedSource詳解
FramedSource?是一個抽象類,繼承自mediaSource繼承自medium,里面有純虛函數virtual void doGetNextFrame?();
此函數初始化了幾個必要參數,并調用了純虛函數doGetNextFrame();此函數留給派生類實現,例如ByteStreamFileSource?類
這兩句道明了三者關系!!
window版本博文了已經說明了,這里不使用命名管道來實現,而是直接讀取本地H264文件,分解成StartCode+NALU 內存塊,然后拷貝到 Live555 Server 。這樣一來,就很容易改成命名管道的形式,命名管道的客戶端只需讀取本地H264文件,分解成StartCode(0x000001或0x00000001)+NALU內存塊,并寫入管道,命名管道服務器端(在Live555 Server中)讀取管道數據,并拷貝到Live555 Server。
它對應官方源碼這部分
再有
它對應官方源碼這部分
最后是?doGetNextFrame 這部分有點意思
這部分有參看源碼部分:
跳轉查看?doReadFromFile
這部分還有一個很重要的地方。
比如,我想用 DM368 + live555 實現RTSP 直播怎么辦?
在 demo 的 encode 里有個?writer.c 找到里面有獲取一幀的部分
if (fwrite(Buffer_getUserPtr(hOutBuf), Buffer_getNumBytesUsed(hOutBuf), 1, outFile) != 1) { ERR("Error writing the encoded data to video file\n"); 這里的 Buffer_getUserPtr(hOutBuf) ?即可獲取一幀一幀的數據。
它等同于上述代碼的 inBuf 將其替換,然后解析 test.264 那一套刪除了,就可以。就這么簡單粗暴!!!
直播、多播 參看:DM365+live555實現RTSP直播服務器(廣播)
在h264LiveMediaServer.cpp主要是下面這部分做相應的修改
它對應官方源碼下面這部分
這樣就回到本文開始講的了,源碼分析到此結束!!
二、doEventLoop 源碼分析
在最后部分有這樣一段
有時我們有必要重寫 ?doEventLoop 的
得,我們先看一下源碼
跳轉查看?doEventLoop ? 注釋:反復循環,處理readble套接字和定時事件:
講解部分:
參看:live555 env->taskScheduler().doEventLoop()解析/自己實現
參看:live555直播(準備2)-重寫doGetNextFrame()和doEventLoop()
自行查看吧,我是太懶了,不想看!!
直接看怎么重寫?doEventLoop 函數:
執行:
總結
以上是生活随笔為你收集整理的LIVE555再学习 -- live555实现RTSP直播服务器 分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言一元二次方程
- 下一篇: LIVE555再学习 -- FFmpeg