一种多媒体客户端视音频引擎的实现方法
关键词:视音频引擎 DirectX H.264 Speex
中图分类号:TP391.41 文献标识码:A 文章编号:1007-9416(2016)01-0000-00
1 引言
当前,大多数网络视频会议及实时工作平台的工作方式都是依托多媒体客户端开展的,在多媒体客户端所能提供的服务当中,视音频服务最为重要,而且,伴随着计算机网络技术的不断进步,视音频服务已成为其重中之重,因此,设计并实现高质量的视音频引擎服务已成为当前的热点。本设计来源于互联网会议系统的引擎开发项目,其目的是研发一套可以满足实用功耗小、占用带宽低、主观质量好要求,且可以支持互联网会议服务的视音频引擎系统,该引擎可以提供应用开发人员多样模式的接口,从而使用户获得更好的实际体验,进而降低了互联网会议系统研制的成本。
2 视音频引擎的设计与实现
视音频引擎所要提供的服务,首先是对视音频数据的采集。在视音频编解码技术中,H.264及Speex以其良好的实用性被用户广泛使用,所以,本设计选用H.264及Speex作为终端编解码方式。据引擎功能的实现,可将其分为三个应用模块:(1)视音频数据采集模块;(2)视音频数据编解码模块;(3)视音频数据播放模块。文中引擎的设计就是依据上述三个模块进行研究的。
2.1 视音频数据采集
引擎提供的视音频服务,首先是对其数据进行采集,视频和语音的采集是在摄像头与麦克风打开的同时进行的。
2.1.1 视音频设备的获取
在采集的初始时刻,应用程序先判定系统中视音频设备的可用性,然后通过DirectShow创建系统设备的明细表,这样可以便与选择相应的设备来进行工作。当设备选定后,程序将记录该设备的ID,并开始数据捕捉。
2.1.2 视音频数据的捕获
在获取设备的ID后,开始捕捉数据,系统通过辨认ID来打开指定设备,同时开始数据采集,并通过回调函数MMGrabber取出视音频数据。
(1)IcaptureGraphBuilder2接口初始化。对于应用DirectShow实现的视音频捕捉,在建立应用程序时,DirectShow提供一个名为Capture Graph Builder的对象,并提供一个IcaptureGraphBuilder2的接口,通过调用该接口可实现Capture Graph的建立与控制。在建立视频捕捉程序时,应先获取并初始化IcaptureGraphBuilder2接口,然后选择视频捕捉设备。(2)创建Capture filter。在完成接口初始化并选定设备后,应创建对应设备的Capture filter。创建完毕后,通过调用AddiFilter将对应设备的Capture filter添加到Filter Graph中,从而开始视音频数据的采集。(3)实现视音频数据捕获。在完成设备Capture filter的创建及添加后,启动系统程序并运行,此时DirectShow将实时捕获的对应视音频设备的视频数据,并交送给系统的编解码模块,从而进行后续的视音频压缩编解码处理。
2.2 视音频数据编解码
为了减小互联网传输数据量的容量,视音频数据必须要经过压缩处理,所以,要选取合适的视音频编解码方案才可实现互联网终端的快速传输。在本设计中,分别以H.264和Speex作为视音频的编解码方式,从而实现数据的压缩与解压缩处理。
视音频数据的编解码操作分为:发送端编码操作和接收端解码操作。
2.2.1 发送端编码处理
(1)编码器创建。图1所示为发送端编码处理的流程图,由图1可知,发送端编码处理的初始环节是要进行编码器的创建,编码器的工作是对视音频帧进行编码。本设计采用Video_CreateEncoder来创建编码器,在创建编码器前,预先定义需要的变量。(2)动态调整参数。在视音频编码器创建后,需要启动运行过程中的动态参数调整许可,即允许动态设置编码器参数。当参数重设后,编码器将根据新的参数进行操作。对于重置编码参数,需要调用数x264_param_parse重置参数,并且需调用x264_encoder_reconfig进行参数更新。(3)视音频编码。当编码器创建完成之后,采用video_EncodeFrame对视音频数据进行编码。在编码处理时,通过相应参数确定编码器ID,之后,传入内存中的初始数据信息。四、销毁编码器。当完成视音频数据的编码操作后,需要销毁已经建立好的编码器,此时,需要调用函数 video_ReleaseEncoder来完成。当调用video_release_encoder时,其内部会调用x264_picture_clean清理对应编码器里的结构空间,并应用x264_encoder_close销毁编码器。
2.2.2 接收端解码处理
(1)解码器创建。图2所示为接收端解码处理的基本流程图。在程序初始化时,程序首先会创建一个解码器。同创建编码器相比,程序将采用函数video_create_decoder创建一个解码器。程序首先绘制遍历链表,并查找H.264和Speex解码器,之后初始化参数,同时,解码器的创建操作也相应完成。(2)数据帧解码。在解码器创建完成后,开始进行解码操作。当已压缩好的视频数据被转入接收端时,创建的解码器将进行视音频帧数据解码。在解压操作完成后,将会转入播放接口进行视音频播放。为了便于操作,设置视音频数据解码操作函数video_decode_frame为双输入型,除了需制定解码器的ID外,就是定制两段存储空间,其中一段存储解码前信息,另一段存储解码后信息。(3)销毁解码器。解码器与编码器的创建于销毁都是相对应的,均是资源的分配与回收。当程序结束时,为了释放所占用的资源,为后续操作留下足够空间,需要销毁解码器。当应用程序结束时,会按照流程销毁解码器,通过调用函数video_ReleaseDecoder和x264_encoder_close来释放解码器所占资源和销毁编码器。2.3 视音频数据播放
2.3.1 视频播放
在解码处理后,需要在窗口中显示图像,这时应使用显示窗口函数进行处理。
(1)视频显示窗口创建。视频显示仍需要DirectShow支持,首先,应创建一个视频显示窗口。由于程序的运行环境是在Windows系统下进行的,所以,在视频显示窗口创建时,应将Windows句柄作为参数输入。在结束视频窗口操作时,同样,会释放视频窗口资源。在窗口创建后,需要显示缓冲区的数据,此时,应输入一些窗口的对应参数以完成视频显示准备。(2)视频显示。无论针对本地图像或是远端图像,都将使用显示功能函数来获取支持。本系统设计了Render系列函数来支持这些功能,render_CreateRender、render_DrawBuffer和render_ReleaseRender,分别实现创建一个视频显示窗口、显示缓冲区中数据和释放一个视频显示窗口。在视频图像显示时,仍需要使用DirectDraw接口来辅助完成。
2.3.2 音频播放
对于音频播放,应首先创建DirectSound对象,然后填充DSBUFFERDESC结构(该结构体保存了缓冲区的重要信息)。DirectSound播放声音的难点是对缓冲存储区处理,其中关键环节就是对缓冲存储区的加锁操作,由于要保证声音的连续播放,就需不断的循环缓冲区内存数据。在声音播放时,负责读取数据的“读指针”伴随着读取的进行而不断向前,当移动到存储空间的结束位置时,将跳到缓冲存储区的开始位置继续进行读操作。添加数据的“写指针”必须滞后于播放数据的“读指针”,只有这样才能保证播放的连贯。在实际操作时,设置通知点是较易出错的地方。在DirectSound中,LPDIRECTSOUNDNOTIFY结构体SetNotificationPositions函数负责设置通知点。在定义通知点时,需要设定好DSBPOSITIONNOTIFY结构(保存着通知点距离内存起始位置的偏移量以及系统时间通知句柄)。当负责播放的游标到达通知所在的偏移位置时,程序就会产生一个事件,此时调用Lock函数锁住写游标的位置,然后开始执行写操作,写入数据的长度为两个通知点的实际聚类。在写入数据完成后,需要解锁缓冲区。在实现声音混音和回放时,需创建IDirectSound对象,同时,DirectSound自动创建主缓冲区,但是,辅助缓冲区需自主创建。在调用辅助缓冲区时,也要使用加锁和解锁、机制和通知机制来辅助完成。
2.4 视音频引擎的测试
局域网视音频测试对比分析了本视音频引擎与一款商业视频引擎的测试程序。在图像方面,测试项目包括图像质量、带宽、CPU占用率。在语音方面,测试项目只为其主观收听效果。图像测试效果分析:在局域网测试中,网络带宽可以保证的情况下,图像质量较优,且清晰度较好;网络状况拥堵时,图像偶尔会产生局部信息匮乏,但不影响视觉效果。语音测试效果分析:在局域网测试中,网络带宽可以保证的情况下,声音质量较优,声音也很流畅;在网络状况拥堵时,声音偶尔会产生中断,但不影响收听效果。对于回声的消除,当网络延迟较小时,本引擎的回声消除效果比较明显。
3 结语
综上所述,本引擎设计符合要求,且能够提供实时、高效和稳定的视音频服务。
参考文献
[1] 刘祎玮.Visual C++视频/音频开发实用工程案例精选[M].人民邮电出版社,2004.
[2] Jorn Ostermann,Jan Bormans,Peter list,Detlev Marpe,Matthias Narroschke,
Fernando Pereira,Thomas Stockhammer,Thomas Wedi. Video coding with H.264/AVC:Tools,Performance,and Complexity[J].IEEE CIRCUITS AND SYSTEMS MAGAZINE FIRST QUARTER 2004.
[3] 毕厚杰.新一代视频 本文由wWw.DYlw.net提供,第一论 文 网专业代写论文和论文代写以及发表论文服务,欢迎光临dYLW.nET压缩编码标准—H.264/AVC[M].人民邮电出版社,2005.
[4] 鄂志东.基于windows平台的X.264视频压缩研究[D].北京邮电大学,2006.
[5] 谢晓钢,蔡骏,陈奇川,欧建林.基于Speex语音引擎的VoIP系统设计与实现[J].计算机应用研究,2007(12).
收稿日期:2015-11-30
作者简介:郑立国(1964—),男,吉林长春人,研究生,毕业于吉林财经大学,研究员,现就职于吉林动画学院,研究方向:动漫科技发展研究。