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