AudioManager(获取麦克风录音流)

版权声明:本博客仅用于学习交流,欢迎转载,但请注明作者和出处 https://blog.csdn.net/weixin_37577039/article/details/82596418

AudioManager

public AudioDeviceInfo [] getDevices(int flags)

flags:
GET_DEVICES_ALL 3
GET_DEVICES_INPUTS 1
GET_DEVICES_OUTPUTS 2

AudioDeviceInfo[]:

getType()

TYPE_HDMI 9
描述HDMI连接的设备类型
TYPE_HDMI_ARC 10
描述HDMI连接的音频回传通道的设备类型
TYPE_BUILTIN_SPEAKER 2
描述设备中内置的扬声器系统(即单声道扬声器或立体声扬声器)的设备类型
TYPE_LINE_DIGITAL 6
描述数字线路连接的设备类型
TYPE_BUILTIN_MIC 15
描述设备中内置麦克风的设备类型
TYPE_BUS
与外部音频系统通信的类型不可知设备 21
TYPE_USB_DEVICE
描述USB音频设备的设备类型 11

getProductName()

提供方的名字 (H4S01)


PCM音频流的码率,采样率值×采样大小值×声道数bps


获取录音流

1 动态申请麦克风权限

2 创建 AudioRecord

AudioRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes)

1 音频源 如:MediaRecorder.AudioSource.MIC
2 采样率 有44100、22050、11025、4000、8000 等 AudioFormat.SAMPLE_RATE_UNSPECIFIED:意味着使用与路径相关的值,该值通常是源的采样率
3 声道设置: AudioFormat.CHANNEL_IN_MONO 单声道, AudioFormat.CHANNEL_IN_STEREO 立体声
4 要返回音频数据的格式: AudioFormat.ENCODING_PCM_8BIT, AudioFormat.ENCODING_PCM_16BIT
5 写入音频数据的缓冲区的总大小 如:2 * AudioRecord.getMinBufferSize(int,int,int)

3 获取返回成功创建AudioRecord对象所需的最小缓冲区大小

getMinBufferSize (int sampleRateInHz, int channelConfig,int audioFormat)

1 采样率 有44100、22050、11025、4000、8000 等 但不允许用AudioFormat.SAMPLE_RATE_UNSPECIFIED
2 声道设置: AudioFormat.CHANNEL_IN_MONO 单声道, AudioFormat.CHANNEL_IN_STEREO 立体声
3 要返回音频数据的格式: AudioFormat.ENCODING_PCM_8BIT, AudioFormat.ENCODING_PCM_16BIT

4 从AudioRecord实例开始记录:

audioRecord.startRecording()

5 读取数据:

read (ByteBuffer audioBuffer,int sizeInBytes, int readMode)

1 音频数据写入的直接缓冲区 2 建议但不强制要求所请求的字节数是帧大小的倍数(样本大小(以字节为单位)乘以通道数)
3 读取模式:READ_BLOCKING, READ_NON_BLOCKING 阻塞读取(读取完数据才返回)和非阻塞读取(读取尽可能多的数据立即返回)

read (byte[] audioData, int offsetInBytes, int sizeInBytes)

1 记录的音频数据写入的数组
2 偏移量
3 请求的字节数

6 停止记录:

audioRecord.stop ()

例子:

          Thread(Runnable {
                val bufferSize = 2 * AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT)
                mic = AudioRecord(MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT, bufferSize)
                mic?.startRecording()
                var pcmBuffer = ByteArray(2048)
                while (isRecording) {
                    val size = mic?.read(pcmBuffer, 0, pcmBuffer.size)
                    if (size != null) {
                        if (size <= 0) {
                            break
                        }
                        Logger.t(TAG).d("size is $size")
                    }
                }
            }).start()

参考:https://blog.csdn.net/qq_26986211/article/details/52512098

猜你喜欢

转载自blog.csdn.net/weixin_37577039/article/details/82596418