一、AuidoTrack 使用步骤

1、获取最小缓存区大小

使用 AudioTrack 的静态成员,获取音频缓存区最小尺寸:

static public int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat)
  • sampleRateInHz:音频采样率,常用的采样率有 8k、16k、44.1K、48k;
  • channelConfig:声道配置,常用配置有 CHANNEL_IN_MONO (单声道)、CHANNEL_IN_STEREO (立体声);
  • audioFormat:采样精度,支持的精度有:ENCODING_PCM_8BIT (8 位量化精度)、ENCODING_PCM_16BIT (16位量化精度);

2、创建 AudoTrack 对象

AudioTraker 构造函数如下:

public AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat,int bufferSizeInBytes, int mode)
  • streamType : 音频流类型,可选的参数如下:

    • AudioSystem.STREAM_VOICE_CALL:通话;
    • AudioSystem.STREAM_SYSTEM:系统;
    • AudioSystem.STREAM_RING:铃音;
    • AudioSystem.STREAM_MUSIC:音乐;
    • AudioSystem.STREAM_ALARM:闹铃;
    • AudioSystem.STREAM_NOTIFICATION:通知;
  • sampleRateInHz:参考 getMinBufferSize;

  • channelConfig:参考 getMinBufferSize;

  • audioFormat:参考 getMinBufferSize;

  • bufferSizeInBytes:缓冲区大小,上一步骤获取的值;

  • mode:支持另种模式 MODE_STATIC (一次写入全部音频数据)、MODE_STREAM (边播放边写入数据);

3、启动播放

调用 AudioTrack 的 play 函数启动音频播放。

public void play()

4、写入音频数据

一般会启动一个线程,通过 write 函数循环往 AudioTrack 中写入音频数据。

public int write(@NonNull byte[] audioData, int offsetInBytes, int sizeInBytes)

5、停止播放

调用 stop 停止播放,release 释放资源。

public void stop()
public void release()

二、使用范例

package com.huangchao.testaudio;import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;import static android.os.Process.*;public class AudioTrackUtils {private static final int mStreamType = AudioManager.STREAM_MUSIC;private static final int mSampleRateInHz = 44100;private static final int mChannelConfig = AudioFormat.CHANNEL_IN_STEREO;private static final int mAudioFormat = AudioFormat.ENCODING_PCM_16BIT;private static int mMode = AudioTrack.MODE_STREAM;private AudioTrack mAudioTrack;private DataInputStream mDis;private Thread mPlayThread;private boolean isStart = false;private int mMinBufferSize;private volatile static AudioTrackUtils mInstance;Runnable recordRunnable = new Runnable() {@Overridepublic void run() {try {setThreadPriority(THREAD_PRIORITY_URGENT_AUDIO);byte[] tempBuffer = new byte[mMinBufferSize];int readCount = 0;while (mDis.available() > 0) {readCount = mDis.read(tempBuffer);if (readCount == AudioTrack.ERROR_INVALID_OPERATION || readCount == AudioTrack.ERROR_BAD_VALUE) {continue;}if (readCount != 0 && readCount != -1) {if (mAudioTrack.getState() == mAudioTrack.STATE_UNINITIALIZED) {initData();}mAudioTrack.play();mAudioTrack.write(tempBuffer, 0, readCount);}}stopPlay();} catch (Exception e) {e.printStackTrace();}}};public AudioTrackUtils() {initData();}private void initData() {mMinBufferSize = AudioTrack.getMinBufferSize(mSampleRateInHz, mChannelConfig, mAudioFormat);mAudioTrack = new AudioTrack(mStreamType, mSampleRateInHz, mChannelConfig,mAudioFormat, mMinBufferSize, mMode);}public static AudioTrackUtils getInstance() {if (mInstance == null) {synchronized (AudioTrackUtils.class) {if (mInstance == null) {mInstance = new AudioTrackUtils();}}}return mInstance;}private void destroyThread() {try {isStart = false;if (null != mPlayThread && Thread.State.RUNNABLE == mPlayThread.getState()) {try {Thread.sleep(500);mPlayThread.interrupt();} catch (Exception e) {mPlayThread = null;}}mPlayThread = null;} catch (Exception e) {e.printStackTrace();} finally {mPlayThread = null;}}private void startThread() {destroyThread();isStart = true;if (mPlayThread == null) {mPlayThread = new Thread(recordRunnable);mPlayThread.start();}}private void setPath(String path) throws Exception {File file = new File(path);mDis = new DataInputStream(new FileInputStream(file));}public void startPlay(String path) {try {if (isStart) {return;}setPath(path);startThread();} catch (Exception e) {e.printStackTrace();}}public void stopPlay() {try {destroyThread();if (mAudioTrack != null) {if (mAudioTrack.getState() == AudioRecord.STATE_INITIALIZED) {mAudioTrack.stop();}if (mAudioTrack != null) {mAudioTrack.release();}}if (mDis != null) {mDis.close();}} catch (Exception e) {e.printStackTrace();}}
}

AudioTrack 使用相关推荐

  1. android audiotrack使用问题:listener不回调的原因

    部分人使用audiotrack,有可能会发现audiotrack的回调方法不回调,其实很多情况下是这样子的: 一般的音频数据源会起一个线程获取,一般新起的线程都没有looper,而audiotrack ...

  2. android audiotrack权限,Android中AudioRecord和AudioTrack的使用注意

    AudioRecord需要至少 这项录音权限.有时候在AndroidManifest.xml中加进去后,有些手机系统仍然没有授予该权限.需要到手机的设置中的权限管理,把这项权限打开.没权限就会闪退.如 ...

  3. Android 音视频深入 十一 FFmpeg和AudioTrack播放声音(附源码下载)

    项目地址,求star https://github.com/979451341/AudioVideoStudyCodeTwo/tree/master/FFmpeg%E6%92%AD%E6%94%BE% ...

  4. android音频系统之AudioTrack的使用

    今天,简单讲讲  AudioTrack的使用. 1.Android AudioTrack简介 在android中播放声音可以用MediaPlayer和AudioTrack两种方案的,但是两种方案是 ...

  5. WebRTC 的 AudioSource/AudioTrack

    按照 WebRTC 的设计,AudioSource 是一个音频源,它可以向外提供 PCM 音频帧数据,比如麦克风录制可以提供 PCM 音频帧数据,它应该是一个 AudioSource.然而在 WebR ...

  6. ktm390蓝牙连接安卓_蓝牙音乐AudioTrack Session ID的获取

    当今这个音视频无处不在的时代,音频跟踪会话ID(AudioTrack Session ID)是个很重要的参数,可以用来实现音频相关的一些特效.接下来的内容我们就探究如何在安卓蓝牙系统中获取该id. 熟 ...

  7. Android之 AudioTrack学习

    AudioTrack主要是用来播放声音的,AudioTrack贯穿了JAVA层,JNI层和Native层. AudioTrack JAVA层: framework\base\media\java\an ...

  8. Andorid之MediaPlayer和AudioTrack播放Audio的区别与联系

    播放声音可以用MediaPlayer和AudioTrack,两者都提供了java API供应用开发者使用.虽然都可以播放声音,但两者还是有很大的区别的. 其中最大的区别是MediaPlayer可以播放 ...

  9. android 使用 audiorecord 和 audiotrack 实现实时录音播放

    基本思路就是用 audiorecord不断得到音频数据,然后使用audiotrack 播放 //得到音频 package com.ysg.audiotest;import java.io.IOExce ...

  10. AudioTrack 播放PCM音频数据

    AudioTrack 可以用来播放PCM数据,上一篇博客我讲了AudioRecord可以录制PCM数据 AudioTrack实例可以在两种模式下运行:静态或流式传输. 在Streaming模式下,应用 ...

最新文章

  1. NOIP2013 货车运输
  2. Arduino学习笔记1---开发环境搭建
  3. C#中导出Excel报表的方法
  4. AI指数评论:提防“路灯谬误”,开启全球多方对话
  5. chrome调试工具常用功能整理
  6. 时时监控的rtsp流视频显示在前端与一些css;
  7. 注入工具的原理和开发
  8. ES6之let和const
  9. 8除以2表示什么意思_平均配速8'12'是什么意思
  10. 不知道密码导出oracle数据库,Oracle数据库密码重置、导入导出库命令示例应用
  11. 1、.Net Core 基础
  12. 为了在简历上写掌握【Java虚拟机JVM】,做了该篇总结
  13. 一篇文章彻底搞懂Android事件分发机制
  14. STM32寄存器操作端口模式SDA_OUT()/SDA_IN()
  15. 福禄克FLUKE BT521 BT520 BT510 BT508护航储能电池安全
  16. 两台计算机之间的远程连接
  17. HTML heading
  18. 面对对象原则:高内聚、低耦合
  19. [CLI应用学习]实践使用GitHub CLI
  20. 20190422每周精品之认知

热门文章

  1. Go 语言GC原理概述
  2. EOJ 3449 3451
  3. Linux Jupyter 安装
  4. 在书本中旅行《邹韬奋文录》
  5. web前端测试——e2e测试
  6. 工作3年=工作20年 51.com大规模招聘
  7. Android 6.0动态权限及小米(MIUI)权限的特殊处理
  8. 回归问题评估模型的三个指标
  9. LightGBM-调参
  10. “抵制不孝言行·村立孝老爱亲”