一种从多媒体中抽取音视频的方法

文档序号:7893716阅读:239来源:国知局
专利名称:一种从多媒体中抽取音视频的方法
技术领域
本发明涉及音视频处理领域,尤其是涉及一种从多媒体中抽取音视频的方法。
背景技术
多媒体项目中,往往需要采用特定格式的音频、视频数据进行传输,而数据来源不一,有的是各种格式的媒体文件(flv\rmvb\avi\mp4等等),有的是网络的媒体流(mms等),如果针对每种不同具体源,都进行链路处理,则非常繁琐而且不具有通用性。媒体源主要有文件类型和网络数据流类型两种,我们常见的文件类型有AVI、RMVB, MOV、FLV, MP4等等,每一种文件类型对应着不同的媒体容器,它将各种不同编码的音视频数据进行组织,并按照特定格式封装。常见的网络数据流类型有微软的MMS和RTSP等,它也具有特定的数据格式。面对各种各样的媒体,要想把它包含的音视频数据抽取出来,最简单的方式就是直接读取。按照不同容器格式,编写对应的程序,将文件读取,并进行二进制的解析,分离等工作,最后将音视频数据输出。为了简化一些操作,开源界有一些工具包,简化了操作,比如FFMPEG,功能强大,能够对不同格式的文件和媒体流进行转换,它的内部包含了原始格式文件读写的实现,使得开发人员从繁重的工作中摆脱了出来。但是它侧重于文件转换,而且不够智能,需要人工来识别文件类型,并需要指定解码器以及复杂的参数才能进行处理,也就是说,还需要每种媒体类型都使用不同参数。微软提出了一个DerectShow架构,将每一种媒体(文件和网络流)都抽象成一个数据源过滤器(Filter),将它们之间的共性提取出来,屏蔽掉底层的差异,使用链路的方式构建一个过滤器图表(Filter Graph),当图表建立完成,即可进行播放。无需知道具体是何种格式,也无需指定文件打开的参数,就可以进行自动匹配。微软的媒体播放器就是在这个技术之上实现的成功案例。建立图表有两种方法,一种是手工建立,需要建立每一级的过滤器,手工连接,这个操作比较复杂,同时不具有通用性,换了一台机器可能就连接失败。另外还有智能连接技术,每一种媒体都能自动匹配到最佳链路,但是不能精确控制连接的过程。对于播放器的应用来说,智能连接的方法已经足够完善,因为它自动构建了文件读取、分离、解码、播放的全部过滤器。但是对于抽取媒体数据的应用,这个就实现不了,传统的方法是采用手工构建的方式,如暴风影音的媒体链路技术,就是这样一种方式,将每种媒体格式都做一个或者多个最佳链路的配置,好处是能够快速搭建链路、精确控制播放效果。但是太复杂,暴风自己公布的链路就有几百条,普通应用要维护、管理这些链路是困难的事情。从上面的阐述可以看出,手工处理所有媒体格式的方式最原始,工作量巨大,实 在不可取。使用FFMPEG进行转换,参数设置麻烦,每种格式都要不同的参数进行指定,所以在抽取媒体数据的应用场合中,具有较大局限性。使用DirectShow手工构建链路,工作量也较大,同时每种格式都要不同的配置进行构建。使用智能连接的方式,因为强调的是全自动,所以手工控制方面很弱,只能播放文件,不能抽取数据。

发明内容
本发明主要是解决现有技术所存在的手工构建链路抽取音视频数据工作量大、速度慢、通用性差, 难以获得需要的数据的技术问题,提供一种可以自动构建链路且具有较好通用性的从多媒体中抽取音视频的方法。本发明针对上述技术问题主要是通过下述技术方案得以解决的一种从多媒体中抽取音视频的方法,包括以下步骤
步骤一、构建完整的媒体渲染链路;
步骤二、通过搜索链路的方式,找到最末端的渲染器,然后找到对应的引脚,调用UnConnent方式,将渲染器手动断开;
步骤三、将自定义的若干个过滤器插入链路的断开处,调用Connent方式将断开的渲染器重新连接;
步骤四、通过插入的过滤器抽取音视频数据;
步骤五、将抽取出来的数据进行分流,变作多路输出,然后针对每一路的数据,采用不同的编码参数进行处理;
步骤六、将处理后的数据交给应用层。DirectShow是微软的多媒体框架库,提供了众多的函数方法,Windows系统都支持。过滤器图表Filter Graph是微软DirectShow库中的组件,用于管理过滤器组件,其中包含Render、Run等接口,用于操作过滤器。过滤器Filter是微软DirectShow库中的组件,将它放于图表管理器中,并连接正确,才能发挥作用。过滤器的引脚Pin是过滤器的附属组件,用于过滤器的手动连接操作,提供了Connent、UnConnent 等接口。作为优选,步骤一中,构建媒体渲染链路具体为使用DirectShow智能连接方式,调用图表管理器的Render方法,得到完整的链路图表。作为优选,步骤三中,插入的过滤器包括筛选器。本方案采用DerectShow媒体框架,采用智能渲染,动态插入技术来实现,能够对各种媒体文件、MMS网络流自适应。DerectShow的图表管理器(Graph),提供了 Render方法,能够自动对文件、网络流进行自动的配置,将各个过滤器(Filter)串联在一起,构成完整的播放链路。手动构建的时候,可以先遍历过滤器的引脚(Pin),然后使用引脚的的Connect、UnConnect方法,将不同的过滤器连接在一起,这是手动的方法。注意最末端的是渲染器,它的功能是调用声卡的显卡的底层接口,播放最终的RGB、YUV视频或者PCM格式的音频数据。本发明综合背景技术中各种方案的优点,实现用自动匹配的方式,无需指定参数,就能够抽取音视频数据。本发明的优点是能够支持广泛的媒体格式,并且克服了现有方案的复杂性的问题,能够以不变应万变的方式,简便有效进行数据的抽取。对新的格式也能够很好的支持,具有可扩充性。 同时该方案的思路还可以推广到其它应用场合,比如电影截图、虚拟视频、虚拟音频、视频美化特效等等。


图I是本发明的一种流程 图2是本发明的一种自动构建得到的播放用链路 图3是图2插入筛选器后的链路图。图中1、源过滤器,2、前置过滤器,3、音视频分离器,4、音频解码器,5、音频过滤器,6、音频渲染器,7、视频解码器,8、视频过滤器,9、视频渲染器,10、音频筛选器,11、视频筛选器。
具体实施例方式下面通过实施例,并结合附图,对本发明的技术方案作进一步具体的说明。实施例本实施例的一种从多媒体中抽取音视频数据的方法,如图I所示,具体如下
I.构建完整的媒体渲染链路只要该文件能正常播放,就可以使用DerectShow智能连接的方式,调用图表管理器的Render方法,直接得到完整的链路图表(见图2),多媒体数据依次经过源过滤器I、前置过滤器2后被音视频分离器3分离为音频信号和视频信号,音频信号进入音频解码器4解码后经过音频过滤器5过滤接着进入音频渲染器6渲染播放,视频信号进入视频解码器7解码后经过视频过滤器8过滤接着进入视频渲染器9渲染播放,前置过滤器2、音频过滤器5和视频过滤器8都为过滤器的集合而不仅仅只包含一个过滤器,各种媒体文件和网络媒体都能够得到支持。2.动态插入技术这一步是关键,通过搜索链路的方式,找到最末端的渲染器,然后找到对应的引脚(Pin),调用UnConnect方法,将渲染器手动断开,将自定义的多个过滤器(包含筛选器)插入中间,然后再调用Connect方法,将断开的渲染器重新接起来,这时候就恢复了完整的链路(见图3),具体包含两个部分,一是将音频过滤器5和音频渲染器6之间的连接断开,然后插入音频筛选器10,接着将音频过滤器5的输出和音频筛选器10的输入连接,并将音频筛选器10和音频渲染器6连接;二是将视频过滤器8和视频渲染器9之间的连接断开,然后插入视频筛选器11,接着将视频过滤器8的输出和视频筛选器11的输入连接,并将视频筛选器11和视频渲染器9连接,视频筛选器11和音频筛选器10即为捕捉器,恢复之后文件仍然可以正常播放,但是播放的过程中,数据已经被源源不断的被中间插入的筛选器抽取出来。3.重编码将抽取出来的数据进行分流,变作多路输出,然后针对每一路的数据,采用不同的编码参数进行处理,最后交给应用层。用伪代码的形式说明如下
//初始化的处理
CComPtr< IGraphBuilder > m_pGB;
m—pGB. CoCreateInstance( CLSID—FilterGraph );m—pGB_>RenderFile (〃c:\\myfile. mp4〃,NULL) ; // 可以是任意格式文件
//
//执行到这里,已经构造好完整播放链路,就可以调用nfediaC0ntr0l->Run()的方式,直接出现一个视频播放窗口
//但是现在不是做播放器,所以创新了一下,继续往下走
//
//加入过滤器ACMWrapper IBaseFilter ^pACMWrapper;
AddFilterByCLSID (m—pGB,CLSID_ACMWrapper, —T("ACMWrapper"),&pACMWrapper);//加入过滤器Converter
AddFilterByCLSID(m_pGB, CLSID_AVConverter, —T("Converter"), &pConverter);//加入筛选器CComPtr< ISampleGrabber > m—pAudioGrabber;m_pAudioGrabber. CoCreateInstance ( CLSID_SampIeGrabber );
CComQIPtr< IBaseFilterj &IID_IBaseFilter > pGrabBase ( m—pAudioGrabber );m—pGB_>AddFilter( pGrabBase, L〃audio Grabber");
//数据釆集的时候还出现视频播放窗口是不合适的,所以这里用空的播放窗口代替,这样就不弹出播放窗口
IBaseFilter ^pNullRender = NULL;
hr = AddFiIterByCLSID (m—pGB,CLSID—NulIRenderer,—T ("Nu11Render"),&pNullRender);
//
//动态插入的过程
//将过滤器ACMWrapper替换掉原有的音频Render,最后一个参数指定了音频还是视频,函数内部对断开做了处理
ReplaceRenderFilter(m—pGB, pACMWrapper, TRUE);
//pACMWrapper 连接 pConverter
ConnectFilters(m—pGB, pACMWrapper, pConverter);
//pConverter 连接 pGrabBase
ConnectFilters(m—pGB, pConverter, pGrabBase);
//pGrabBase 连接 pNulIRender
ConnectFilters(m—pGB, pGrabBase, pNullRender);
//链路构造完毕,开始运行链路了 CComQIPtr< IMediaControlj &IID_IMediaControl > pControl = m—pGB; hr = pControl->Run();
//后面的筛选器就源源不断得到了音频原始PCM数据
本实施例能够以不变应万变的方式,处理大部分的媒体类型,对于快速开发特别有效,另外对于不支持的文件格式,还可以扩充,在操作系统中,把对应的源过滤器文件添加到Windows注册表即可支持,原有程序代码一行都不用修改。
同时,本发明还提供了不同格式的数据输出,比如从一个视频文件中可以采用RGB格式抽取,也可以同时抽取YUV格式,多路输出,非常的灵活。这是通过抽取数据后,内部进行色彩空间转换实现的。本文中所描述的具体实施例仅仅是对本发明精神作举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。尽管本文较多地使用了链路、渲染器、过滤器等术语,但并不排除使用其它术语的可能性。使用这些术语仅仅是为了更方便地描述和解释本发明的本质;把它们解释成任何一种附加的限制都是与本发明精神相违背的。·
权利要求
1.一种从多媒体中抽取音视频的方法,基于DirectShow架构,其特征在于,包括以下步骤 步骤一、在过滤器图表中构建完整的媒体渲染链路; 步骤二、通过搜索链路的方式,找到最末端的渲染器,然后找到对应的引脚,调用UnConnent方式,将渲染器手动断开; 步骤三、将自定义的若干个过滤器插入链路的断开处,调用Connent方式将断开的渲染器重新连接; 步骤四、通过插入的过滤器抽取音视频数据,然后执行过滤器图表; 步骤五、将抽取出来的数据进行分流,变作多路输出,然后针对每一路的数据,采用不同的编码参数进行处理; 步骤六、将处理后的数据交给应用层。
2.根据权利要求I所述的一种从多媒体中抽取音视频的方法,其特征在于,所述步骤一中,构建媒体渲染链路具体为使用DirectShow智能连接方式,调用图表管理器的Render方法,得到完整的链路图表。
3.根据权利要求I或2所述的一种从多媒体中抽取音视频的方法,其特征在于,所述步骤三中,插入的过滤器包括筛选器。
全文摘要
本发明公开了一种从多媒体中抽取音视频的方法,主要过程如下一、用DirectShow方式构建完整的媒体渲染链路;二、断开最末端的渲染器;三、在最末端的渲染器之前插入筛选器并恢复连接;四、通过插入的过滤器抽取音视频数据;五、将抽取出来的数据进行分流、处理;六、将处理后的数据交给应用层。至此在播放过程中可以得到音视频数据。本发明能够支持广泛的媒体格式,适用于音视频应用领域。
文档编号H04N21/439GK102710983SQ20121011028
公开日2012年10月3日 申请日期2012年4月16日 优先权日2012年4月16日
发明者陈刚 申请人:杭州米加科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1