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文件,代码见下

[cpp] view
plain
 copy

  1. void FramedSource::getNextFrame(unsignedchar* to, unsigned maxSize,
  2. afterGettingFunc*afterGettingFunc,
  3. void*afterGettingClientData,
  4. onCloseFunc*onCloseFunc,
  5. void*onCloseClientData) {
  6. // Make sure we're not already beingread:
  7. if (fIsCurrentlyAwaitingData){
  8. envir() <<"FramedSource[" <<this <<"]::getNextFrame(): attempting to read more than once at the sametime!\n";
  9. envir().internalError();
  10. }
  11. fTo = to;
  12. fMaxSize = maxSize;
  13. fNumTruncatedBytes = 0; // by default;could be changed by doGetNextFrame()
  14. fDurationInMicroseconds = 0; // bydefault; could be changed by doGetNextFrame()
  15. fAfterGettingFunc = afterGettingFunc;
  16. fAfterGettingClientData =afterGettingClientData;
  17. fOnCloseFunc = onCloseFunc;
  18. fOnCloseClientData = onCloseClientData;
  19. fIsCurrentlyAwaitingData = True;
  20. doGetNextFrame();
  21. }

其中最后的doGetNextFrame(); 是一个虚函数,具体各种编码模式,我们可以根据自己的码流类型定义一个派生自FramedSource的类(本工程H264FramedLiveSource类), 重新再定义doGetNextFrame如何获得下一帧的码流,在自己重定义的doGetNextFrame() 中将fTo指向要发送的缓存即可。这样我们就实现了流的传输而非文件传输。

本工程中doGetNextFrame()代码如下:

[cpp] view
plain
 copy

  1. voidH264FramedLiveSource::doGetNextFrame()
  2. {
  3. printf("doGetNextFrame\n");
  4. if( filesize(fp) >  fMaxSize)
  5. fFrameSize = fread(fTo,1,fMaxSize,fp);
  6. else
  7. {
  8. fFrameSize =fread(fTo,1,filesize(fp),fp);
  9. fseek(fp, 0, SEEK_SET);
  10. }
  11. //fFrameSize = fMaxSize;
  12. nextTask() =envir().taskScheduler().scheduleDelayedTask( 0,
  13. (TaskFunc*)FramedSource::afterGetting, this);
  14. return;
  15. }

2.实现fTO与会话连接,自定义ServerMediaSubsession

 定义ServerMediaSubsession类H264LiveVideoServerMediaSubssion,该类由ServerMediaSubsession 派生而来。该类中有私有函数virtual FramedSource* createNewStreamSource,在该函数中进行重新定义即可实现。

[cpp] view
plain
 copy

  1. FramedSource*H264LiveVideoServerMediaSubssion::createNewStreamSource( unsignedclientSessionId, unsigned& estBitrate )
  2. {
  3. /* Remain to do : assign estBitrate */
  4. estBitrate = 1000; // kbps, estimate
  5. // Create the video source:
  6. H264FramedLiveSource* liveSource =H264FramedLiveSource::createNew(envir(), fFileName);
  7. if (liveSource == NULL)
  8. {
  9. return NULL;
  10. }
  11. // Create a framer for the Video ElementaryStream:
  12. returnH264VideoStreamFramer::createNew(envir(), liveSource);
  13. }

主要最后返回的H264VideoStreamFramer继承自FramedSource,定义了从文件获取source的方法,从而将ServerMedia 与source联系起来。

代码为vs2008工程,采用VLC测试,测试结果如下图所示

代码见http://download.csdn.NET/detail/xiahua882/9619900

注:工程中CaremaLive为该博客代码,MediaServer为live555标准服务器工程也可以运行。代码工程图见下

最新文章

  1. angular input标签只能单向传递数据的问题
  2. Samba快速配置
  3. 事务四大特征:原子性,一致性,隔离性和持久性(ACID)
  4. Unity3D 几个基本动画(控制物体移动、旋转、缩放)
  5. Storm的数据处理编程单元:Bolt 学习整理
  6. Microsoft Office 2007的ContentType
  7. LaTex中让页码从正文开始编号
  8. Spring入门(9)-AOP初探
  9. properties配置文件中文乱码解决方法
  10. Django处理文件上传File Uploads
  11. 2014年度辛星html教程夏季版第一节
  12. PHP手册 – 变量和常量
  13. 中文字符串的编码转换(c实现)
  14. 用word2013写博客
  15. python中read、readline和readlines的区别
  16. Android 调试工具集【转】
  17. ASP.NET MVC 解决区域和全局控制器同名的问题
  18. ASP.NET概念
  19. 阶段01Java基础day25网络编程
  20. Android 极光推送造成IM服务绑定失败bug

热门文章

  1. 使用Visual studio查看exe或DLL文件的依赖项
  2. 《基于 Web Service 的学分制教务管理系统的研究与实现》论文笔记(十一)
  3. zookeeper 的 docker 镜像使用
  4. 关于mysql数据库utf-8问题
  5. 英语听力,如何成为更好的交谈着https://www.bilibili.com/video/av4279405?from=search&amp;seid=5889429711390689339
  6. 微信小程序中登录操作-----与-----引用
  7. dbt 集成presto试用
  8. Nginx 和 PHP 和 mysql扩展的安装
  9. something about 乘法逆元
  10. [译]深度神经网络的多任务学习概览(An Overview of Multi-task Learning in Deep Neural Networks)