Android 音视频深入 二 AudioTrack播放pcm(附源码下载)
本篇项目地址,名字是录音和播放PCM,求star
https://github.com/979451341/Audio-and-video-learning-materials
1.AudioTrack官方说明
AudioTrack允许PCM音频缓冲器流到音频接收器进行回放。这是通过“推”的数据对象的信号使用 write(byte[], int, int) and write(short[], int, int) 方法。
一个信号可以在两种模式下运行:静态或流。
在流模式中,应用程序写一个连续的数据流的信号,采用write()方法。这些都是封闭和返回时,数据已经从java层转移到本地层排队等候播放。在播放音频数据块时,流模式最为有用:
由于播放声音的持续时间太大而不适合于记忆,因为音频数据的特性(采样率高)
在处理适合于内存的短声音时,应该选择静态模式,并且需要以最小的延迟进行播放。因此,静态模式更适合于经常播放的UI和游戏声音,并且可能开销最小。
在创作中,一个声道对象初始化其相关音频缓冲区。这个缓冲区的大小,规定在施工过程中,确定多长时间的信号可以跑出来的数据之前玩。
使用静态模式的信号,这是声音的大小,可以发挥它的最大尺寸。
对于流模式,数据将被写入音频接收器,其大小小于或等于总缓冲区大小。信号不是终点,从而允许子类,但不推荐使用。
2.AudioTrack何如创建和配置
static public int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat)
public AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat,
int bufferSizeInBytes, int mode)
sampleRateInHz:采集率,有8000、20100等,一般来说越高音质越好,但文件体积就越大
streamType:音频流的类型,STREAM_VOICE_CALL,
STREAM_SYSTEM, STREAM_RING, STREAM_MUSIC, STREAM_ALARM, and
STREAM_NOTIFICATION,这个参数和Android中的AudioManager有关系,涉及到手机上的音频管理策略。
channelConfig:声道,单声道CHANNEL_OUT_MONO 和双声道 CHANNEL_OUT_STEREO
audioFormat:采样点大小,只有ENCODING_PCM_16BIT 和 ENCODING_PCM_8BIT两种选择,意思是一个采集点16bit或8bit
bufferSizeInBytes:AudioTrack一次所能接收最小的声音资源大小,通过getMinBufferSize函数获取,
mode:有MODE_STATIC和MODE_STREAM两种分类。
STREAM的意思是由用户在应用程序通过write方式把数据一次一次得写到audiotrack中,效率低。
而STATIC的意思是一开始创建的时候,就把音频数据放到一个固定的buffer,然后直接传给audiotrack,只有读取一次,这种方法对于铃声等内存占用较小,延时要求较高的声音来说很适用。
3.AudioTrack使用
其实这个和AudioRecord一样的道理,因为是播放,所以播放文件存在,直接读取文件,通过流的形式一次一次的读取数据,同时播放
首先创建AudioTrack
bufferSize = AudioTrack.getMinBufferSize(8000,
AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT);
// 实例AudioTrack
track = new AudioTrack(AudioManager.STREAM_MUSIC,
8000,
AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT, bufferSize,
AudioTrack.MODE_STREAM);
接着
track.play()
然后循环读取数据,读完了就stop(),自己中断的话就停止循环
track.play();
//writeToFileHead();
while (isStart) {
if (null != track&&dis.available() > 0) {
int i = 0;
while (dis.available() > 0 && i < buffer.length){
buffer[i] = dis.readShort();
i++;
}
track.write(buffer,0,buffer.length);
}
}
track.stop();
需要注意的是资源的及时释放
if (track != null) {
if (track.getState() == AudioRecord.STATE_INITIALIZED) {
track.stop();
}
if (track != null) {
track.release();
}
}
if (dis != null) {
dis.close();
}
4.AudioRecord和AudioTrack的对比
两者的功能刚好相反,一个产生pcm一个读取pcm,而运作的过程非常相似,都对流情有独钟,都是一次吃不了这么多,慢慢的吃,
mRecorder.startRecording();
//writeToFileHead();
while (isStart) {
if (null != mRecorder) {
bytesRecord = mRecorder.read(tempBuffer, 0, bufferSize);
if (bytesRecord == AudioRecord.ERROR_INVALID_OPERATION || bytesRecord == AudioRecord.ERROR_BAD_VALUE) {
continue;
}
if (bytesRecord != 0 && bytesRecord != -1) {
//在此可以对录制音频的数据进行二次处理 比如变声,压缩,降噪,增益等操作
//我们这里直接将pcm音频原数据写入文件 这里可以直接发送至服务器 对方采用AudioTrack进行播放原数据
dos.write(tempBuffer, 0, bytesRecord);
} else {
break;
}
}
}
就连资源释放都相似
if (mRecorder != null) {
if (mRecorder.getState() == AudioRecord.STATE_INITIALIZED) {
mRecorder.stop();
}
if (mRecorder != null) {
mRecorder.release();
}
}
if (dos != null) {
dos.flush();
dos.close();
}
完整的代码请看文章首部项目地址
Android 音视频深入 二 AudioTrack播放pcm(附源码下载)的更多相关文章
- Android 音视频深入 二十 FFmpeg视频压缩(附源码下载)
项目源码https://github.com/979451341/FFmpegCompress 这个视频压缩是通过类似在mac终端上输入FFmpeg命令来完成,意思是我们需要在Android上达到能够 ...
- Android中Canvas绘图基础详解(附源码下载) (转)
Android中Canvas绘图基础详解(附源码下载) 原文链接 http://blog.csdn.net/iispring/article/details/49770651 AndroidCa ...
- Android 音视频深入 十一 FFmpeg和AudioTrack播放声音(附源码下载)
项目地址,求starhttps://github.com/979451341/AudioVideoStudyCodeTwo/tree/master/FFmpeg%E6%92%AD%E6%94%BE%E ...
- arcgis api 4.x for js 自定义 Draw 绘制手绘面以及手绘线,只针对二维视图(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 4.x for js:esri 官网 api,里面详细的介绍 arcgis api 4.x 各个类 ...
- Android Paint的使用以及方法介绍(附源码下载)
要绘图,首先得调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上.Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进行设置,主要方法如下: se ...
- wpf 模拟抖音很火的罗盘时钟,附源码,下载就能跑
wpf 模拟抖音很火的罗盘时钟,附源码 前端时间突然发现,抖音火了个壁纸,就是黑底蕾丝~~~ 错错错,黑底白字的罗盘时钟! 作为程序员的我,也觉得很新颖,所以想空了研究下,这不,空下来了就用wpf, ...
- 照片管家iOS-实现本地相册、视频、安全保护、社交分享源码下载Demo
<照片管家> APP功能: 1.本地照片批量导入与编辑 2.本地视频存储与播放 3.手势密码.数字密码.TouchID安全保护 4.QQ.微信.微博.空间社交分享 5.其他细节功能. 运用 ...
- android Activity实现底部滑动弹出窗口及源码下载地址
在做微信.微博.qq等分享时,一般是点击分享按钮后会从底部弹出滑动窗口,然后选择要分享的社交平台进行分享.今日头条.腾讯新闻等内容App的评论也是从底部滑动弹出输入窗口,进行评论输入的.本篇文章就讲讲 ...
- Android 音视频开发(二):使用 AudioRecord 采集音频PCM并保存到文件
版权声明:转载请说明出处:http://www.cnblogs.com/renhui/p/7457321.html 一.AudioRecord API详解 AudioRecord是Android系统提 ...
随机推荐
- STL——map
看到map这里,都不知道它主要是干嘛的,你有没有这样的疑问. map的主要作用:提供对T类型的数据进行快速和高效的检索 .C++ STL中标准关联容器set, multiset, map, multi ...
- dict使用
里面的元素是:key: value d = { 'Adam':95, 'Lisa':85, 'Bart':59, 'Paul':75 } 打印:print d['Paul'] 注意: 通过 key ...
- Python中什么是变量
在Python中,变量的概念基本上和初中代数的方程变量是一致的. 例如,对于方程式 y=x*x ,x就是变量.当x=2时,计算结果是4,当x=5时,计算结果是25. 只是在计算机程序中,变量不仅可以是 ...
- Python全栈开发-Day11-RabbitMQ/Redis
本节内容 RabbitMQ——消息队列 Memcached & Redis使用 1.RabbitMQ——消息队列 RabbitMQ与Queue的关系 1.做的事情是一样的,两者都是队列. 2. ...
- 并发之ThreadLocal
ThreadLocal ThreadLocal 用一种存储变量与线程绑定的方式,在每个线程中用自己的 ThreadLocalMap 安全隔离变量,为解决多线程程序的并发问题提供了一种新的思路. 简 ...
- 雷林鹏分享:查看 XML 文件
查看 XML 文件 在所有主流的浏览器中,均能够查看原始的 XML 文件. 不要指望 XML 文件会直接显示为 HTML 页面. 查看 XML 文件 - Tove Jani Reminder Don' ...
- WPF——UI布局
1.规划整体布局(规划界面结构)——>这样就可以划分出若干区域(区域的控件通常是一些容器控件) 2.针对 上面的 “若干区域” ,制作每个区域的一级用户控件(然后,将该用户控件放入对应的区域中) ...
- 小程序用户openid设置放缓存
wx.setStorageSync('openid', res.data.data.openid),设置 var openid = wx.getStorageSync('openid')获取
- SWUST OJ(955)
单链表上查找算法的实现 #include <stdio.h> #include <stdlib.h> typedef struct LinkNode //单链表节点结构的定义 ...
- 谈一谈Vector类
一.关于Vector类的注意事项 1.从 Java 2 平台 v1.2 开始,vector类改进为实现 List 接口,成为 Java Collections Framework 的成员:所以vect ...