转载请注明出处:http://blog.csdn.net/typename powered by [email protected]
前言:
随着HTML5 标准完成制定,最近各种HTML5的猜测声音不断,在此不发表关于HTML5的未来意见,本文关注HTML5的新feature, audio标签。在HTML5中添加了新的标签,开发者可以直接使用audio标签嵌入音频,也可以直接使用video标签直接嵌入视频,其实这个标准在WHATWG早早已经被支持,只不过W3C最近才纳入标准。使用Android平台的WebView来加载HTML5网页游戏的开发者可能遇到在Android 4.4一下系统版本经常是游戏背景音乐失效或者游戏音效失效,经常只能是二者只有其一,这是系统WebView内核的bug,在android 4.4一下系统webview使用webkit内核,webkit内核在实现audio那块存在问题。 在Andorid4.4及其以上游戏音乐就能正常的工作,Android 4.4系统WebView采用Chromium 内核,下面我们来看一下 chromium内核的audio实现。
概览:
在Chromium 当中实现audio 标签主要分为以下几个部分:
(1)chromium 需要实现audio的播放控制,资源获取。
(2)负责音频的解析和编码。
(3)实现HTML与Javascript binding 的audio相关部分,并且渲染audio控制面板,还需要提供相应接口给web去控制播放状态。
Chromium Audio 实现结构
blink 解析网页过程中发现HTML5 audio 标签,会为它创建HTMLAudioElement对象,HTMLAudioElement继承自HTMLMediaElement,在WebCore当中HTMLMediaElement是
audio的一个节点负责连接网页js操作与我们的浏览器平台对接实现的基础单元。它会请求创建media player来执行audio的相关动作,由此创建WebMediaPlayerImpl对象负责管理audio 播放控制。WebMediaPlayerImpl对象当中拥有Pipeline实例, Pipeline来执行audio所有的操作,chromium 中使用FFmpeg 来编码解析Audio数据流,解析之后的数据由AudioRender通过 IPC 传到AudioRendererHost来进行处理,AudioRendererHost则是浏览器的主进程中运行AudioManager来管理数据流,其最
终是通过android.media.AudioManager、android.media.AudioTrack、android.media.AudioRecord来完成对网页Aduio的播放。
Audio 相关代码目录
src/media/base/ 对audio 数据流进行封装处理包含audio decoder, renderer, buffer管理等
src/media/audio/ 对audio 的整个播放流程运行就行管理并结合平台对audio 流进行播放处理,在android系统上最后使用android的 AudioManager
src/content/browser/renderer_host/media/ 这部分audio相关代码在browser主进程中的 UI 线程进行初始化,但是一些数据操作在IO 线程来完成,这个目录下代码负责维护Audio的整个生命周期与平台硬件的交互。
chromium 为何使用FFmpeg
FFmpeg开源项目在很多视频、音频播放器中又广泛的应用,得益于其支持的多种编码器编码的流格式,而且其解码采用逐帧解码,拥有不错的效率。尽管FFmpeg支持分片解码,但是却又要求是源数据同样也需要分片编码才能支持,chromium利用多核技术,在chromium 当中将FFmpeg作为分流层来实现audio、video解码,使得充分利用多核硬件特性,提升解码速率。
chromium 支持的音频格式
webm,wav,x-wav,ogg,mp3,mp4,x-mp3,x-m4a,ogv,ogm,oga
参考资料:
http://www.chromium.org/audio-video