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