Android FM录音功能

本文介绍了在Android中实现FM录音功能时遇到的问题,即AUDIO_DEVICE_IN_FM_TUNER设备类型不可用。通过分析源码和日志,发现设备在加载后可能被删除。解决方案是先调用nativeOpenTuner开启收音机模块,使得AudioRecord能正常录制。此问题的解决依赖于硬件对FM的支持。
摘要由CSDN通过智能技术生成

最近有个需求,FM需要做听歌识曲,然后我就发现,Andoid原生就提供了一个这个:

//MediaRecorder.java
/**
* Audio source for capturing broadcast radio tuner output.
* @hide
*/
@SystemApi
public static final int RADIO_TUNER = 1998;

​ 那我就要试试,这么操作,会怎么样:

int channelConfiguration = AudioFormat.CHANNEL_IN_STEREO;
            int audioEncodingBits = AudioFormat.ENCODING_PCM_16BIT;
            int sampleRateInHz = 8000;
            int audioSource = MediaRecorder.AudioSource.RADIO_TUNER;
            int recordBufferSize = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfiguration, audioEncodingBits);
            mAudioRecord = new AudioRecord(audioSource, sampleRateInHz, channelConfiguration, audioEncodingBits,
                    recordBufferSize);

结果,我发现报错了:

 //1998就是RADIO_TUNER
 AudioRecord: set(): inputSource 1998, sampleRate 8000, format 0x1, channelMask 0xc, frameCount 320, notificationFrames 0, sessionId 0, transferType 0, flags 0, opPackageName com.chj.voicerecognize.captureservice uid -1, pid -1
10-19 09:05:27.160  2162  2162 V AudioRecord: Building AudioRecord with attributes: source=1998 flags=0x0 tags=[]
10-19 09:05:27.160  2162  2162 V AudioRecord: set(): mSessionId 33
10-19 09:05:27.163   779  1008 V APM_AudioPolicyManager: getInputForAttr() source 1998, samplingRate 8000, format 1, channelMask c,session 33, flags 0                       
10-19 09:05:27.163   779  1008 V APM::AudioPolicyEngine: getDeviceForInputSource() no device found for source 1998
10-19 09:05:27.163   779  1008 E APM::AudioPolicyEngine: getDeviceForInputSource() no default device defined
10-19 09:05:27.163   779  1008 V APM::AudioPolicyEngine: getDeviceForInputSource()input source 1998, device 00000000
10-19 09:05:27.163   779  1008 W APM_AudioPolicyManager: getInputForAttr() could not find device for source 1998

报错的地方在这里:

Engine.cpp
audio_devices_t Engine::getDeviceForInputSource(audio_source_t inputSource) const
{
   
    ...
    case AUDIO_SOURCE_FM_TUNER:
        if (availableDeviceTypes & AUDIO_DEVICE_IN_FM_TUNER) {
   
            //没走到这里
            device = AUDIO_DEVICE_IN_FM_TUNER;
        }
        break;
    ...
}

也就是说availableDeviceTypes里没有包含AUDIO_DEVICE_IN_FM_TUNER。

于是,我查看了配置:

//audio_policy_configuration.xml
...
<attachedDevices>
   ...
   <item>Built-In Mic</item>
   <item
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值