Source和Sink:可以把source理解为发送端的流,sink理解为接受端。MediaSink是各种类型的Sink的基类,MediaSource是各种类型Source的基类,各种类型的流媒体格式

本文主要是介绍Source和Sink:可以把source理解为发送端的流,sink理解为接受端。MediaSink是各种类型的Sink的基类,MediaSource是各种类型Source的基类,各种类型的流媒体格式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Source和Sink:可以把source理解为发送端的流,sink理解为接受端。MediaSink是各种类型的Sink的基类,MediaSource是各种类型Source的基类,各种类型的流媒体格式和编码的支持即是通过对这两个类的派生实现的。Source和Sink通过RTP子会话(MediaSubSession)联系在一起。

 

   FramedSource 派生自MediaSource, 一帧码流的实现。私有unsigned char* fTo; // in  是指向发送的码流的指针。

重要的函数有 getNextFrame

void  FramedSource::getNextFrame(unsigned char * to, unsigned maxSize,
                 afterGettingFunc* afterGettingFunc,
                 void * afterGettingClientData,
                 onCloseFunc* onCloseFunc,
                 void * onCloseClientData) {
   // Make sure we're not already being read:
   if  (fIsCurrentlyAwaitingData) {
     envir() << "FramedSource["  << this  << "]::getNextFrame(): attempting to read more than once at the same time!\n" ;
     envir().internalError();
   }
   fTo = to;
   fMaxSize = maxSize;
   fNumTruncatedBytes = 0; // by default; could be changed by doGetNextFrame()
   fDurationInMicroseconds = 0; // by default; could be changed by doGetNextFrame()
   fAfterGettingFunc = afterGettingFunc;
   fAfterGettingClientData = afterGettingClientData;
   fOnCloseFunc = onCloseFunc;
   fOnCloseClientData = onCloseClientData;
   fIsCurrentlyAwaitingData = True;
   doGetNextFrame();
}

  

doGetNextFrame(); 是一个虚函数,具体各种编码模式,我们可以根据自己的码流类型定义一个派生自FramedSource的类, 重新再定义doGetNextFrame如何获得下一帧的码流。在自己重定义的doGetNextFrame() 中将fTo指向要发送的缓存。
<br><br>我们可以通过doGetNextFrame() 是fTo重定向我们要发送的流,而不是从文件中读取。(搞定了source)之后就是要如何让fTo与发送会话连接起来,OnDemandServerMediaSubsession由 ServerMediaSubsession 派生而来,其有一个新的私有函数 virtual  FramedSource* createNewStreamSource,我们又可以重新定义一个派生自OnDemandServerMediaSubsession 的类,重新定义createNewStreamSource 将fTo 与 ServerMedia联系起来。<br>如下live555中的例子<br><br>
复制代码
FramedSource* H264VideoFileServerMediaSubsession::createNewStreamSource(unsigned /*clientSessionId*/, unsigned& estBitrate) {estBitrate = 500; // kbps, estimate// Create the video source:ByteStreamFileSource* fileSource = ByteStreamFileSource::createNew(envir(), fFileName);if (fileSource == NULL) return NULL;fFileSize = fileSource->fileSize();// Create a framer for the Video Elementary Stream:return H264VideoStreamFramer::createNew(envir(), fileSource);
}
复制代码
ByteStreamFileSource说到底还是继承自FramedSource,定义了从文件获取source的方法,而这个函数又将ServerMedia 与source联系了起来,
ServerMedia 就知道该发送什么东东了。  return H264VideoStreamFramer::createNew(envir(), fileSource); 给 ServerMedia  返回了一个 FramedSource 。
不过,如果自己定义的ServerMedia直接从 OnDemandServerMediaSubsession 继承的话,有很多纯虚函数需要自己去实现,比较麻烦,所以可以直接从
H264VideoFileServerMediaSubsession 继承,它实现了这些纯虚函数,我们只需重定义createNewStreamSource 就ok了。
 
 
FROM:  http://www.cnblogs.com/mlj318/archive/2013/01/23/2871952.html

这篇关于Source和Sink:可以把source理解为发送端的流,sink理解为接受端。MediaSink是各种类型的Sink的基类,MediaSource是各种类型Source的基类,各种类型的流媒体格式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/743752

相关文章

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Python手搓邮件发送客户端

《Python手搓邮件发送客户端》这篇文章主要为大家详细介绍了如何使用Python手搓邮件发送客户端,支持发送邮件,附件,定时发送以及个性化邮件正文,感兴趣的可以了解下... 目录1. 简介2.主要功能2.1.邮件发送功能2.2.个性签名功能2.3.定时发送功能2. 4.附件管理2.5.配置加载功能2.6.

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

解决Cron定时任务中Pytest脚本无法发送邮件的问题

《解决Cron定时任务中Pytest脚本无法发送邮件的问题》文章探讨解决在Cron定时任务中运行Pytest脚本时邮件发送失败的问题,先优化环境变量,再检查Pytest邮件配置,接着配置文件确保SMT... 目录引言1. 环境变量优化:确保Cron任务可以正确执行解决方案:1.1. 创建一个脚本1.2. 修

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

Django中使用SMTP实现邮件发送功能

《Django中使用SMTP实现邮件发送功能》在Django中使用SMTP发送邮件是一个常见的需求,通常用于发送用户注册确认邮件、密码重置邮件等,下面我们来看看如何在Django中配置S... 目录1. 配置 Django 项目以使用 SMTP2. 创建 Django 应用3. 添加应用到项目设置4. 创建

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。