ZLMediaKit 流媒体服务器RTSP推流时候 directProxy不同设置 时候的处理

news2024/11/26 22:49:49

1.directProxy默认值为1 也就是开启代理 我们先看默认设置下的推流流程

断点断在ringbuffer.h文件的write函数这里不管怎样都要经过这里

然后看堆栈

 整理一下

RingBuffer<std::shared_ptr<toolkit::List<std::shared_ptr<mediakit::RtpPacket> > > >::write
RtspMediaSource::onFlush

PacketCache<mediakit::RtpPacket, mediakit::FlushPolicy, toolkit::List<std::shared_ptr<mediakit::RtpPacket> > >::flush

PacketCache<mediakit::RtpPacket, mediakit::FlushPolicy, toolkit::List<std::shared_ptr<mediakit::RtpPacket> > >::inputPacket

RtspMediaSource::onWrite
RtspMediaSourceImp::onWrite
RtspSession::onRtpSorted
RtpTrackImp::onRtpSorted 
popIterator
popPacket
tryPopPacket
sortPacket
RtpTrack::inputRtp
RtpMultiReceiver<2>::handleOneRtp 
:RtspSession::onRtpPacket
RtspSplitter::onRecvHeader
HttpRequestSplitter::input
RtspSession::onRecv

2.directProxy设置为0时候的推流过程

此堆栈是一直走到写环形队列时候的堆栈

先说结果 不开代理时候的最终为走到这里 由于这个是在头文件 无法下断点 所以把函数体写在cpp文件里 如下:涉及到文件:RtpCodec.h 和RtpCodec.cpp

 

编译之后 gdb开起来直接在这里这个函数下断点 ffmpeg开启rtsp推流

由于包含了视频和音频所以音频数据  视频数据都会走到这

先看音频的AAC数据

 

 

内容太多了看起来有点费劲 直接把调用堆栈写出来吧

RtspMediaSource::onFlush
flush
inputPacket
RtspMediaSource::onWrite
RingBuffer<std::shared_ptr<mediakit::RtpPacket> >::write
RtspMuxer::onRtp
RingDelegateHelper::onWrite
RingBuffer<std::shared_ptr<mediakit::RtpPacket> >::write
RtpRing::inputRtp
AACRtpEncoder::makeAACRtp
AACRtpEncoder::inputFrame
RtspMuxer::inputFrame
RtspMediaSourceMuxer::inputFrame
MultiMediaSourceMuxer::onTrackFrame
MediaSink::addTrack
FrameWriterInterfaceHelper::inputFrame
FrameDispatcher::inputFrame
AACTrack::inputFrame_l
AACTrack::inputFrame
MediaSink::inputFrame
MediaSink::emitAllTrackReady
MediaSink::checkTrackIfReady 
MediaSink::inputFrame
FrameDispatcher::inputFrame
AACTrack::inputFrame_l
AACTrack::inputFrame
FrameDispatcher::inputFrame
AACRtpDecoder::flushData
AACRtpDecoder::inputRtp
RtspDemuxer::inputRtp
RtspMediaSourceImp::onWrite
RtspSession::onRtpSorted 
RtpTrackImp::onRtpSorted
popIterator
popPacket
tryPopPacket
sortPacket
RtpTrack::inputRtp //我们下断点那 也叫inputRtp 中间经历了那么多调用 

RtspSession::onRtpPacket
RtspSplitter::onRecvHeader
HttpRequestSplitter::input
RtspSession::onRecv
TcpServer::onAcceptConnection
Socket::onRead
Socket::attachEvent
EventPoller::runLoop

这个是视频的H264堆栈

 再把视频的写出来

RtpRing::inputRtp
H264RtpEncoder::packRtpStapA
H264RtpEncoder::packRtp
H264RtpEncoder::inputFrame_l
H264RtpEncoder::inputFrame
RtspMuxer::inputFrame 
RtspMediaSourceMuxer::inputFrame 
MultiMediaSourceMuxer::onTrackFrame
MediaSink::addTrack
FrameWriterInterfaceHelper::inputFrame
FrameDispatcher::inputFrame
H264Track::inputFrame_l
H264Track::inputFrame
splitH264
H264Track::inputFrame
MediaSink::inputFrame
MediaSink::emitAllTrackReady
MediaSink::checkTrackIfReady
MediaSink::inputFrame

//之后的堆栈和音频是一样的

可以发现就是在MediaSink::inputFrame函数这里音视频走了不同的调用 函数如下

 本次测试中音频是AACTrack 视频是H264Track

AAC的

这里的AudioTrack::inputFrame走到了基类的FrameDispatcher的inputFrame如下图

 

 这里会走到这个FrameWriterInterfaceHelper的inputFrame

 可以发现这里是一个callback  那么这个callback是在哪里设置的呢

frame.cpp的addDelegate这里 再看下谁调用了这里

 直接给出来 MediaSink的addTrack函数   onTrackFrame那段就是这里设置的cb 已经加上注释

 这样在去看调用堆栈就能看到走到onTrackFrame了 此函数根据不同的协议走到不同的inputFrame中 如下图

这里是RTSP的

 

 

 这里跟据不同的encoder 音视频分开了 AAC走到AACRtpEncoder H264走到 H264RtpEncoder

 

终于走到写环形队列这里了

再看下视频的H264

 

 

 

 视频也走到inputRtp这里了

通过两种方式对比发现 差异就在 onWrite函数这里

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/460601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

架构运维篇(八):Centos7/Linux中Nginx配置HTTPS支持

文章目标 在Nginx中安装HTTPS证书配置Nginx域名映射映射到shop-web和shop-admin两个项目 版本说明 Nginx : 1.22 配置域名 域名&#xff1a;www.baidu.com Nginx安装目录 /www/server/nginx 第一步&#xff1a;安装HTTPS证书 证书一共有两个文件&#xff1a; 1、www…

深入探究AD域审计:ADAudit Plus为您提供全方位保障

AD域审计是一项至关重要的任务&#xff0c;可以帮助组织保护其网络和数据免受黑客和内部威胁的攻击。ADAudit Plus是一种广泛使用的工具&#xff0c;可以帮助IT团队监控域控制器并检测任何安全问题。 ADAudit Plus 首先&#xff0c;ADAudit Plus提供了实时监视和警报功能&…

数字孪生与元宇宙:数字化科技的双向融合之路

概念 &#xff08;1&#xff09;元宇宙&#xff08;Metaverse&#xff09;是一个虚拟的三维世界&#xff0c;由数字内容和物理世界中的现实空间相互交织而成&#xff0c;能够提供各种虚拟体验&#xff0c;例如虚拟现实、增强现实、虚拟社交、虚拟经济等。在元宇宙中&#xff0…

可观测性的力量:性能和可靠性!

可观测性已成为现代 IT 的一个重要方面&#xff0c;预计其重要性在未来几年只会增加。实时监控和了解系统行为的能力为组织提供了大量信息&#xff0c;可以帮助他们提高网络和应用程序的性能、可靠性和整体健康状况。 通过收集和分析来自各种来源的数据&#xff0c;可观察性使组…

JavaWeb-Tomcat

目录 1.什么是Tomcat 2.Tomcat 概述 3.Tomcat基本使用 1.什么是Tomcat Tomcat官网&#xff1a;Apache Tomcat - Welcome! 【摘自百度百科】 Tomcat是Apache 软件基金会&#xff08;Apache Software Foundation&#xff09;的Jakarta 项目中的一个核心项目&#xff0c;由Apac…

测试人必备技能:如何进行WebSocket接口测试?

目录 前言 WebSocket介绍 HTTP与WebSocket的区别 二者关系 WebSocket测试方法 使用Postman 使用Jmeter 使用Python 结语 前言 随着Web应用的日益普及&#xff0c;WebSocket作为一种全双工通信协议&#xff0c;在移动端、游戏、视频会议等方面得到广泛应用。 而对于需…

《程序员面试金典(第6版)》面试题 16.03. 交点(直线的一般式方程,克莱姆法则,行列式,C++)

题目描述 给定两条线段&#xff08;表示为起点start {X1, Y1}和终点end {X2, Y2}&#xff09;&#xff0c;如果它们有交点&#xff0c;请计算其交点&#xff0c;没有交点则返回空值。 要求浮点型误差不超过10^-6。若有多个交点&#xff08;线段重叠&#xff09;则返回 X 值最…

为什么软件测试外包公司更受软件企业欢迎?软件测试报告需要多少钱?

劳动派遣或劳务派遣的用工模式古已有之&#xff0c;是人力资源销售市场不可避免的态势。软件测试顺应时代开展检测业务外包这一行业细分领域&#xff0c;越来越多软件外包公司尤其是小微型企业慢慢意识到了软件测试业务外包通常能够持续减少企业的各种成本费&#xff0c;使企业…

video 视屏播放器详细控制

介绍 canplay、play、pause是video提供的API&#xff0c;在视频加载完成后需要设置视频的总时长duration也是来源于自身的API但是需要格式化时间 设置当前播放时间通过自身API&#xff0c;currentTime function playing(){#id.innerHTMl 格式化时间函数(video.currentTime)…

《用于估计血压变化的光电体积描记图和心电图的特征》阅读笔记

目录 一、摘要 二、十大问题 Q1论文试图解决什么问题&#xff1f; Q2这是否是一个新的问题&#xff1f; Q3这篇文章要验证一个什么科学假设&#xff1f; Q4有哪些相关研究&#xff1f;如何归类&#xff1f;谁是这一课题在领域内值得关注的研究员&#xff1f; Q5论文中提…

maven简单使用

实验课的作业用一大堆框架/库&#xff0c;统统要用maven管理。 头一次用&#xff0c;真痛苦。 所幸得以解决&#xff0c;maven真香&#xff5e; 一步一步来。 1. maven 不是java人&#xff0c;只能说说粗浅的理解了。 简单来说&#xff0c;maven是一个管理项目的工具&…

自定义编码生成

自定义自增编码规则生成 需求场景开发需求需求实现其它 在项目中遇到的需求&#xff0c;这里记录下实现。以下仅供参考&#xff0c;代码有所删减&#xff0c;但核心代码在需求场景 1.需要多个编号规则&#xff0c;不同的场景使用的编码规则不同。 2.编码需要可自定义灵活选择配…

ts定义对象类型Record<string, any>;和object、Object的区别

Record Record 是 TS 内置的一个高级类型&#xff0c;是通过映射类型的语法来生成索引类型的&#xff1a; type Record<K extends string | number | symbol, T> { [P in K]: T; } 比如传入 a | b 作为 key&#xff0c;1 作为 value&#xff0c;就可以生成这样索引类…

Linux安装tomcat以及 对tomcat服务的操作

目录 1、使用FinalShell自带的上传工具将jdk的二进制发布包上传到Linux 2、解压安装包&#xff08;解压到指定位置&#xff0c;-C后面指定位置即可&#xff09; 3、进入Tomcat的bin目录去启动服务&#xff08;两种方式&#xff09; 4、验证Tomcat启动是否成功 方式一&#…

你如何看待,“国内ChatGPT还没成熟,但ChatGPT的付费模式已经成熟了?”

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 说来奇怪&#x1f914;&#xff0c;我们从0到1的事往往较少&#xff0c;但从1到100的嫁衣神功却很多也很快。就像 ChatGPT 还没有…

自有品牌与新兴渠道双轮驱动,丽人丽妆提速起航

2023年4月12日&#xff0c;上海市电子商务行业协会评选出上海市数字商务优秀企业&#xff0c;丽人丽妆凭借在数智化营销领域的专业能力&#xff0c;荣获“上海市数字商务优秀企业”称号。 此次获奖&#xff0c;也反映了丽人丽妆以科技赋能企业高效运营&#xff0c;已经取得突出…

Vue3技术8之Fragment、Suspense、Vue3中其他的改变

Vue3技术8 FragmentTeleport弹窗案例目录结构App.vueChild.vueSon.vueDialog.vue 总结 Suspense普通写法App.vueChild.vue 使用suspense之后App.vueChild.vue 不再自己调整网络低速Child.vueApp.vue 总结补充setup的一个知识点Suspense总结 Vue3中其他的改变全局API的转移其他改…

62 openEuler 22.03-LTS 搭建MySQL数据库服务器-管理数据库

文章目录 62 openEuler 22.03-LTS 搭建MySQL数据库服务器-管理数据库62.1 创建数据库示例 62.2 查看数据库示例 62.3 选择数据库示例 62.4 删除数据库示例 62.5 备份数据库示例 62.6 恢复数据库示例 62 openEuler 22.03-LTS 搭建MySQL数据库服务器-管理数据库 62.1 创建数据库…

一个全端通用的折叠面板,个性定制支持复杂表格

使用uniapp框架全端通用的折叠面板&#xff0c;下载地址见文末 介绍 这是一个全端通用的折叠面板组件&#xff0c;可以折叠/展开的内容区域&#xff0c;支持复杂的表格形式展示&#xff0c;简单的设置即可实现&#xff0c;节省效率必备。 插件含全部源码&#xff0c;可以给您…

Java初学篇——Java语言的发展,特性,基本配置

目录 ps&#xff1a; java的发展 java的特性 java技术体系平台 java的跨平台性 JDK 介绍 安装 Java程序的编译和运行 流程 程序基本框架 一些小知识 注释 常用的转义字符 需要注意的小问题 ps&#xff1a; java算是我第二门系统学习的语言&#xff0c;同时也是我以…