AudioTrack 使用
一、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 使用相关推荐
- android audiotrack使用问题:listener不回调的原因
部分人使用audiotrack,有可能会发现audiotrack的回调方法不回调,其实很多情况下是这样子的: 一般的音频数据源会起一个线程获取,一般新起的线程都没有looper,而audiotrack ...
- android audiotrack权限,Android中AudioRecord和AudioTrack的使用注意
AudioRecord需要至少 这项录音权限.有时候在AndroidManifest.xml中加进去后,有些手机系统仍然没有授予该权限.需要到手机的设置中的权限管理,把这项权限打开.没权限就会闪退.如 ...
- Android 音视频深入 十一 FFmpeg和AudioTrack播放声音(附源码下载)
项目地址,求star https://github.com/979451341/AudioVideoStudyCodeTwo/tree/master/FFmpeg%E6%92%AD%E6%94%BE% ...
- android音频系统之AudioTrack的使用
今天,简单讲讲 AudioTrack的使用. 1.Android AudioTrack简介 在android中播放声音可以用MediaPlayer和AudioTrack两种方案的,但是两种方案是 ...
- WebRTC 的 AudioSource/AudioTrack
按照 WebRTC 的设计,AudioSource 是一个音频源,它可以向外提供 PCM 音频帧数据,比如麦克风录制可以提供 PCM 音频帧数据,它应该是一个 AudioSource.然而在 WebR ...
- ktm390蓝牙连接安卓_蓝牙音乐AudioTrack Session ID的获取
当今这个音视频无处不在的时代,音频跟踪会话ID(AudioTrack Session ID)是个很重要的参数,可以用来实现音频相关的一些特效.接下来的内容我们就探究如何在安卓蓝牙系统中获取该id. 熟 ...
- Android之 AudioTrack学习
AudioTrack主要是用来播放声音的,AudioTrack贯穿了JAVA层,JNI层和Native层. AudioTrack JAVA层: framework\base\media\java\an ...
- Andorid之MediaPlayer和AudioTrack播放Audio的区别与联系
播放声音可以用MediaPlayer和AudioTrack,两者都提供了java API供应用开发者使用.虽然都可以播放声音,但两者还是有很大的区别的. 其中最大的区别是MediaPlayer可以播放 ...
- android 使用 audiorecord 和 audiotrack 实现实时录音播放
基本思路就是用 audiorecord不断得到音频数据,然后使用audiotrack 播放 //得到音频 package com.ysg.audiotest;import java.io.IOExce ...
- AudioTrack 播放PCM音频数据
AudioTrack 可以用来播放PCM数据,上一篇博客我讲了AudioRecord可以录制PCM数据 AudioTrack实例可以在两种模式下运行:静态或流式传输. 在Streaming模式下,应用 ...
最新文章
- NOIP2013 货车运输
- Arduino学习笔记1---开发环境搭建
- C#中导出Excel报表的方法
- AI指数评论:提防“路灯谬误”,开启全球多方对话
- chrome调试工具常用功能整理
- 时时监控的rtsp流视频显示在前端与一些css;
- 注入工具的原理和开发
- ES6之let和const
- 8除以2表示什么意思_平均配速8'12'是什么意思
- 不知道密码导出oracle数据库,Oracle数据库密码重置、导入导出库命令示例应用
- 1、.Net Core 基础
- 为了在简历上写掌握【Java虚拟机JVM】,做了该篇总结
- 一篇文章彻底搞懂Android事件分发机制
- STM32寄存器操作端口模式SDA_OUT()/SDA_IN()
- 福禄克FLUKE BT521 BT520 BT510 BT508护航储能电池安全
- 两台计算机之间的远程连接
- HTML heading
- 面对对象原则:高内聚、低耦合
- [CLI应用学习]实践使用GitHub CLI
- 20190422每周精品之认知