当前位置: 首页 > news >正文

live555 rtsp服务器实战之createNewStreamSource

概述

        live555用于实际项目开发时,createNewStreamSource和doGetNextFrame是必须要实现的两个虚函数,一般会创建两个类来实现这两个函数:假如这两个类为H264LiveVideoServerMediaSubssion和H264FramedLiveSource;       

        H264LiveVideoServerMediaSubssion为实时视频会话类,用于实现createNewStreamSource虚函数;

        H264FramedLiveSource为实时视频帧资源类,用户实现doGetNextFrame函数;

        那么这两个函数是什么时候被调用以及他们的作用是什么呢?本节将详细介绍;

声明:该文章基于H264视频源为基础分析,其他源类似;

        由于这两个类主要是自定义虚函数,所以存在一定的继承关系,首先需要明确这两个类的继承关系(本章只介绍H264LiveVideoServerMediaSubssion):

        H264LiveVideoServerMediaSubssion:OnDemandServerMediaSubsession:ServerMediaSubsession:Medium

createNewStreamSource

本章介绍createNewStreamSource函数;

        虚函数createNewStreamSource声明于OnDemandServerMediaSubsession类:

virtual FramedSource* createNewStreamSource(unsigned clientSessionId,unsigned& estBitrate) = 0;

        可以看出声明时为纯虚函数(live555提供的对外接口,用户自定义实现),必须有子类对该函数进行实现;该函数用于获取媒体流源的资源对象,简单点说就是指明服务器调用哪个doGetNextFrame函数获取视频流;

        因此H264LiveVideoServerMediaSubssion类需要继承OnDemandServerMediaSubsession类;

        createNewStreamSource函数实现解析:

FramedSource* H264LiveVideoServerMediaSubssion::createNewStreamSource(unsigned clientSessionId, unsigned& estBitrate)
{/* Remain to do : assign estBitrate */estBitrate = 1000; // kbps, estimate//创建视频源H264FramedLiveSource* liveSource = H264FramedLiveSource::createNew(envir(), Server_datasize, Server_databuf, Server_dosent);if (liveSource == NULL){return NULL;}// Create a framer for the Video Elementary Stream:return H264VideoStreamFramer::createNew(envir(), liveSource);
}

        上述代码就是最基础的虚函数createNewStreamSource的实现,其中H264FramedLiveSource就是视频源资源的类;也就是获取视频帧的函数doGetNextFrame所在的类;该函数主要做了两件事:

1. 创建h264帧资源类对象liveSource;目的是获取调用doGetNextFrame的方法;

2. 返回H264VideoStreamFramer类对象,并将h264帧资源类对象传递进去,最终liveSource赋值给StreamParser类中成员变量fInputSource和FramedFilter类的成员变量fInputSource;

        可以看出这两件事的目的都是为了告诉rtsp服务器怎么获取视频帧数据;关于fInputSource变量什么时候被使用的,请参考我的下篇文章:未知地址!哈哈哈!

        下节的doGetNextFrame分析才是重点,敬请期待!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 目标检测--X-anylabeling使用自己的模型自动标注
  • [C++]多态
  • C语言课程回顾:十、C语言之 指针
  • 推荐一款uniapp拖动验证码插件
  • 从LeetCode215看排序算法
  • Nginx集群部署指南:实现高性能和高可用性
  • qt 创建一个可以拖拽的矩形,简单实践
  • 网站架构核心要素
  • [C/C++入门][字符与ASCII码]6、用代码来转换字符与它的ASCII码
  • 【游戏客户端】大话slg玩法架构(三)建筑控件
  • 线性代数|机器学习-P23梯度下降
  • Perl语言之数组
  • 动手学深度学习(1.3.3 - 1.3.4)与环境互动 强化学习
  • 2.5 计算机网络
  • 车载音视频MediaPlayer优化方案
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • JavaScript中的对象个人分享
  • Linux各目录及每个目录的详细介绍
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • mysql中InnoDB引擎中页的概念
  • nodejs实现webservice问题总结
  • PHP的类修饰符与访问修饰符
  • Theano - 导数
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • 安卓应用性能调试和优化经验分享
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 电商搜索引擎的架构设计和性能优化
  • 飞驰在Mesos的涡轮引擎上
  • 分享几个不错的工具
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 我建了一个叫Hello World的项目
  • 一个完整Java Web项目背后的密码
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 积累各种好的链接
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • ​第20课 在Android Native开发中加入新的C++类
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #WEB前端(HTML属性)
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (function(){})()的分步解析
  • (TOJ2804)Even? Odd?
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (数据结构)顺序表的定义
  • (转)项目管理杂谈-我所期望的新人
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .net core docker部署教程和细节问题
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .net core 的缓存方案
  • .NET Core 通过 Ef Core 操作 Mysql
  • .net framework 4.8 开发windows系统服务
  • .net MVC中使用angularJs刷新页面数据列表