admin 管理员组

文章数量: 1086019


2024年4月23日发(作者:linux 删除某个文件夹)

(19)中华人民共和国国家知识产权局

(12)发明专利说明书

(21)申请号 CN2.1

(22)申请日 2012.10.15

(71)申请人 深圳市佳创软件有限公司

地址 518000 广东省深圳市福田区滨河路以南、沙嘴路以东中央西谷大厦15层01-

08,16层04-06

(72)发明人 温伟 涂睿 高见 胡勇 刘睿

(74)专利代理机构 深圳新创友知识产权代理有限公司

代理人 江耀纯

(51)

H04N21/85

H04N21/8547

(10)申请公布号 CN 102857833 A

(43)申请公布日 2013.01.02

权利要求说明书 说明书 幅图

(54)发明名称

一种适配android stagefright 多媒体

框架的音频解码系统及方法

(57)摘要

本发明公开了一种适配android

stagefright多媒体框架的音频解码方法和系

统,方法包括以下步骤:保存Awesome

Player输入的解包装组件,完成音频解码

器的注册;获取音频的媒体元数据并保存

至本地;获取上下文环境数据项,申请内

存资源作为解码输出缓冲;以及根据上下

文环境,打开并初始化所述音频解码器中

与音频流格式相匹配的解码器,申请内存

资源作为解码输入缓冲;通过解包装组件

读取音频编码数据至输入缓冲,进行音频

解码;更新本地的媒体元数据中的采样率

数据为音频编码数据的采样率;根据本地

的媒体元数据计算得到解码输出数据的时

间戳并保持至输出缓冲,从输出缓冲返回

携带时间戳的原始音频数据。本发明能够

扩展安卓系统对音频格式的支持。

法律状态

法律状态公告日

法律状态信息

法律状态

权 利 要 求 说 明 书

1.一种适配android stagefright 多媒体框架的音频解码方法,其特征在于,包括以下

步骤:

音频解码系统构造步骤:保存AwesomePlayer输入的解包装组件,完成音频解码

器的注册;通过所述解包装组件获取音频的媒体元数据并保存至本地;

开始步骤:从本地的媒体元数据中获取上下文环境数据项,申请内存资源作为解码

输出缓冲;以及根据所述上下文环境,打开并初始化所述音频解码器中与所述音频

流格式相匹配的解码器,申请内存资源作为解码输入缓冲;

读取步骤:通过所述解包装组件读取音频编码数据至所述输入缓冲,进行音频解码;

更新所述本地的媒体元数据中的采样率数据为所述音频编码数据的采样率;根据本

地的媒体元数据计算得到解码输出数据的时间戳并保持至所述输出缓冲,从所述输

出缓冲返回携带时间戳的原始音频数据;

停止步骤:释放所述开始接口模块申请的作为解码输出缓冲和解码输入缓冲的内存

资源。

2.根据权利要求1所述的解码方法,其特征在于:所述音频解码系统构造步骤包括:

1-1)保存AwesomePlayer输入的解包装组件,通过ffmpeg工具箱完成其支持格式

的音频解码器的注册;

1-2)通过所述解包装组件获取音频的媒体元数据;

1-3)在步骤1-2)得到的媒体元数据中获取音频声道数、采样率、和持续时间信息;

1-4)将步骤1-3)得到的音频声道数、采样率、和持续时间信息复制保存至本地的

媒体元数据中。

3.根据权利要求1所述的解码方法,其特征在于,所述开始步骤包括:

2-1)获取所述本地的媒体元数据的地址;

2-2)从所述本地的媒体元数据中获取上下文环境数据项;

2-3)从所述本地的媒体元数据中获取音频流在多媒体源中的编号,通过该编号判

断从多媒体源中获取的流是否为音频流,若是,则进行解码,否则跳过;

2-4)申请一个容量大于音频解码最大输出字节数的内存资源作为输出缓冲;

2-5)通过ffmpeg工具箱找到并打开与所述上下文环境数据项中的解码格式ID相

匹配的解码器;

2-6)申请一个容量大于AUDIO_REFILL_THRESH*2的内存资源作为输入缓冲,

并将输入缓冲中带解码数据的字节数和地址偏移量均初始化为0,其中,

AUDIO_REFILL_THRESH为开始音频解码时所需数据量阈值。

4.根据权利要求1所述的解码方法,其特征在于,所述读取步骤包括:

3-1)获取输出缓冲作为后续所有步骤的解码输出缓冲;

3-2)设置音频解码所需最少字节数为AUDIO_REFILL_THRESH,以避免因数据

不足而导致解码失败;

3-3)判断所述输入缓冲中待解码数据字节数是否小于阈值

AUDIO_REFILL_THRESH,若是,则滑动输入缓冲中待解码数据,使得其地址偏

移量恢复为0;若不是,跳过该步骤;

3-4)如果所述输入缓冲中待解码数据小于AUDIO_REFILL_THRESH,则通过解

包装组件从多媒体源中读取音频流数据,并将这些新数据添加到输入缓冲中待解码

数据的尾部,接着累加待解码数据字节数、保存当前音频包的时间戳等;如果待解

码数据的字节数仍小于AUDIO_REFILL_THRESH,则继续步骤3-4),否则进入

步骤3-5);

3-5)通过ffmpeg工具箱对输入缓冲中待解码数据进行解码,解码输出数据存储在

步骤3-1)获取的输出缓冲中,记解码输出字节数为output_frame_size,ffmpeg工

具箱从输入缓冲中消耗的字节数为byte_used;

3-6)将输入缓冲待解码数据的地址偏移量加byte_used而字节数减byte_used;

3-7)若output_frame_size小于或等于0,则回到步骤3-3),否则进入步骤3-8);

3-8)将输出缓冲的地址偏移量和字节总数分别设置为0和output_frame_size;

3-9)根据步骤3-4)得到的音频包时间戳、媒体元数据的采样率和声道数,以及解

码累计输出总采样点数等计算得到解码输出数据的时间戳;

3-10)将携带时间戳信息的解码输出缓冲返回。

5.一种适配android stagefright 多媒体框架的音频解码系统,其特征在于,包括:

音频解码系统构造模块,用于:保存AwesomePlayer输入的解包装组件,完成音

频解码器的注册;通过所述解包装组件获取音频的媒体元数据并保存至本地;

开始接口模块,用于:从本地的媒体元数据中获取上下文环境数据项,申请内存资

源作为解码输出缓冲;以及根据所述上下文环境,打开并初始化所述音频解码器中

与所述音频流格式相匹配的解码器,申请内存资源作为解码输入缓冲;

读取接口模块,用于:通过所述解包装组件读取音频编码数据至所述输入缓冲,进

行音频解码;更新所述本地的媒体元数据中的采样率数据为所述音频编码数据的采

样率;根据本地的媒体元数据计算得到解码输出数据的时间戳并保持至所述输出缓

冲,从所述输出缓冲返回携带时间戳的原始音频数据;

停止接口模块,用于释放所述开始接口模块申请作为解码输出缓冲和解码输入缓冲

的内存资源。

说 明 书

技术领域

本发明涉及多媒体信息处理技术领域,具体是涉及一种适配android stagefright 多

媒体框架的音频解码系统及方法。

背景技术

移动手机操作系统的诞生引发了手机等移动终端的智能化。其中较有代表性的是

Apple的iOS和Google的android。android在近几年内得到了迅速发展,android的

多媒体框架最初采用的是openCore架构,由于其大而复杂,到android 2.3,多媒

体框架完全采用了stagefright。android软件栈从底至顶分为四层:linux内核、本

地库及android运行库、java框架、核心应用。stagefright多媒体框架位于第二层,

是一个本地库。stagefright将多媒体音视频的包装格式解析、编解码和显示进行封

装,提供对整个多媒体信息处理的支持。

如图1为stagefright与linux驱动、多媒体服务和解码插件间的关系。

android底层名为“mediaserver”的linux进程通过访问MediaPlayerService调用

stagefright多媒体框架完成音视频的包装格式解析、解码和播放等。stagefright主要

包括了AwesomePlayer、MediaExtractor、OMXCodec、AwesomeRenderer和

AudioPlayer等。其中AwesomePlayer作为所有其他对象的组合,可依次通过

DataSource获取多媒体数据源、再通过MediaExtractor解包装组件完成文件格式

(如.mp3)解析并提取音视频流、进而通过OMXCodec调用解码插件完成音视频

流的解码、最后通过AwesomeRenderer和AudioPlayer将最终数据送往音视频I/O

设备,完成播放显示。

android 2.3作为目前市场渗透率最深的android版本,以其子版本android 2.3.4的

音频软解码器为例,仅支持MP3、AMR、AAC、G711和Vorbis音频格式,不支

持AC3、PCM、RealVideo Cooker、MP2、WMA和FLAC等音频编码。这种局限

性不仅使得有些音频文件无法在android系统上播放,也使得包含某些音频流的视

频文件无法在android系统上播放。

android软件栈具备很好的设计模式,可采用实现MediaSource抽象类通用接口的

形式,设计一个适配stagefright框架的新插件,通过新插件达到扩充stagefright多

媒体框架音频解码功能的目的。

发明内容

本发明所要解决的技术问题是,提供一种适配android stagefright 多媒体框架的音

频解码方法及系统,以扩大该多媒体框架对音频编码格式的支持。

本发明的技术问题通过以下技术手段予以解决:

一种适配android stagefright 多媒体框架的音频解码方法,包括以下步骤:

音频解码系统构造步骤:保存AwesomePlayer输入的解包装组件,完成音频解码

器的注册;通过所述解包装组件获取音频的媒体元数据并保存至本地;

开始步骤:从本地的媒体元数据中获取上下文环境数据项,申请内存资源作为解码

输出缓冲;以及根据所述上下文环境,打开并初始化所述音频解码器中与所述音频

流格式相匹配的解码器,申请内存资源作为解码输入缓冲;

读取步骤:通过所述解包装组件读取音频编码数据至所述输入缓冲,进行音频解码;

更新所述本地的媒体元数据中的采样率数据为所述音频编码数据的采样率;根据本

地的媒体元数据计算得到解码输出数据的时间戳并保持至所述输出缓冲,从所述输

出缓冲返回携带时间戳的原始音频数据;

停止步骤:释放所述开始接口模块申请作为解码输出缓冲和解码输入缓冲的内存资

源。

优选地:

述音频解码系统构造步骤包括:

1-1)保存AwesomePlayer输入的解包装组件,通过ffmpeg工具箱完成其支持格式

的音频解码器的注册;1-2)通过所述解包装组件获取音频的媒体元数据;1-3)在

步骤1-2)得到的媒体元数据中搜索音频声道数、采样率、和持续时间信息;1-4)

将步骤1-3)得到的音频声道数、采样率、和持续时间信息复制保存至本地的媒体

元数据中。

所述开始步骤包括:

2-1)获取所述本地的媒体元数据的地址;2-2)从所述本地的媒体元数据中获取上

下文环境数据项;2-3)从所述本地的媒体元数据中获取音频流在多媒体源中的编

号,通过该编号判断从多媒体源中获取的流是否为音频流,若是,则进行解码,否

则跳过;2-4)申请一个容量大于音频解码最大输出字节数的内存资源作为输出缓

冲;2-5)通过ffmpeg工具箱找到并打开与所述上下文环境数据项中的解码格式ID

相匹配的解码器;2-6)申请一个容量大于AUDIO_REFILL_THRESH*2的内存资

源作为输入缓冲,并将输入缓冲中带解码数据的字节数和地址偏移量均初始化为0,

其中,AUDIO_REFILL_THRESH为开始音频解码时所需数据量阈值。

所述读取步骤包括:

3-1)获取输出缓冲作为后续所有步骤的解码输出缓冲;3-2)设置音频解码所需最

少字节数为AUDIO_REFILL_THRESH,以避面因数据不足而导致解码失败;3-3)

判断所述输入缓冲中待解码数据字节数是否小于阈值AUDIO_REFILL_THRESH,

若是,则滑动输入缓冲中待解码数据,使得其地址偏移量恢复为0;若不是,跳过

该步骤;3-4)如果所述输入缓冲中待解码数据小于AUDIO_REFILL_THRESH,

则通过解包装组件从多媒体源中读取音频流数据,并将这些新数据添加到输入缓冲

中待解码数据的尾部,接着累加待解码数据字节数、保存当前音频包的时间戳等;

如果待解码数据的字节数仍小于AUDIO_REFILL_THRESH,则继续步骤3-4),

否则进入步骤3-5);3-5)通过ffmpeg工具箱对输入缓冲中待解码数据进行解码,

解码输出数据存储在步骤3-1)获取的输出缓冲中,记解码输出字节数为

output_frame_size,ffmpeg工具箱从输入缓冲中消耗的字节数为byte_used;3-6)

将输入缓冲待解码数据的地址偏移量加byte_used而字节数减byte_used;3-7)若

output_frame_size小于或等于0,则回到步骤3-3),否则进入步骤3-8);3-8)将

输出缓冲的地址偏移量和字节总数分别设置为0和output_frame_size;3-9)根据步

骤3-4)得到的音频包时间戳、媒体元数据的采样率和声道数,以及解码累计输出

总采样点数等计算得到解码输出数据的时间戳;3-10)将携带时间戳信息的解码输

出缓冲返回。

一种适配android stagefright 多媒体框架的音频解码系统,包括:

音频解码系统构造模块,用于:保存AwesomePlayer输入的解包装组件,完成音

频解码器的注册;通过所述解包装组件获取音频的媒体元数据并保存至本地;

开始接口模块,用于:从本地的媒体元数据中获取上下文环境数据项,申请内存资

源作为解码输出缓冲;以及根据所述上下文环境,打开并初始化所述音频解码器中

与所述音频流格式相匹配的解码器,申请内存资源作为解码输入缓冲;

读取接口模块,用于:通过所述解包装组件读取音频编码数据至所述输入缓冲,进

行音频解码;更新所述本地的媒体元数据中的采样率数据为所述音频编码数据的采

样率;根据本地的媒体元数据计算得到解码输出数据的时间戳并保持至所述输出缓

冲,从所述输出缓冲返回携带时间戳的原始音频数据;

停止接口模块,用于释放所述开始接口模块申请作为解码输出缓冲和解码输入缓冲

的内存资源。

与现有技术相比,本发明音频解码系统和方法不但能够支持Andriod原来支持的

MP3、AMR等音频格式的解码外,通过新的解码器扩展支持更多格式的音频的解

码,例如:AC3、PCM、RealVideo Cooker、MP2、WMA和FLAC等格式的音频,

本发明的音频解码系统具有音频解码复杂度第,具有优良的移植性。

优选方案中采用的输入缓冲控制方式不但能够避免缓冲溢出,同时也避免了大量数

据的频繁拷贝。

附图说明

图1为android stagefright框架与android其他模块的关系图;

图2为本发明具体实施例解码过程中输入缓冲一个典型的状态变化过程;

图3为本发明具体实施例解码过程中输入缓冲正常工作时的状态转移图;

图4为本发明具体实施例音频解码方法构造过程的流程图;

图5为本发明具体实施例音频解码方法中开始步骤的流程图;

图6为本发明具体实施例音频解码方法缓冲的组织形式原理图;

图7为本发明具体实施例音频解码方法中读取步骤的流程图。

具体实施方式

下面对照附图并结合优选的实施方式对本发明作进一步说明。

本实施例的一种适配android stagefright 多媒体框架的音频解码方法,主要包括解

码系统构造步骤、开始步骤、读取步骤、停止步骤,分别有本实施例的一种适配

android stagefright 多媒体框架的音频解码系统的解码系统构造模块、开始接口模块、

读取接口模块和停止接口模块完成。其中,音频解码系统构造步骤包括:保存

AwesomePlayer输入的解包装组件,完成音频解码器的注册;通过所述解包装组件

获取音频的媒体元数据并保存至本地;开始步骤包括:从本地的媒体元数据中获取

上下文环境数据项,申请内存资源作为解码输出缓冲;以及根据所述上下文环境,

打开并初始化所述音频解码器中与所述音频流格式相匹配的解码器,申请内存资源

作为解码输入缓冲;读取步骤包括:通过所述解包装组件读取音频编码数据至所述

输入缓冲,进行音频解码;更新所述本地的媒体元数据中的采样率数据为所述音频

编码数据的采样率;根据本地的媒体元数据计算得到解码输出数据的时间戳并保持

至所述输出缓冲,从所述输出缓冲返回携带时间戳的原始音频数据;停止步骤包括:

释放所述开始接口模块申请作为解码输出缓冲和解码输入缓冲的内存资源。

在更加具体的实施方式中,上述各个步骤的具体过程如下文所述:

如图4所示,音频解码系统构造步骤具体包括:

步骤一:保存AwesomePlayer输入的解包装组件并依次通过ffmpeg工具箱的

av_register_all、avcodec_init和avcodec_register_all完成其支持格式的解码器注册;

步骤二:通过解包装组件获取音频媒体元数据的地址。本实施例设计的android媒

体元数据对音频解码系统数据项的组织形式如表2所示:

表2 音频解码系统媒体元数据

媒体元数据中的key值必须唯一,获取数据项时需指定key值和存储value值的地

址,如存储地址为meta的媒体元数据中声道数的获取方法为:

meta->findInt32(kKeyChannelCount, &mNumChannels)

填充数据项的方法与获取数据项方法一一对应,如setInt32对应findInt32。填充数

据项时需指定key值和value值。

步骤三:通过相应获取方法,从步骤二得到的媒体元数据中获取音频声道数、采样

率和持续时间信息;

步骤四:通过系统内媒体元数据的setInt32和setInt64填充方法,将步骤三得到的

音频声道数、采样率和持续时间信息复制至本地;

步骤五:通过本地媒体元数据的setCString填充其“MIME类型”和“解码系统名字”

数据项。MIME指多媒体文件格式,MIME类型有很多种,如普通文本、JPEG图

形和AVI文件等等,此处我们将之设为音频RAW数据,即"audio/raw"。音频解码

插件名称无特殊要求,我们将新插件取名为“MultiAudioDecoder”,取多格式音频解

码之意。

如图5所示,开始步骤包括:

步骤一:获取本地媒体元数据的地址;

步骤二:通过findPointer从步骤一的媒体元数据中获取“上下文环境”数据项。如表

2所示,上下文环境是解包装组件媒体元数据项之一,我们将其指向ffmpeg工具

箱的AVFormatContext数据结构,其存储了多媒体源URI、音频编码ID和音频流

信息等;

步骤三:多媒体源中可能存在非音频流,如视频流和字幕流等,因此需将音频流标

识出来,标识方法很简单,只需获取音频流在多媒体流中的编号,它可从步骤一得

到的媒体元数据中获取;

步骤四:申请一个AVCODEC_MAX_AUDIO_FRAME_SIZE+64长度的输出缓冲,

为了保证缓冲不溢出,AVCODEC_MAX_AUDIO_FRAME_SIZE为音频解码输出

帧最大字节数,等于192000。系统内的数据缓冲均以android stagefright框架下

MediaBuffer的形式组织,如图6所示。MediaBuffer一旦创建,其可用空间的起始

地址和大小便固定了,其中有效数据的位置信息包括:地址偏移量和尺寸。有效数

据位置信息根据实际应用不断变化,利用“set_range(地址偏移量,尺寸)”对其进行更

新。

步骤五:依次通过ffmpeg工具箱的avcodec_find_decoder和avcodec_open找到并

打开与被解码格式ID匹配的音频解码器;

步骤六:申请内存资源作为解码输入缓冲,缓冲容量为

AUDIO_REFILL_THRESH*2字节,AUDIO_REFILL_THRESH为8192,并将其待

解码数据量和地址偏移量均设置为0。AUDIO_REFILL_THRESH为开始音频解码

所需数据量的阈值。

如图7所示,读取步骤包括:

步骤一:获取输出缓冲,作为后续所有步骤的解码输出缓冲;

步骤二:设置音频解码所需最少字节数为AUDIO_REFILL_THRESH,以避免部分

格式因数据不足而导致解码失败,AUDIO_REFILL_THRESH为8192;

步骤三:判断解码输入缓冲中待解码数据是否小于AUDIO_REFILL_THRESH字节,

若是,则滑动输入缓冲中待解码数据,使得其地址偏移量恢复为0;若不是,跳过

该步骤;

步骤四:如果输入缓冲中待解码数据小于AUDIO_REFILL_THRESH,则通过解包

装组件从多媒体源中读取音频流数据,并将这些数据添加到缓冲待解码数据尾部,

并累加待解码数据的字节数、保存当前音频包的时间戳等;如果待解码数据的字节

数仍小于AUDIO_REFILL_THRESH,则继续步骤四,否则进入步骤五;

步骤五:通过ffmpeg工具箱的avcodec_decode_audio2对待解码数据进行解码,解

码输出存储在步骤一的缓冲中,记解码输出字节数为output_frame_size,记

avcodec_decode_audio2从输入缓冲中消耗的字节数为byte_used;

步骤六:通过输入缓冲的set_range,将其待解码数据的地址偏移量加byte_used而

字节数减byte_used;

步骤七:若output_frame_size小于或等于0,则回到步骤三,否则进入步骤八;步

骤三至步骤七的滑动式输入缓冲状态变化如图3所示;

步骤八:通过输出缓冲的set_range,将其有效数据的地址偏移量和尺寸分别设置

为0和output_frame_size;

步骤九:根据步骤四得到的音频包时间戳、本地媒体元数据中的采样率和声道数、

解码输出的总采样点数等,计算得到解码输出数据的时间戳,该时间戳烙在输出缓

冲上,与解码输出数据一起返回,以供音视频同步;

步骤十:将携带时间戳信息的解码输出缓冲buffer返回。

读取步骤解码过程中解码过程中一个比较典型的输入缓冲的变化过程如图2所示。

图2中箭头指向待解码数据起始地址,黑色部分为待解码数据,白色部分为空闲空

间,最多可容纳AUDIO_REFILL_THRESH*2个待解码字节。刚开始时,缓冲为状

态1;随着解包装组件读取音频流并填充该输入缓冲,缓冲进入状态2,状态2待

解码数据仍小于AUDIO_REFILL_THRESH,即小于缓冲容量的一半,解包装组件

将继续读取数据,直到该输入缓冲的有效数据大于AUDIO_REFILL_THRESH,进

入状态3;进入状态3后便可以开始音频解码了;解码过程会消耗缓冲中待解码数

据,导致数据慢慢减少,进入状态4,在状态4下,剩余的待解码数据量仍大于

AUDIO_REFILL_THRESH,则继续停留在状态4进行解码,直到数据量小于

AUDIO_REFILL_THRESH,进入状态5;在状态5下,需滑动残余数据至首地址,

避免缓冲溢出,最后回到状态2。

输入缓冲的状态转移图如图3所示,其中输入缓冲各个正常状态如表1所示。

表1输入缓冲正常状态

状态

偏移地址offset数据长度

size1offset =

0size = 02offset

= 00 < size <

AUDIO_REFILL_THRESH3off

set = 0size >=

AUDIO_REFILL_THRESH4off

set > 00 <= size <

AUDIO_REFILL_THRESH5off

set > 0size >=

AUDIO_REFILL_THRESH

表中仅列出来缓冲不溢出的正常状态,即

offset+size <= 2* AUDIO_REFILL_THRESH。为了避免输入缓冲溢出,除了将其

最大容量申请为解码阈值的两倍外,关键在于其定期滑动,而且滑动仅发生在有效

数据小于AUDIO_REFILL_THRESH的情况,避免了大量数据的频繁滑动。读取工

作模式下的输入缓冲,只要每次读入的音频包小于AUDIO_REFILL_THRESH,就

一定不会溢出。

停止步骤包括:

步骤一:释放start接口申请的解码输出缓冲组;

步骤二:释放start接口申请的解码输入缓冲;

步骤三:通过ffmpeg工具箱的avcodec_close关闭解码器。

本实施例还包括getFormat步骤,其包括“

步骤一:返回MetaData类媒体元数据mFormat。

本发明的系统,具有良好的移植性能,仅需要在android stagefright 多媒体框架例

的OMXCodec进行简单配置即可进行工作,包括:1、在插件生产工厂中增添新插

件,只需在OMXCodec中添加“FACTORY_CREATE(MultiAudioDecoder)”即可;2、

将新插件的基本信息增添到备选插件集中,只需在kFactoryInfo中增添

“FACTORY_REF(MultiAudioDecoder)”即可。

以上内容是结合具体的优选实施方式对本发明所作的进一步详细说明,不能认定本

发明的具体实施只局限于这些说明。对于本发明所属技术领域的技术人员来说,在

不脱离本发明构思的前提下,还可以做出若干等同替代或明显变型,而且性能或用

途相同,都应当视为属于本发明的保护范围。


本文标签: 解码 音频 数据 缓冲 输入