Android系统WMA文件播放功能的设计与实现
2 多媒体系统增加WMA音频格式的设计
从多媒体系统具体实现的角度来看,WMA音频格式播放主要经过WMA格式文件解析、WMA编码流解码、PCM输出播放3个阶段。WMA音频播放器的结构如图2所示。本文引用地址:http://www.amcfsurvey.com/article/194616.htm
基于Android多媒体系统音频播放流程,在WMA音频格式开发过程中主要有4项工作:(1)WMA文件的识别;(2)WMA文件的解析;(3)编码数据的读取;(4)编码数据的解码和输出。
2.1 WMA格式音频播放功能流程设计
通过调用AwesomePlayer的setDataSource函数来设置数据源;AwesomePlayer通过调用MediaExtractor的Create函数来识别该文件的格式,MediaPlayer判断该文件为WMA格式后,会创建一个WMAExtractor,在创建WMAExtraetor的同时,WMAExtractor会解析文件头,获取文件中的相关信息。然后调用WMAExtractor的getTrack函数创建一个WMASource;AwesomePlaye嗵过OMXCOdec创建一个WMADecoder;Awesome Player接着创建一个AudioPlayer,并把WMADecoder做为数据源传给AudioPlayer,并调用AudioPlayer的start函数;AudioPlayer获取WMA Decoder中的相关参数:文件类型、采样率、声道数,并根据该数据开启AudioSink,并把AudioSinkCailhaek做为回调函数传给AudioSink。AudioPlayer先调用WMADecoder解第一帧数据,并把该数据传给AudioSink去播放,当播放完成后AudioSink会调用回调函数AudioSink Call-hack再取解码后的数据,AudioSinkCallbaek又会调用FillButfer函数获取解码后的原始数据,解码后数据如果被取完后,AudioPlayer又会调用WMADecoder解下一帧数据给AudioSink,来回反复,直到文件中数全部被播放,播放流程如图3所示。在拉动滚动条时,上层会传来SeekTime,经AudioPlayer传给WMADeeoder再传给WMAExtractor,WMAExtractor根据上层传来的SeekTime判断出要播放的原始数据的起始位置,然后从该位置读取一个数据包传给WMADecoder解码。
在整个WMA格式解码播放过程中,主要设计有两个模块:WMAExtractor和WMADecoder。WMAExtractor主要执行WMA格式文件解析和数据读取功能。WMADecoder主要执行解码功能;WMA格式音频播放功能实现。
(1)WMA文件的识别。
在判断播放文件格式前,AwesomePlayer会提前把所支持的格式通过DataSource中的RegisterDefaultSniffers函数注册进来。判断播放文件格式时,会逐一按次序把该文件和所支持的格式进行匹配,最匹配的格式就是该文件的格式,所以在Datasource中的RegisterDefauh Sniffers函数中应添加如下代码:
c++相关文章:c++教程
评论