这期内容当中小编将会给大家带来有关怎么在Android中将录音输出为Mp4文件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
<强>前言强>
录音采用的是AudioRecord,通过MediaCodec进行编码,用MediaMuxer合成输出Mp4文件。
<强> 1。强>
这里用AudioRecord来得到从麦克风录制的声音,AudiorRecord的用法还是比较简单的,首先初始化AudioRecord
fun 准备(文件:文件?,,outputFormat:, Int =, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4,, audioSource:, Int =, MediaRecorder.AudioSource.MIC,, sampleRateInHz:, Int =, 44100年,channelConfig:, Int =, AudioFormat.CHANNEL_IN_STEREO,, audioFormat:, Int =, AudioFormat.ENCODING_PCM_16BIT,, bufferSizeInBytes:, Int =, AudioRecord.getMinBufferSize (sampleRateInHz, channelConfig,, audioFormat)) { ,//初始化AudioRecord ,prepareAudioRecord (audioSource, sampleRateInHz,, channelConfig,, audioFormat,, bufferSizeInBytes) ,//初始化输出文件 ,prepareOutputFile(文件) ,//初始化AudioEncoder ,prepareAudioEncoder (sampleRateInHz, outputFormat) } private fun  prepareAudioRecord (audioSource: Int, sampleRateInHz:, Int,, channelConfig:, Int,, audioFormat:, Int,, bufferSizeInBytes:, Int) {=,,minSize  AudioRecord.getMinBufferSize (sampleRateInHz, channelConfig,, audioFormat)=,,audioRecord  AudioRecord (sampleRateInHz, audioSource,还以为,channelConfig, audioFormat,, bufferSizeInBytes) }
<>强AudioRecord的构造函数需要出入几个参数。强>
(1)。
audioSource代表音频来源,这里传入MediaRecorder.AudioSource.MIC,代表音频来源于麦克风。
(2)。
sampleRateInHz代表以赫兹表示的采样率,传44100年入,这个数值可以保证所有设备都正常工作。
(3)。
channelConfig代表声道配置,AudioFormat.CHANNEL_IN_STEREO代表传入立体声。
(4)。
audioFormat代表音频数据将被返回的格式。传入AudioFormat.ENCODING_PCM_16BIT。
(5)。
bufferSizeInBytes写入音频数据的缓冲区的总大小(以字节为单位)这里默认传入getMinBufferSize,这个方法返回成功创建AudioRecord实例所需的缓冲区大小的最小值。
开始录音时,启动一个线程
private val recordRunnable =, Runnable { ,val data 中ByteArray (minSize)=, ,//AudioRecord开始录音 ,audioRecord ? .startRecording () ,while (isRecording) ,{//才能将音频数据写入中ByteArray audioRecord才能? .read(数据,,0,,data.size) audioEncoder.start才能() audioEncoder.drainEncoder才能(数据) ,} ,audioEncoder.release () ,audioRecord ?鸡毛蒜皮() ,audioRecord ? .release () ,audioRecord =零 }
这样就把音频数据写入一个中bytearray,然后将数据传入AudioEncoder进行编码输出。
<强> 2。强>
AudioRecord得到的音频数据格式是pcm的,一般情况下无法bofang(可以通过AudioTrack播放),所以我们需要一次编码转换,这里用到的就是MediaCodec, MediaCodec这里我封装在AudioEncoder里。
我们首先要初始化MediaCodec:
private fun prepareAudioCodec(比特率:Int, sampleRate:, Int) {=,,bufferInfo  MediaCodec.BufferInfo () ,val mediaFormat =, MediaFormat () ,mediaFormat.setInteger (MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC) ,mediaFormat.setString (MediaFormat.KEY_MIME, MediaFormat.MIMETYPE_AUDIO_AAC) ,mediaFormat.setInteger (MediaFormat.KEY_BIT_RATE,比特率) ,mediaFormat.setInteger (MediaFormat.KEY_CHANNEL_COUNT, 2) ,mediaFormat.setInteger (MediaFormat.KEY_SAMPLE_RATE, sampleRate)=,,audioCodec  MediaCodec.createEncoderByType (MediaFormat.MIMETYPE_AUDIO_AAC) ,audioCodec.configure (mediaFormat,,空,空,,MediaCodec.CONFIGURE_FLAG_ENCODE) }
这里需要创建一个MediaFormat,具体需要传入的参数大家可以参考开发者文档,需要注意的是音频和视频的MediaFormat设置的参数是不一样的,接着调用MediaCodec的配置,此时MediaCodec已经进入了配置的状态,可以开始进行编码了。
这里说到MediaCodec的状态,大家可以看来自开发者文档的MediaCodec的状态机图片。