Mediastreamer2入门需知--数据结构和常用函数
2014-12-31 11:17
246 查看
Mediastreamer2是开源的流媒体处理框架,它负责对媒体传输、处理、保存、播放等过程的抽象和调度。
Mediastreamer2中的两个重要概念:filter、graph,有些词用中文翻译后就会变味,其实很多音视频框架或软件也都有用到filter这个词
1)filter:filter是Mediastreamer2中处理媒体数据的组件,1个filter可以有多个input、output,这些inputs、outputs其
实就是缓冲区队列。
Mediastreamer2中用MSFilter对象来抽象处理过程的每个步骤。
每个MSFilter对象都有相应的描述符,用数据结构MSFilterDesc描述符表示,该结构描述了MSFilter对象的ID、名字、输入输出脚的个数、初始化函数、预处理和处理等函数;每个MSFilter对象也拥有自己的MSQueue(inputs、outputs)。
Mediastreamer2的媒体流可通过RTP进行收发、媒体流的接收、发送、媒体流的播放、编码、解码都可用filter来表示,例如
媒体流接收MSRtpRecv就是一个Mediastreamer2的一个MSfilter对象,它表示从使用RTP协议在网络中接收数据,在解包后把数
据输出到缓冲区队列。
其实也就是说filter之间通过共享消息队列的方式来进行数据通信。
2)graph:graph是多个连在一起的filter管理器,通过系统管理和调度,它把媒体流从1个fiilter的output传输到下一个
filter的input。
Mediastreamer2提供了ms_filter_link函数把MSFilter对象链接起来,形成多个filter的graph,
ms_filter _link ( first _filter,output _pin,second _ filter, input _pin) ;
由上述可知,ms_filter_link可实现2个MSFilter对象的数据共享。
形成graph后,就需对MSFilter对象进行调度,调度由MSTicker对象完成的:
MSTicker ticker = ms_ticker_new();
ms_ticker_attach(ticker,MSFilter*);
mediastreamer2处理音频的机制:
接收链路:
发送链路: 声卡采集(filter) --》 音频处理(filter) --》 音频编码 --》 Rtp包发送(filter)
Rtp包接收(filter) --》 音频解码(filter) --》音频处理(filter) --》 Tee(filter) --》 声卡播放(filter)
|
----》 wav保存(filter)
Mediastreamer2的source code中将音频流建立封装在函数audio_stream_start_full中,
audio_stream_start_full:该函数的主要目标是完成对AudioStream中的各filter 的初始化,设置该通话过程中要用的的
声卡读写、Rtp 数据发送/接收、编码、编码器的过程,首先该函数加载Rtp 的PayLoad_Type,以及jitter 补偿,同时调用
ms_filter_call_method 来对Rtp 的其它属性进行初始化,并将filter链接成接收及发送两条音频处理链,最后,启动ticker
,使音频链路开始工作
而VideoStream则由video_stream_start函数来完成。
audio_stream_new: 创建新的AudioStream,并对RtpSession 和filter rtpsend 进行初始化。
初始化filter :MSFilter* ms_filter_new(MSFilterId id)函数进行初始化,该函数通过MSFilterId id参数初始化一个Filter,并将新建的Filter通过函数返回给调用者。
ms_filter_create_decoder:通过AutoStream或VideoStream的参数查找RtpSession中对应的payload,然后根据payload里面的mime类型创建解码器滤波器。首先找到符合MS_FILTER_DECODER和mime的MSFilterDesc,通过ms_filter_new_from_desc绑定MSFilter。
ms_connection_helper_start(MSConnectionHelper *helper) 建立一个helper,helper是一个结构体
ms_connection_helper_link(MSConnectionHelper* helper,MSFilter* filter,int inpin,int outpin)将filter连接起来,对helper的操作,可以很方便的将filter加入链路的尾端,其实这个函数是对ms_filter_link的封装
ms_filter_link(MSFilter* f1,int pin1,MSFilter* f2,int pin2)则是将f1的pin1接口作为输出端口,将f2的pin2接口作为输入接口,进行链接。
Filter void audio_stream_record(AudioStream *st,const char *name)函数设置录音文件的路径,该函数是对 int ms_filter_call_method(MSFilter* f,unsigned int id,void *arg)函数的包装。
int ms_filter_call_method(MSFilter* f,unsigned int id,void *arg)函数通过第二个参数 unsigned int id来找到执行方法时所挂载的函数,第三个参数,为传入该挂载函数的参数。
audio_stream_record(stream,"/tmp/1.wav") 链路的录音文件定位在/tmp/1.wav
Mediastreamer2中的两个重要概念:filter、graph,有些词用中文翻译后就会变味,其实很多音视频框架或软件也都有用到filter这个词
1)filter:filter是Mediastreamer2中处理媒体数据的组件,1个filter可以有多个input、output,这些inputs、outputs其
实就是缓冲区队列。
Mediastreamer2中用MSFilter对象来抽象处理过程的每个步骤。
每个MSFilter对象都有相应的描述符,用数据结构MSFilterDesc描述符表示,该结构描述了MSFilter对象的ID、名字、输入输出脚的个数、初始化函数、预处理和处理等函数;每个MSFilter对象也拥有自己的MSQueue(inputs、outputs)。
Mediastreamer2的媒体流可通过RTP进行收发、媒体流的接收、发送、媒体流的播放、编码、解码都可用filter来表示,例如
媒体流接收MSRtpRecv就是一个Mediastreamer2的一个MSfilter对象,它表示从使用RTP协议在网络中接收数据,在解包后把数
据输出到缓冲区队列。
其实也就是说filter之间通过共享消息队列的方式来进行数据通信。
2)graph:graph是多个连在一起的filter管理器,通过系统管理和调度,它把媒体流从1个fiilter的output传输到下一个
filter的input。
Mediastreamer2提供了ms_filter_link函数把MSFilter对象链接起来,形成多个filter的graph,
ms_filter _link ( first _filter,output _pin,second _ filter, input _pin) ;
由上述可知,ms_filter_link可实现2个MSFilter对象的数据共享。
形成graph后,就需对MSFilter对象进行调度,调度由MSTicker对象完成的:
MSTicker ticker = ms_ticker_new();
ms_ticker_attach(ticker,MSFilter*);
mediastreamer2处理音频的机制:
接收链路:
发送链路: 声卡采集(filter) --》 音频处理(filter) --》 音频编码 --》 Rtp包发送(filter)
Rtp包接收(filter) --》 音频解码(filter) --》音频处理(filter) --》 Tee(filter) --》 声卡播放(filter)
|
----》 wav保存(filter)
Mediastreamer2的source code中将音频流建立封装在函数audio_stream_start_full中,
audio_stream_start_full:该函数的主要目标是完成对AudioStream中的各filter 的初始化,设置该通话过程中要用的的
声卡读写、Rtp 数据发送/接收、编码、编码器的过程,首先该函数加载Rtp 的PayLoad_Type,以及jitter 补偿,同时调用
ms_filter_call_method 来对Rtp 的其它属性进行初始化,并将filter链接成接收及发送两条音频处理链,最后,启动ticker
,使音频链路开始工作
而VideoStream则由video_stream_start函数来完成。
audio_stream_new: 创建新的AudioStream,并对RtpSession 和filter rtpsend 进行初始化。
初始化filter :MSFilter* ms_filter_new(MSFilterId id)函数进行初始化,该函数通过MSFilterId id参数初始化一个Filter,并将新建的Filter通过函数返回给调用者。
ms_filter_create_decoder:通过AutoStream或VideoStream的参数查找RtpSession中对应的payload,然后根据payload里面的mime类型创建解码器滤波器。首先找到符合MS_FILTER_DECODER和mime的MSFilterDesc,通过ms_filter_new_from_desc绑定MSFilter。
ms_connection_helper_start(MSConnectionHelper *helper) 建立一个helper,helper是一个结构体
ms_connection_helper_link(MSConnectionHelper* helper,MSFilter* filter,int inpin,int outpin)将filter连接起来,对helper的操作,可以很方便的将filter加入链路的尾端,其实这个函数是对ms_filter_link的封装
ms_filter_link(MSFilter* f1,int pin1,MSFilter* f2,int pin2)则是将f1的pin1接口作为输出端口,将f2的pin2接口作为输入接口,进行链接。
Filter void audio_stream_record(AudioStream *st,const char *name)函数设置录音文件的路径,该函数是对 int ms_filter_call_method(MSFilter* f,unsigned int id,void *arg)函数的包装。
int ms_filter_call_method(MSFilter* f,unsigned int id,void *arg)函数通过第二个参数 unsigned int id来找到执行方法时所挂载的函数,第三个参数,为传入该挂载函数的参数。
audio_stream_record(stream,"/tmp/1.wav") 链路的录音文件定位在/tmp/1.wav
相关文章推荐
- Mediastreamer2入门需知--数据结构和常用函数
- BREW开发教程(8):常用数据结构及函数
- 【openCV入门之三】数据结构和绘图函数
- oracle基础(数据类型、常用函数)
- Linux编程常用的函数(十一) 系统数据文件和信息
- javascript入门·向函数传递表单数据和元素(赠送一小技巧) .txt
- emacs入门技巧:常用定制函数
- PL/SQL的数据类型和常用函数
- kernel2.6.9与kernel2.6.18内核的一些函数,数据结构
- javascript入门·向函数传递表单数据和元素(赠送一小技巧)
- javascript入门·向函数传递表单数据和元素(赠送一小技巧)
- vxworks常用数据结构
- K3系统常用数据表结构(工业版)
- VC中char,wchar_t,TCHAR及相应字符串处理函数辨析(附常用数据类型转换)
- 硬盘数据恢复入门教程[一]----数据结构篇
- C#2005 .NET3.0高级编程学习笔记————类和结构,类的数据成员,类的函数成员(方法、属性)
- 常用数据表结构修改sql语句(oracle)
- javascript入门·向函数传递表单数据和元素(赠送一小技巧)
- PL/SQL的数据类型和常用函数
- 常用递归结构数据表,返会指点节点,跟其子节点的操作