现在的位置: 首页 > 综合 > 正文

Mediastreamer2入门需知–数据结构和常用函数

2013年08月24日 ⁄ 综合 ⁄ 共 2644字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.