新闻中心

EEPW首页 > 测试测量 > 设计应用 > Android系统WMA文件播放功能的设计与实现

Android系统WMA文件播放功能的设计与实现

作者:时间:2011-12-18来源:网络收藏

文件开始有一个16 Byte的标识,表示是:30 26 B2 75 8E 66 CF 11 A6 D9 00 AA 62 CE 6C。如果音频文件的前16个字符和这16 Byte相符,那么就可以判断该文件为文件。WMAExtraetor中的SniffWMA函数就是通过读取文件前16 Byte来判断该文件是不是WMA文件。在SniffWMA函数中,如果判断前16 Byte和WMA的16个标识字节相等,就会把MEDIA_MIMETYPE_AUDIO_WMA给mimeType指针,标志着该音频文件类型为WMA格式。MEDIA_MIMETYPE_AUDIO_WMA是在MediaDefs.h文件中定义,在MediaDefs.cpp文件中赋值:
g.JPG
(2)WMA文件的解析。
WMAExtmetor从WMA文件的第31 Byte开始取16 Byte,然后依次和file_header、stream_header、data_header、comment_header、exten-ded_content_header对比,如果和file_header相等,则从下个Byte开始依次获取文件大小、创建时间、数据包个数、…数据包大小。然后再从下个Byte开始读取16 Byte再进行对比,如果和extended_content_header相等,则可以从下个Byte中依次获取名称、艺术家、版权、注释等非音频信息。然后再接着读取16 Byte进行比对,直到和data_eader相等。data_header后就是音频文件解码数据,data_header的结束位置就是第一个数据包在文件中的偏移量。WMAExtractor会创建一个MetaData,并把文件头中获取的sample_rate、Byte_rate、channels、dura-tion都存入MetaData中。在WMAExtractor的getMetaData函数中,把之前获取的非音频信息放入MetaData中,最后返回该MetaData。在WMAEx-tractor的getTrack函数中,创建一个WMASource,并把WMA数据和MetaData传给WMASource。
(3)编码数据的读取。
获取未解码数据是通过WmASource的read函数读取的。WMA数据是以数据包为单位的,同文件中的数据包大小相同。每个数据包中有多帧数据,每个数据包的起始位置减去第—个数据包的起始位置再除以包的大小等于一个整数,这个整数就是该数据包之前数据包的个数。每个数据包的第一个Byte一般都等于0x82。第二个Byte以后是该数据包的相关信息。根据包的相关数据就可以获取该包中的未解码数据。
WMASource的read读取未解码数据时,首先会判断从WMADecoder传来的options是否为空,如果不为空,并可以从options中获取一个时间seekTimeUs,就通过seekTimeUs、总时间和总数据包的个数算出要数据包的起始位置,然后从该起始位置获取一个数据包的数据,并从该数据包中获取有效数据的大小、起始位置、时间等数据,最后把该有效数据和时间放在WMADecoder传来的Buffer里。
WMASource的Read被调用时,如果传来的Options为空或是不能从Options中获取时间seekTimeUs,就会从WMA文件中读取一个数据包,根据其中的有效数据的大小、起始位置获取有效数据,并获取该数据包中的时间,然后把该有效数据和时间放在WMADecoder传来的buffer里。第一个数据包的起始位置就是解析头文件时获取的第一个数据包的偏移量,所以第一次调用WMASource的read时,就是从这个偏移量的下个位置读取第一个数据包的。在WMASource中有一个专门记录读取位置的指针。每次读取1个数据包后,该指针就会指向数据包末尾的下一个位置,当下一次WMASource的read读取未解码数据时,如果不是音乐定点播放,就会从该指针所指的位置开始读取数据包。

本文引用地址:http://www.eepw.com.cn/article/194616.htm

(4)编码数据的解码和输出。
AwesomePlayer通过OMXCodec中的Create函数创建WMADecoder,所以在OMXCodec中注册WMADecoder的相关信息:
h.JPG
在创建WMADecoder时,把之前创建的WMASource传给WMADecoder。在WMADecoder构造函数中,WMADecoder从WMASource中获取Metadata,并从Metadata获取sampleRate、numChannels、duration等。在WMADecoder的start函数中,通过调用avcodec_open函数,来分配解码所需的空间、创建并初始化解码所需的相关参数。在WMADecoder析构函数中会调用WMADecoder的Stop函数。在Stop函数中会释放所有相关空间。

c++相关文章:c++教程




关键词: Android WMA 系统 播放

评论


相关推荐

技术专区

关闭