Android AudioTrack播放PCM文件

上篇文章写了使用AudioRecord采集音频,为了测试采集音频是否正确,可以通过AudioTrack播放音频试下。

AudioTrack只能播放PCM格式的文件。PCM全称是Pulse Code Modulation,即通常所说的音频的裸数据格式。描述一段PCM数据需要量化格式,采样率以及声道数。因此,播放PCM文件时需要匹配前文AudioRecord采集音频时的参数,否则会出现播放错乱的问题。

1. 初始化AudioTrack

  • streamType

设置音频类型。Android提供多重音频管理策略,包括

public static final int STREAM_VOICE_CALL = AudioSystem.STREAM_VOICE_CALL;
public static final int STREAM_SYSTEM = AudioSystem.STREAM_SYSTEM;
public static final int STREAM_RING = AudioSystem.STREAM_RING;
public static final int STREAM_MUSIC = AudioSystem.STREAM_MUSIC;
public static final int STREAM_ALARM = AudioSystem.STREAM_ALARM;
public static final int STREAM_NOTIFICATION = AudioSystem.STREAM_NOTIFICATION;

在音量按钮控制时,会提示具体修改哪类音频流的音量大小。注意设置StreamType是通过AudioAttributes设置,其中setLegacyStreamType与setUsgae/setContentType冲突,后两者控制粒度更细,前者是老旧版本设置方式与后两者冲突。

  • channel          与AudioRecord录制时参数一致
  • sampleRate   与AudioRecord录制时参数一致
  • encoding       与AudioRecord录制时参数一致
  • mode   播放模式,包括两种: MODE_STATIC , MODE_STREAM;前者一次性将所有数据写入到播放缓冲区,适合小音频;后者不断读取,适合所有音频。在播放时,如果使用STATIC则需要在播放play前将数据写入,否则在AudioTrack的状态为STATE_NO_STATIC_DATA,即无数据无法播放。
  • bufferSize   根据mode参数配置,如果是STATIC,则为音频的大小,一次性全部读入;如果是STREAM,则通过AudioTrack计算得到的bufferSize,分批次读取。
  • audioSessionId 与其他MediaPlayer或AudioTrack共享AudioEffect的,暂时没用到不了解~

2. 播放音频

以MODE_STATIC模式:

mAudioTrack.play();

以MODE_STREAM模式:

在子线程中读取文件内容到内存,逐份读取

mAudioTrack.play();
while ((length = inputStream.read(buf, 0,
        mBufferSize)) >= 0) {
    mAudioTrack.write(buf, 0, length);
}

3. 停止播放

AudioTrack#release,如果播放模式是MODE_STREAM,可通过AtomicBoolean方式添加标志位。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值