AudioTrack

之前我们讲过MediaPlayer,MediaPlayer就相当于AudioTrack的包装层,它可以播放MP3,WAV,OGG,AAC,MIDI等,而AudioTrack只能播放PCM数据流

AudioTrack的构造方法

public AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes, int mode) { ... }

streamType 音频流类型

AudioManager.STREAM_MUSIC:用于音乐播放的音频流。
AudioManager.STREAM_SYSTEM:用于系统声音的音频流。
AudioManager.STREAM_RING:用于电话铃声的音频流。
AudioManager.STREAM_VOICE_CALL:用于电话通话的音频流。
AudioManager.STREAM_ALARM:用于警报的音频流。
AudioManager.STREAM_NOTIFICATION:用于通知的音频流。
AudioManager.STREAM_BLUETOOTH_SCO:用于连接到蓝牙电话时的手机音频流。
AudioManager.STREAM_SYSTEM_ENFORCED:在某些国家实施的系统声音的音频流。
AudioManager.STREAM_DTMF:DTMF音调的音频流。
AudioManager.STREAM_TTS:文本到语音转换(TTS)的音频流。

sampleRateInHz 采样率
播放的音频每秒钟会有多少次采样,MediaRecoder 的采样率通常是8000Hz AAC的通常是44100Hz。 设置采样率为44100,目前为常用的采样率
channelConfig 声道数(通道数)
一般可选的就两种,单声道CHANNEL_IN_MONO,双声道CHANNEL_IN_STEREO,建议选择单声道
audioFormat 数据位宽
只支持AudioFormat.ENCODING_PCM_8BIT(8bit)和AudioFormat.ENCODING_PCM_16BIT(16bit)两种,后者支持所有Android手机
bufferSizeInBytes 音频缓冲区大小
建议使用AudioTrack.getMinBufferSize()这个方法获取,参数如上
mode 播放模式
Android 提供了两种播放模式:
MODE_STATIC,一次性将所有数据都写入播放缓冲区中,简单高效,一般用于铃声,系统提醒音,内存比较小的。
MODE_STREAM,需要按照一定的时间间隔,不断的写入音频数据,理论上它可以应用于任何音频播放的场景。

public AudioTrack(AudioAttributes attributes, AudioFormat format, int bufferSizeInBytes,int mode, int sessionId) { ... }

静态播放

// ************ 静态播放模式 ************
// 直接获取文件大小
InputStream in = getResources().openRawResource(R.raw.ding);
try {try {ByteArrayOutputStream out = new ByteArrayOutputStream();for (int b; (b = in.read()) != -1; ) {out.write(b);}audioData = out.toByteArray();} finally {in.close();}
} catch (IOException ioe) {ioe.printStackTrace();Log.d(TAG, "读取数据失败!");
}
//构造AudioTrack对象,写入数据并播放
audioTrack = new AudioTrack(
new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA).setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).build(),
new AudioFormat.Builder().setSampleRate(22050).setEncoding(AudioFormat.ENCODING_PCM_8BIT).setChannelMask(AudioFormat.CHANNEL_OUT_MONO).build(),
audioData.length,
AudioTrack.MODE_STATIC,
AudioManager.AUDIO_SESSION_ID_GENERATE);
audioTrack.write(audioData, 0, audioData.length);
if(audioTrack.getState() == AudioTrack.STATE_UNINITIALIZED){Toast.makeText(this,"AudioTrack初始化失败!",Toast.LENGTH_SHORT).show();return;
}
audioTrack.play();

流播放模式

// ************ 流播放 ************
final int minBufferSize = AudioTrack.getMinBufferSize(SAMPLE_RATE_INHZ, AudioFormat.CHANNEL_OUT_MONO, AUDIO_FORMAT);
// 创建 AudioTrack 对象
audioTrack = new AudioTrack(new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA).setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).build(),new AudioFormat.Builder().setSampleRate(SAMPLE_RATE_INHZ).setEncoding(AUDIO_FORMAT).setChannelMask(AudioFormat.CHANNEL_OUT_MONO).build(),minBufferSize,AudioTrack.MODE_STREAM,AudioManager.AUDIO_SESSION_ID_GENERATE
);
// 检查初始化是否成功
if(audioTrack.getState() == AudioTrack.STATE_UNINITIALIZED){Toast.makeText(this,"AudioTrack初始化失败!",Toast.LENGTH_SHORT).show();return;
}
// 播放
audioTrack.play();
//子线程中文件流写入
workHandler.post(new Runnable() {@Overridepublic void run() {try {final File file = new File(getExternalFilesDir(Environment.DIRECTORY_MUSIC), "test.pcm");FileInputStream fileInputStream = new FileInputStream(file);byte[] tempBuffer = new byte[minBufferSize];while (fileInputStream.available() > 0) {int readCount = fileInputStream.read(tempBuffer);if (readCount == AudioTrack.ERROR_INVALID_OPERATION ||readCount == AudioTrack.ERROR_BAD_VALUE) {continue;}if (readCount != 0 && readCount != -1) {audioTrack.write(tempBuffer, 0, readCount);}}fileInputStream.close();} catch (IOException ioe) {ioe.printStackTrace();}}
});

停止播放,销毁资源

// 停止线程
handlerThread.quit();
workHandler.removeCallbacksAndMessages(null);
if(audioTrack.getState() != AudioTrack.STATE_UNINITIALIZED){audioTrack.stop();audioTrack.release();
}

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. Linux用户root登录shell时,linux系统管理-定制root用户的Shell环境
  2. Java SHAA加密
  3. python制作中秋贺卡_中秋节到了,送你一个Python做的Crossin牌“月饼”
  4. 8s nfs 挂载文件_Kubernetes集群使用网络存储NFS
  5. 选择Ruby的37个理由【转载】
  6. sentinel接入网关应用_阿里sentinel配合gateway 网关限流
  7. 求100~200间的所有素数
  8. 搭建微信小程序(前后端)
  9. Windows Pygame 安装教程 (自己识别版本号并下载)
  10. Python常用的19个工具包汇总
  11. 用户帐户控制---为了对电脑进行保护,已经阻止此应用。---管理员已阻止你运行此应。有关详细信息,请与管理员联系。
  12. 近观香港,远看上海,反思深圳
  13. 如何使用Google TV设置Chromecast
  14. 红楼梦诗词全集---留一份吧,太珍贵了!!
  15. UCK区块链微课堂—公钥私钥,数字资产安全性的两把金钥匙
  16. “无边框”引发口水大战 供应链考验手机硬件创新
  17. IDEA中SurroundWith里面没有逻辑语句模板问题的解决方案
  18. 客户期望,客户满意度,客户体验和客户忠诚度之间存在的联系
  19. Halcon Qt 环境一次性配置
  20. 量子计算Shor算法

热门文章

  1. 无脑带你遍历用户生命价值与流失挽救(上) : 流量下的价值套路
  2. 梦想CAD控件 2021.06.10更新
  3. windows python 执行cmd 命令启动浏览器跳转到指定网页
  4. AUC值越大_AUC的一般计算和近似计算方式
  5. Excel函数大全-转载
  6. 三菱m80润滑参数_三菱M80/M800功能指令参数说明一览表
  7. 微信开发之自动添加好友的技术实现
  8. 听劝,不要试图以编程为基础去学习网络安全
  9. FreeNAS Windows SMB文件共享及用户权限使用配置
  10. FPS最精确计算方式