<三:使用,接收端>live555--接收端 testRTSPClient.cpp 源码分析-读取rtsp流demo

10 篇文章 2 订阅

testRTSPClient.cpp 位于live555源码目录 live/testprogs目录下,编译出来 testRTSPClient
可以直接用来接收流,不过这个流接受之后只是打印一下信息,然后丢弃,并没有存储到什么文件。接受流的函数,在DummySink::afterGettingFrame(); 有数据帧接受到会在这里,可以直接修改这个函数来使用live555
例如:
#testRTSPClient rtsp://192.168.43.154:8989/stream

分析源代码:
总的概括,这个类需要继承 MediaSink ,然后实现其中的虚函数:
virtual Boolean continuePlaying();//
依次发送 describe option setup play. 最后调用子类的sink->startPlaying().

testRTSPClient.cpp 中有宏定义:
#define DEBUG_PRINT_EACH_RECEIVED_FRAME 1 //每收到一帧就打印信息
#define REQUEST_STREAMING_OVER_TCP False //是否请求使用rtp-over-tcp 在sendSetupCommand 发送setup命令时候使用

在这里插入图片描述
RTSPClient.cpp 中封装有sendRequest这个方法,只要给一个请求,这个请求有成功之后的回调.
RTSPClient在openConnection连接成功之后会添加一个后台的任务来根据实际情况调用这个回调。所以整个main函数的流程驱动前期主要在这个 回调。后面的读数据的循环,主要在DummySink实现的 continuePlaying() 不断循环调用自身。
获取数据,就是在DummySink::continuePlaying() 这个子类实现的虚函数中。
fSource->getNextFrame(fReceiveBuffer, DUMMY_SINK_RECEIVE_BUFFER_SIZE,
afterGettingFrame, this,
onSourceClosure, this);

上图注释1:源码中有注释,这是一个异步任务。 其中内部,sendRequest有些包装的暗箱操作,因为第一次进来的时候socket没有创建,会调用openConnection()创建socket并connect到服务端,并且添加一个后台任务BackgroundHandlerProc,这个任务在socket有数据可读时读数据处理,然后根据服务器发过来的 respone 从sendRequest的等待回应队列中取request进行匹配,匹配到就会调用 请求成的回调,比如continueAfterDESCRIBE函数。 oop的设计思想,这些链接网络的操作都是封装起来的,按照调用过程来分析很是 ugly, 我觉得其主要目的是 testRTSPClient.cpp 的逻辑调用更加明确简单。其实只有
1.0 continueAfterDESCRIBE() 2.0 continueAfterSETUP() 3.0 continueAfterPLAY() 这三个逻辑调用。

注释二:
创建MediaSession,MediaSessong里面再创建MediaSubsession
setupNextSubsession()->
scs.subsession->initiate()-> createSourceObjects()->
fReadSource = fRTPSourc = H264VideoRTPSource::createNew 创建h264 source

注释三:
startPlaying会调用MediaSink的纯虚函数continuePlaying,由DummySink实现,其实现是一个 不断 调用continuePlaying的循环。补充:
continuePlaying()做的事情:
fSource->getNextFrame (**afterGettingFrame,*)
而这个afterGettingFrame, 会读完一帧数据后被回调。在DummySink中,其实现是:输出了一下收到的帧信息,然后又调用 continuePlaying(), 这样形成一个自身的循环,一直continuePlaying下去

简化一下流程:
在这里插入图片描述
**

补充一下,标准的rtsp会话,应该是 option describe setup play teardownwiki百科对rtsp的描述但这里的demo直接省略了 option

** [option 的作用是向服务器询问支持哪些命令,省略也并非错误]:
实际抓到的包,没有option

补充一个MediaSession的关系:(个人理解)
在这里插入图片描述
官方的一个图解连接

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Initializing Spring DispatcherServlet 'dispatcherServlet' 2023-06-09 19:57:51.583 INFO 1 --- [nio-9211-exec-3] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' 2023-06-09 19:57:51.604 INFO 1 --- [nio-9211-exec-3] o.s.web.servlet.DispatcherServlet : Completed initialization in 21 ms 2023-06-09 19:57:58.676 INFO 1 --- [nio-9211-exec-5] o.apache.coyote.http11.Http11Processor : Error parsing HTTP request header Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level. java.lang.IllegalArgumentException: Invalid character found in the HTTP protocol [RTSP/1.00x0d0x0a0x0d...] at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:560) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:260) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.37.jar!/:9.0.37] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-9.0.37.jar!/:9.0.37] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1589) [tomcat-embed-core-9.0.37.jar!/:9.0.37] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.37.jar!/:9.0.37] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_312] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_312] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.37.jar!/:9.0.37] at java.lang.Thread.run(Thread.java:748) [na:1.8.0_312]
06-11

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值