AudioManager(获取麦克风录音流)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值