怎么在Android中将录音输出为Mp4文件

  介绍

这期内容当中小编将会给大家带来有关怎么在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的状态机图片。

怎么在Android中将录音输出为Mp4文件“> <br/> </p> <p>看一下MediaCodec的工作过程:</p> <p> <img src=

怎么在Android中将录音输出为Mp4文件