Android音频简介
最近移植Android,当Android能够在设备上面运行之后,首先想到的是让音频设备跑起来。“没有声音,再好的戏也出不来”。本文简单介绍一下 Android音频适配层。
这个世界音频设备千变万化,Android也不可能为每种设备都提供支持。Android定义了一个框架,这个框 架来适配底层的音频设备。该适配层的定义位于:
hardware/libhardware_legacy/include/hardware_legacy/AudioHardwareInterface.h
要想视频底层的音频设备必须要继承该文件中定义的 AudioStreamOut,AudioStreamIn,AudioHardwareInterface等类,并实现 createAudioHardware函数。
下面我们看一下Android创建音频设备的代码,代码位于:
frameworks/base/libs/audioflinger/AudioHardwareInterface.cpp
该文件有如下 代码:
AudioHardwareInterface* AudioHardwareInterface::create()
{
/*
* FIXME: This code needs to instantiate the correct audio device
* interface. For now - we use compile-time switches.
*/
AudioHardwareInterface* hw = 0;
char value[PROPERTY_VALUE_MAX];
#ifdef GENERIC_AUDIO
hw = new AudioHardwareGeneric();
#else
// if running in emulation - use the emulator driver
if (property_get("ro.kernel.qemu", value, 0)) {
LOGD("Running in emulation - using generic audio driver");
hw = new AudioHardwareGeneric();
}
else {
LOGV("Creating Vendor Specific AudioHardware");
hw = createAudioHardware();
}
#endif
if (hw->initCheck() != NO_ERROR) {
LOGW("Using stubbed audio hardware. No sound will be produced.");
delete hw;
hw = new AudioHardwareStub();
}
#ifdef WITH_A2DP
hw = new A2dpAudioInterface(hw);
#endif
#ifdef ENABLE_AUDIO_DUMP
// This code adds a record of buffers in a file to write calls made by AudioFlinger.
// It replaces the current AudioHardwareInterface object by an intermediate
======黑软基地手机 资讯频道======
one which
// will record buffers in a file (after sending them to hardware) for testing purpose.
// This feature is enabled by defining symbol ENABLE_AUDIO_DUMP.
// The output file is set with setParameters("test_cmd_file_opening PCM dump interface");
hw = new AudioDumpInterface(hw); // replace interface
#endif
return hw;
}
从代码中我们可以看出如果定义了GENERIC_AUDIO的宏,则会创建 AudioHardwareGeneric,如果是模拟器的话,AudioHardwareGeneric会不能初始化,进而创建 AudioHardwareStub。这两个类都是Audio设备的适配层,是Android默认提供的。模拟器都是用 AudioHardwareStub,不会有声音输出。设备都是用AudioHardwareGeneric,因为默认GENERIC_AUDIO是设置 的。
一般我们只关心AudioHardwareGeneric实现,谁会去给模拟器去调试声音呢,反正我没这个闲心。首先说明一下这个音频适 配层是 Android自带的,可以保证你的音频设备正常运行,但是不能发挥设备的最佳性能。通过后面的描述你将会了解。 AudioHardwareGeneric的定义位于:
frameworks/base/libs/audioflinger/AudioHardwareGeneric.cpp
查看源码你会发现 这个适配层需要实现设备/dev/eac,并且该设备只输出44.1khz采样率的音频数据给 /dev/eac设备,如果不是44.1khz的采样率的数据,AudioHardwareGeneric会经过Resample过程把它转换成 44.1kHZ的音频数据,然后再输出给音频设备。44.1kHZ音频数据是最普遍的音频采样率,大部分Mp3都是以这个采样率压缩的,所以选择这个采样 率做为默认采样率还是有一定的合理性的。AudioHardwareGeneric是软件实现Resample过程是,效率会比较低。很多音频设备支持不 同采样率的数据,可以理解成硬件实现Resample过程。
通过上面的描述我们可以知道这个通用音频适配层只是让你的设备可以用而已,不能发 挥设备的性能优势,如果你的设备对音频质量有更高的要求,必须要自己实现音频适配层。谷歌只能保证你的音频可以播放,但是不能保证效率(他也没有办法保证 效率)。
Android音频简介相关推荐
- Android 音频采集(原始音频)
Android 音频简介 常见的音频编解码的类型:AAC OPUS MP3 AMR Ogg PCM AAC: 高级音频编码 对应 .m4a(audio/m4a)或者.3pg(audio/3 ...
- android音频hal层简介
如下图为android音频hal层所处的位置: 从上图可以看出,HAL层下面使用TiniAlsa(Android下一个简约的Alsa版本).HAL层分为两部分,一部分为各种音频设备,每种音频设备由一个 ...
- Android 的简介和体系结构中每个层的功能。
Android 的简介和体系结构中每个层的功能. 1.简介 Android是由Google公司和开放手机联盟领导并开发的一种基于Linux的自由且开放源代码的操作系统,主要使用于移动设备. Andro ...
- android音频系统之AudioTrack的使用
今天,简单讲讲 AudioTrack的使用. 1.Android AudioTrack简介 在android中播放声音可以用MediaPlayer和AudioTrack两种方案的,但是两种方案是 ...
- Android开发-简介(一)
Android的简介: Android是一种基于Linux 内核和其他开源软件的修改版本的移动操作系统,主要为智能手机和平板电脑等触摸屏移动设备设计.Android是由一个被称为开放手机联盟的开发者联 ...
- (转)Android WebRTC简介
源地址:Android WebRTC简介_CharonChui的博客-CSDN博客_android webrtc Android WebRTC简介 WebRTC简介 WebRTC WebRTC名称源自 ...
- Android 音频源码分析——AndroidRecord录音(一)
Android 音频源码分析--AndroidRecord录音(一) Android 音频源码分析--AndroidRecord录音(二) Android 音频源码分析--AndroidRecord音 ...
- Android音频改进设想及PulseAudio
在这里先说明,本人并没有仔细地去看Android和PulseAudio的音频具体源代码和实现,欢迎指正. 从硬件用料上看,Android能不能做好音质?答案当然是可以的!MOTO的手机音质就做得不错. ...
- Android音频系统的改进设想和展望 PulseAudio介绍
http://www.soomal.com/doc/10100002871.htm 在这里先说明,本人并没有仔细地去看Android和PulseAudio的音频具体源代码和实现,欢迎指正. 从硬件用料 ...
最新文章
- R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(改变图例位置、移除图例)实战
- Can't connect to local MySQL Server throught socket '/var/run/mysqld/mysqld.sock'(2)
- VC++连接Mysql
- Caffe官方教程翻译(2):Web demo
- Flutter 异常处理之图片篇
- php对象数组转数组_php 数组对象互相转换
- typedef struct和struct区别
- vue.js 源代码学习笔记 ----- decoder
- Linux系统各个目录的作用(中英文对照)
- 微信公众号开发流程指南
- unity材质球发光_为Unity3D创建素材(1):图片、着色器、材质球
- 联创机房管理系统服务器密码,高校机房管理系统解决方案.doc
- 对于Ajax在MUI框架中的用运以及单 webview 模式中的下拉刷新功能探究
- 360修复服务器漏洞,360安全漏洞不需要修复怎么设置
- vue m3u8格式 实现监控直播
- html行内样式 修改,HTML的行内样式演示案例
- [ABAP] BTE增强查找实施方法
- H5 -- 自定义微信分享第三方页面链接的标题和小缩略图
- Springcloud微服务概述
- mark glossiness==1.0
热门文章
- 网络层(TCP/UDP)攻击与防御原理
- Chemical Science | 通过异构网络中的深度学习对已知药物进行靶标识别
- 达梦数据库喜中国家电网公司信息化软件框架采购竞争性谈判项目
- 【附章5计算机字符编码】多种字符编码集的说明
- 截至4月印度可再生能源装机超57GW 光伏装机12.5GW
- java面试大全(7w字,更新中)
- 蚂蚁回应支付宝高新企业认证被撤销;谷歌嘲讽iPhone14:Pixel手机是创新上的领导者,苹果紧随其后|极客头条
- PowerPoint VBA批量格式转换:pptx转pdf、ppt以及反向转换
- 树莓派Pico-Raspberry Pi Pico安装及使用
- Kafka Eagle 2.0.6 安装