Android Audio - 支持多应用同时录音_Android10修改方法

支持多应用同时录音_Android10修改方法

说明

在 Android10.0 之前, Android9.1, Android8.0 就已经预留了多个应用同时录音的方法, 在 Android10.0 终于系统层面默认支持上多个应用同时使用录音机了 😄, 但是经过实际测试, 发现虽然能同时使用 AudioRecord, 但是后一个应用打开后, 前一个应用就拿不到音频数据了. 那么问题来了.

代码分析

...

@AudioPolicyService.cpp
AudioPolicyService::UidPolicy::updateUid()
AudioPolicyService::UidPolicy::notifyService()
    AudioPolicyService::updateUidStates()
        AudioPolicyService::updateUidStates_l()
            if (isVirtualSource(source)) {
                allowCapture = true;
            }
            setAppState_l(current->uid, allowCapture ? apmStatFromAmState(mUidPolicy->getUidState(current->uid)) : APP_STATE_IDLE);

@AudioPolicyManager.cpp
AudioPolicyManager: setAppState()
        // 配置 AudioInputDescriptor
        mInputs.valueAt(i)->setAppState(uid, state);

@AudioInputDescriptor.cpp
AudioInputDescriptor->setAppState()
    // RecordClientVector
    client->setAppState(state);

从这个调用逻辑上可以看出, 现在的 Android10.0 进行了对每个应用做了录音权限策略, 当然主要是为了服务 Google Assistant 助手, 当然通过修改代码也可以支持自己的应用程序.
😄参考博客: https://www.it610.com/article/1291696911320948736.htm

修改方式

源码路径: sdk\frameworks\av\services\audiopolicy\service\AudioPolicyService.cpp

/* static */
bool AudioPolicyService::isVirtualSource(audio_source_t source)
{
    switch (source) {
        case AUDIO_SOURCE_VOICE_UPLINK:
        case AUDIO_SOURCE_VOICE_DOWNLINK:
        case AUDIO_SOURCE_VOICE_CALL:
        case AUDIO_SOURCE_REMOTE_SUBMIX:
        case AUDIO_SOURCE_FM_TUNER:
        case AUDIO_SOURCE_VOICE_RECOGNITION:  // Modify Tower 20200810
            return true;
        default:
            break;
    }
    return false;
}

在 AudioPolicyService::isVirtualSource() 里面添加需要支持的 Source 就可以多个应用拿到数据了.

与之相关

Android Audio - 音频子系统框架简析
Android Audio - 支持多应用同时录音_Android4.4修改方法
Android Audio - 支持多应用同时录音_Android5.1 & Android6.0 修改方法

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在MT6737 Android N平台上,录音到播放录音的流程可以分为以下几个步骤: 1. 打开录音设备 首先,需要打开录音设备并设置相关参数。在Android系统中,可以通过AudioRecord类来实现录音设备的打开和设置。例如: ``` int sampleRateInHz = 44100; // 采样率 int channelConfig = AudioFormat.CHANNEL_IN_MONO; // 声道数 int audioFormat = AudioFormat.ENCODING_PCM_16BIT; // 采样精度 int bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat); // 缓冲区大小 AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes); recorder.startRecording(); // 开始录音 ``` 2. 录制音频数据 接下来,需要不断地读取录音设备中的音频数据,并保存到一个缓冲区中。在Android系统中,可以使用AudioRecord类的read方法来读取音频数据。例如: ``` byte[] buffer = new byte[1024]; while (isRecording) { // isRecording为标志位,表示是否正在录音 int len = recorder.read(buffer, 0, buffer.length); // 读取音频数据 // 将读取到的音频数据写入到文件或网络等 } ``` 3. 停止录音设备 当需要停止录音时,需要停止录音设备,并释放相关资源。在Android系统中,可以使用AudioRecord类的stop和release方法来实现。例如: ``` recorder.stop(); // 停止录音 recorder.release(); // 释放资源 ``` 4. 播放录音数据 在播放录音时,需要打开播放设备并设置相关参数。在Android系统中,可以使用AudioTrack类来打开播放设备并设置参数。例如: ``` int streamType = AudioManager.STREAM_MUSIC; // 音频流类型 int sampleRateInHz = 44100; // 采样率 int channelConfig = AudioFormat.CHANNEL_OUT_MONO; // 声道数 int audioFormat = AudioFormat.ENCODING_PCM_16BIT; // 采样精度 int bufferSizeInBytes = AudioTrack.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat); // 缓冲区大小 AudioTrack player = new AudioTrack(streamType, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes, AudioTrack.MODE_STREAM); player.play(); // 开始播放 ``` 5. 播放录音数据 接下来,需要将录音数据写入到播放设备中,以实现播放录音的效果。在Android系统中,可以使用AudioTrack类的write方法来将录音数据写入到播放设备中。例如: ``` byte[] buffer = new byte[1024]; while (isPlaying) { // isPlaying为标志位,表示是否正在播放 // 从文件或网络等读取录音数据 int len = ...; // 将读取到的录音数据写入到播放设备中 player.write(buffer, 0, len); } ``` 6. 停止播放设备 当需要停止播放录音时,需要停止播放设备,并释放相关资源。在Android系统中,可以使用AudioTrack类的stop和release方法来实现。例如: ``` player.stop(); // 停止播放 player.release(); // 释放资源 ``` 以上就是录音到播放录音的流程分析。需要注意的是,在实际的开发中还需要考虑很多细节问题,例如音频格式的选择、缓冲区大小的计算、线程的管理等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值