日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LIVE555再学习 -- live555实现RTSP直播服务器 分析

發布時間:2025/3/15 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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?

這兩句道明了三者關系!!


h264LiveFramedSource.cpp 部分主要移植

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直播服务器 分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。