【视频开发】【Live555】live555实现h264码流RTSP传输
1.概述
liveMedia 库中有一系列类,基类是Medium,这些类针对不同的流媒体类型和编码。 其中的StreamFrame类文件(如MPEG4VideoStreamFramer)为流传输关键。
2 重要概念:
StreamFrame类:该类继承FramedSource基类,实现数据流的控制和传输。
StreamFrame(H264VideoStreamFramer) -->FramedFilter--> FramedSource----> MediaSource
FramedSource 派继承MediaSource父类,一帧码流的实现。
注意:unsigned char* fTo;为指向发送的码流的指针,采集到视频数据后填充到该指针中即可实现码流的传输。
主要步骤:1.定义自己的StreamFramer类,实现getNextFrame
重写。
getNextFrame
函数来自live\liveMedia\FramedSource
文件,代码见下
- void FramedSource::getNextFrame(unsignedchar* to, unsigned maxSize,
- afterGettingFunc*afterGettingFunc,
- void*afterGettingClientData,
- onCloseFunc*onCloseFunc,
- void*onCloseClientData) {
- // Make sure we're not already beingread:
- if (fIsCurrentlyAwaitingData){
- envir() <<"FramedSource[" <<this <<"]::getNextFrame(): attempting to read more than once at the sametime!\n";
- envir().internalError();
- }
- fTo = to;
- fMaxSize = maxSize;
- fNumTruncatedBytes = 0; // by default;could be changed by doGetNextFrame()
- fDurationInMicroseconds = 0; // bydefault; could be changed by doGetNextFrame()
- fAfterGettingFunc = afterGettingFunc;
- fAfterGettingClientData =afterGettingClientData;
- fOnCloseFunc = onCloseFunc;
- fOnCloseClientData = onCloseClientData;
- fIsCurrentlyAwaitingData = True;
- doGetNextFrame();
- }
其中最后的doGetNextFrame(); 是一个虚函数,具体各种编码模式,我们可以根据自己的码流类型定义一个派生自FramedSource的类(本工程H264FramedLiveSource类), 重新再定义doGetNextFrame如何获得下一帧的码流,在自己重定义的doGetNextFrame() 中将fTo指向要发送的缓存即可。这样我们就实现了流的传输而非文件传输。
本工程中doGetNextFrame()代码如下:
- voidH264FramedLiveSource::doGetNextFrame()
- {
- printf("doGetNextFrame\n");
- if( filesize(fp) > fMaxSize)
- fFrameSize = fread(fTo,1,fMaxSize,fp);
- else
- {
- fFrameSize =fread(fTo,1,filesize(fp),fp);
- fseek(fp, 0, SEEK_SET);
- }
- //fFrameSize = fMaxSize;
- nextTask() =envir().taskScheduler().scheduleDelayedTask( 0,
- (TaskFunc*)FramedSource::afterGetting, this);
- return;
- }
2.实现fTO与会话连接,自定义ServerMediaSubsession
类
定义ServerMediaSubsession类H264LiveVideoServerMediaSubssion,该类由ServerMediaSubsession 派生而来。该类中有私有函数virtual
FramedSource* createNewStreamSource
,在该函数中进行重新定义即可实现。
- FramedSource*H264LiveVideoServerMediaSubssion::createNewStreamSource( unsignedclientSessionId, unsigned& estBitrate )
- {
- /* Remain to do : assign estBitrate */
- estBitrate = 1000; // kbps, estimate
- // Create the video source:
- H264FramedLiveSource* liveSource =H264FramedLiveSource::createNew(envir(), fFileName);
- if (liveSource == NULL)
- {
- return NULL;
- }
- // Create a framer for the Video ElementaryStream:
- returnH264VideoStreamFramer::createNew(envir(), liveSource);
- }
主要最后返回的H264VideoStreamFramer继承自FramedSource,定义了从文件获取source的方法,从而将ServerMedia 与source联系起来。
代码为vs2008工程,采用VLC测试,测试结果如下图所示
代码见http://download.csdn.NET/detail/xiahua882/9619900
注:工程中CaremaLive为该博客代码,MediaServer为live555标准服务器工程也可以运行。代码工程图见下
最新文章
- angular input标签只能单向传递数据的问题
- Samba快速配置
- 事务四大特征:原子性,一致性,隔离性和持久性(ACID)
- Unity3D 几个基本动画(控制物体移动、旋转、缩放)
- Storm的数据处理编程单元:Bolt 学习整理
- Microsoft Office 2007的ContentType
- LaTex中让页码从正文开始编号
- Spring入门(9)-AOP初探
- properties配置文件中文乱码解决方法
- Django处理文件上传File Uploads
- 2014年度辛星html教程夏季版第一节
- PHP手册 – 变量和常量
- 中文字符串的编码转换(c实现)
- 用word2013写博客
- python中read、readline和readlines的区别
- Android 调试工具集【转】
- ASP.NET MVC 解决区域和全局控制器同名的问题
- ASP.NET概念
- 阶段01Java基础day25网络编程
- Android 极光推送造成IM服务绑定失败bug
热门文章
- 使用Visual studio查看exe或DLL文件的依赖项
- 《基于 Web Service 的学分制教务管理系统的研究与实现》论文笔记(十一)
- zookeeper 的 docker 镜像使用
- 关于mysql数据库utf-8问题
- 英语听力,如何成为更好的交谈着https://www.bilibili.com/video/av4279405?from=search&;seid=5889429711390689339
- 微信小程序中登录操作-----与-----引用
- dbt 集成presto试用
- Nginx 和 PHP 和 mysql扩展的安装
- something about 乘法逆元
- [译]深度神经网络的多任务学习概览(An Overview of Multi-task Learning in Deep Neural Networks)