Android 音频——PCM转WAV
Android 音频开发——AudioRecord录音
AudioTrack类用来管理、播放单个音频资源,它只能播放PCM数据,其他音频格式(aac、amr、opus、flac等)需要经过解码成PCM才能使用。
AudioTrack可以运行两种模式:
流模式
可以将连续的数据流写入AudioTrack,进行播放。播放音频数据块时,这种模式最有用。
如:
静态模式
当处理很短的音频并且需要以最小延迟播放时,应该选择静态模式。对于经常播放的UI和游戏声音而言,静态模式将是首选方式,并且可能会产生最小的开销。
当创建AudioTrack时,AudioTrack将初始化其关联的音频缓冲区。在构造期间指定的此缓冲区大小决定了AudioTrack在数据用尽之前可以播放多长时间。
对于静态模式,此大小是可以从中播放的最大音频数据大小。
对于流模式,数据将以小于等于此缓冲区大小的块的形式写入音频接收器。
这里主要说一下AudioTrack的流模式使用。
基本步骤
int minSize = AudioTrack.getMinBufferSize(sampleRate,
outChannelConfig, AudioFormat.ENCODING_PCM_16BIT);
sampleRate:采样频率
outChannelConfig:声道配置,CHANNEL_OUT_MONO、CHANNEL_OUT_STEREO。
audioFormat:音频编码,AudioFormat.ENCODING_PCM_16BIT、ENCODING_PCM_8BIT.
AudioTrack构造器已经过时,推荐使用AudioTrack.Builder进行创建AudioTrack对象。
mTrack = new AudioTrack.Builder()
.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build())
.setAudioFormat(new AudioFormat.Builder()
.setEncoding(AudioFormat.ENCODING_PCM_16BIT)
.setSampleRate(sampleRate)
.setChannelMask(outChannelConfig)
.build())
.setBufferSizeInBytes(minSize)
.build();
创建AudioTrack对象,同时设置采样率、声道数、音频格式,缓冲区大小。
调用play前,可以先向缓冲区写入音频数据。也可以后写。
mTrack.play();
如果不限调用write,或者write数量不足,则调用play处于欠载状态,这种情况下不会播放。只有后续将数据写入,播放才会真正开始播放。
mTrack.write(audioData.data, 0, size);
将音频数据写入音频接收器以进行播放。
该方法默认情况是阻塞模式,直到所有数据都排入队列进行播放为止,并且将返回完整的传输计数。 但是,如果轨道在进入时停止或暂停,或者另一个线程通过调用停止或暂停来中断写入,或者在写入过程中发生I / O错误,则写入可能会返回较短的传输计数。
调用以下两种方法都可以停止播放,并且都可以恢复播放,停止时机略有不同。
1 停止播放音频数据,调用此方法后,音频将在播放了最后写入的缓冲区后停止播放。
mTrack.stop();
2 暂停音频数据的播放。 未播放的数据将不会被丢弃。 随后调用play将播放此数据。
mTrack.pause();
释放本地AudioRecord资源。
调用release()之后,将无法再使用该对象,并且应将引用设置为null。
mTrack.release();
mTrack=null;
demo:一边录制WAV,一边播放音频
源代码路径:https://github.com/pyzhangfan/audio-sample-app
欢迎大家关注、评论、点赞、打赏。
你们的支持是我坚持的动力。Thank you!