static const char * const audio_interfaces[] = {
AUDIO_HARDWARE_MODULE_ID_PRIMARY,
AUDIO_HARDWARE_MODULE_ID_A2DP,
AUDIO_HARDWARE_MODULE_ID_USB,
配置Configure文件路径: /vendor/etc/audio/audio_policy_configuration.xml
为什么是这个文件名称,APM代码有描述:
APM_AudioPolicyManager.cpp:
#define AUDIO_POLICY_XML_CONFIG_FILE_PATH_MAX_LENGTH 128
#define AUDIO_POLICY_XML_CONFIG_FILE_NAME "audio_policy_configuration.xml"
static status_t deserializeAudioPolicyXmlConfig(AudioPolicyConfig &config) {
char audioPolicyXmlConfigFile[AUDIO_POLICY_XML_CONFIG_FILE_PATH_MAX_LENGTH];
std::vector<const char*> fileNames;
status_t ret;
if (property_get_bool("ro.bluetooth.a2dp_offload.supported", false)) {
if (property_get_bool("persist.bluetooth.bluetooth_audio_hal.disabled", false) &&
property_get_bool("persist.bluetooth.a2dp_offload.disabled", false)) {
// Both BluetoothAudio@2.0 and BluetoothA2dp@1.0 (Offlaod) are disabled, and uses
// the legacy hardware module for A2DP and hearing aid.
fileNames.push_back(AUDIO_POLICY_BLUETOOTH_LEGACY_HAL_XML_CONFIG_FILE_NAME);
} else if (property_get_bool("persist.bluetooth.a2dp_offload.disabled", false)) {
// A2DP offload supported but disabled: try to use special XML file
fileNames.push_back(AUDIO_POLICY_A2DP_OFFLOAD_DISABLED_XML_CONFIG_FILE_NAME);
} else if (property_get_bool("persist.bluetooth.bluetooth_audio_hal.disabled", false)) {
fileNames.push_back(AUDIO_POLICY_BLUETOOTH_LEGACY_HAL_XML_CONFIG_FILE_NAME);
fileNames.push_back(AUDIO_POLICY_XML_CONFIG_FILE_NAME);
2.2 修改
如上可以看出channelMasks 配置缺少多声道
修改后://增加四声道
注:
source
理解为发送端,
sink
理解为接受端
3. APP方法
3.1
使用
AudioRecord
原生接口:
为了从设备获取超过两个声道的音频,使用一个通到索引掩码:
channelIndexMask
final AudioFormat audioFormat=new AudioFormat.Builder()
.setEncoding(AudioFormat.ENCODING_PCM_16BIT)
.setSampleRate(44100)
.setChannelIndexMask(0xf/*4 channels,0...3*/)
.build();
final AudioRecord audioRecord = new AudioRecord.Builder()
.setAudioFormat(audioFormat)
.build();
AudioFormat.java 代码setChannelIndexMask 接口如下:
★
注意:当setChannelMask和setChannelIndexMask都设置的时候,AudioRecord只是用setChannleMask的值(最大为两个通道)。
System/media/audio/include/system/audio-base.h针对AUDIO_CHANNEL_INDEX定义如下:
3.2
使用
AAudio
接口:
AAudio 是Android为解决声音延时的高效Native接口,Andriod系统标配,目前大量使用在公网对讲机,语音对讲,Voip,RTC项目中。
#include <aaudio/AAudio.h>
result = AAudio_createStreamBuilder(&inputBuilder);
if (result != AAUDIO_OK) {
LOGE("%s create Stream inputBuilder failed", __func__);
AAudioStreamBuilder_setDirection(inputBuilder, AAUDIO_DIRECTION_INPUT); //设置流的方向
AAudioStreamBuilder_setDeviceId(inputBuilder, AAUDIO_UNSPECIFIED);
AAudioStreamBuilder_setSampleRate(inputBuilder, 48000);
AAudioStreamBuilder_setChannelCount(inputBuilder, 4);//设置channel->4
AAudioStreamBuilder_setFormat(inputBuilder, AAUDIO_FORMAT_PCM_I16);
AAudioStreamBuilder_setPerformanceMode(inputBuilder, AAUDIO_PERFORMANCE_MODE_LOW_LATENCY);
//数据回调
AAudioStreamBuilder_setDataCallback(inputBuilder, inDataCallback, this);
//create input stream
result = AAudioStreamBuilder_openStream(inputBuilder, &inputStream);
if (result != AAUDIO_OK) {
LOGE("%s open inputStream failed", __func__);
result = AAudioStream_requestStart(inputStream);
if (result != AAUDIO_OK) {
LOGE("%s inputStream request Start failed", __func__);
//数据分析:
aaudio_data_callback_result_t inDataCallback(
AAudioStream *stream,
void *userData,
void *audioData,
int32_t numFrames) {
//note 1. 16bit->2bytes * channel->4,所以这里每帧是8个字节
memcpy(buffer, audioData, numFrames *8);//AudioCapure数据
return AAUDIO_CALLBACK_RESULT_CONTINUE;
注意:当setChannelMask和setChannelIndexMask都设置的时候,AudioRecord只是用setChannleMask的值(最大为两个通道)。AAudio 是Android为解决声音延时的高效Native接口,Andriod系统标配,目前大量使用在公网对讲机,语音对讲,Voip,RTC项目中。配置Configure文件路径: /vendor/etc/audio/audio_policy_configuration.xml。修改后://增加四声道。......
原生Android只支持2 channel的录音。可是偏偏会有多mic的需求,比如说语音识别。目前已知TDM协议可以将多mic数据从kernel送到hal,从内核空间搬运到用户空间中。可是原生AudioRecord接口是完全不支持多channel录音数据的采集的,怎么修改,才能让原生进行支持呢?
我们就从AudioRecord的构造函数开始往下研究。无论行不行,都要研究出个所以然来!我们如果写...
public AudioTrack(AudioAttributes attributes, AudioFormat format, int bufferSizeInBytes,
int mode, int sessionId)
throws IllegalArgumentE
private native final int native_setup(Object audiorecord_this,
Object /*AudioAttributes*/ attributes,
可以使用掩码格式只获取第二个通道数据
此时如果指定多通道录音,则打开设备时候会出错。
(录音阶段,会根据App 指定的参数打开对应的设备,设备为 4 ,可以使用8通道来录,设备为 2 ,不可以使用多通道来录)
这个需要研究一下。。。
如果机器支持六通道录音,那是不是可以通过掩码格式获取特定通道数据
当两个接口都进行了指定,是不是通道数就仅限定只能最多获取两个通道的数据了? -》 是的。
之前我们使用了MediaRecorder录制了音频和视频,虽然API使用简便,但是欠缺灵活,例如直播中的混音,变声等等,有些我们需要边录制边处理,MediaRecorder已经满足不了这些更高的需求,这个时候就需要使用AudioRecord。
使用AudioRecord录制的是pcm原始音频,具体的概念这里就不多说了,如果你需要MP3,3gp可以自行转换。也就是说录制之后的文件基本上不...
Android Automotive是谷歌推出的一种基于Android操作系统的汽车娱乐和信息娱乐系统。与普通的Android系统不同,Android Automotive是专门为汽车而设计的,并提供了与车辆控制系统的连接和通信,以实现更好的驾驶体验和安全性能。Android Automotive系统支持多种语音助手和应用程序,包括导航、音乐、通讯等,通过车辆的中控屏幕和车载音响等设备提供给驾驶者和乘客使用。Android Automotive还支持无线连接,可以连接到智能手机或其他设备,以获取更多的内容和功能。目前,Android Automotive已经被多家汽车制造商采用,包括宝马、福特、沃尔沃等。