我发现使用audioTrack.setNotificationMarkerPosition(audioLength)和audioTrack.setPlaybackPositionUpdateListener对我有用.请参阅以下代码:

// Get the length of the audio stored in the file (16 bit so 2 bytes per short)

// and create a short array to store the recorded audio.

int audioLength = (int) (pcmFile.length() / 2);

short[] audioData = new short[audioLength];

DataInputStream dis = null;

try {

// Create a DataInputStream to read the audio data back from the saved file.

InputStream is = new FileInputStream(pcmFile);

BufferedInputStream bis = new BufferedInputStream(is);

dis = new DataInputStream(bis);

// Read the file into the music array.

int i = 0;

while (dis.available() > 0) {

audioData[i] = dis.readShort();

i++;

}

// Create a new AudioTrack using the same parameters as the AudioRecord.

audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, RECORDER_SAMPLE_RATE, RECORDER_CHANNEL_OUT,

RECORDER_AUDIO_ENCODING, audioLength, AudioTrack.MODE_STREAM);

audioTrack.setNotificationMarkerPosition(audioLength);

audioTrack.setPlaybackPositionUpdateListener(new OnPlaybackPositionUpdateListener() {

@Override

public void onPeriodicNotification(AudioTrack track) {

// nothing to do

}

@Override

public void onMarkerReached(AudioTrack track) {

Log.d(LOG_TAG, "Audio track end of file reached...");

messageHandler.sendMessage(messageHandler.obtainMessage(PLAYBACK_END_REACHED));

}

});

// Start playback

audioTrack.play();

// Write the music buffer to the AudioTrack object

audioTrack.write(audioData, 0, audioLength);

} catch (Exception e) {

Log.e(LOG_TAG, "Error playing audio.", e);

} finally {

if (dis != null) {

try {

dis.close();

} catch (IOException e) {

// don't care

}

}

}

java audiotrack_java – 如何告诉AudioTrack对象何时完成播放?相关推荐

  1. Java I/O中的对象序列化

    Java I/O中的对象序列化 Java对象序列化将那些实现了Serializable接口的对象转换成一个字节序列,并能够以后将这个字节序列完全恢复为原来的对象.利用对象的序列化,可以实现轻量级持久性 ...

  2. Java—面向对象设计—类和对象

    理解面向对象程序设计 面向对象程序(Object-oriented programming,OOP)设计是继面向过程又一具有里程碑意义的编程思想,是现实世界模型的自然延伸.下面从结构化程序设计说起,逐 ...

  3. Android—Java层与Native层对象的关联

    JNI 函数注册 静态注册: 1.java层的native方法, 如:public native void close(); 2.头文件:JNIEXPORT void JNICALL Java_and ...

  4. java基础(类与对象、集合)

    java基础(类与对象.集合) 类与对象 类与对象中的栈和堆 构造方法 this关键字 面向对象三大特性 封装性(private) 继承性(extends) 方法重写(@override) 多态性 向 ...

  5. android 接收js对象数组,java怎么接收js 数组对象数组对象

    java怎么接收js 数组对象数组对象 [2021-02-04 22:25:34]  简介: php数组转js数组对象的方法:首先获取[$arr]数组:然后使用函数[json_encode()]将数组 ...

  6. Java学习总结:51(对象序列化)

    对象序列化 对象序列化的本质实际上就是将内存中所保存的对象数据转换为二进制数据流进行传输的操作. 但并不是所有类的对象都可以直接进行序列化操作,要被序列化的对象所在的类一定要实现java.io.Ser ...

  7. Java学习总结:34(对象克隆)

    对象克隆 对象克隆就是对对象的复制操作,在Object类中存在一个clone()方法用于对象的克隆操作.该方法如下: protected Object clone() throws CloneNotS ...

  8. java培训教程分享:Java中怎样将数据对象序列化和反序列化?

    本期为大家介绍的java培训教程是关于"Java中怎样将数据对象序列化和反序列化?"的内容,相信大家都知道,程序在运行过程中,可能需要将一些数据永久地保存到磁盘上,而数据在Java ...

  9. java 如何对由json对象构成的数组形式的字符串进行遍历?

    1.情景展示 现在已知字符串为: [{"name":"微微笑","img":"http://zos.alipayobjects.c ...

最新文章

  1. 家庭扫地机器人竞争升级 带手臂提供移动服务或是未来方向
  2. 057_Unicode字符官方标准八
  3. php折半查找面试题,php 面试题(一)
  4. 解决input获取焦点时底部菜单被顶上来问题
  5. 土豆首页图片延迟加载的效果
  6. WPF 设置TextBox的输入法
  7. 2020年CISP线下考试逐渐恢复啦
  8. 计算机睡眠和休眠哪个更好,电脑睡眠和休眠哪个好?电脑休眠和睡眠的区别介绍...
  9. python饼图 立体_【Python基础】惊叹,Pyecharts绘制饼图原来可以如此漂亮!
  10. Android 自定义视频录制终极解决方案(翻转问题)
  11. 深度跳转-scheme
  12. 2015.9-2016.8年度总结
  13. qt 部署 错误_QT for Windows安装配置总结及采坑问题汇总
  14. chm 已取消到该网页的导航,打不开
  15. 警务系统三维可视化管理与情报研判综合分析平台
  16. vue实现textarea框,文字高度自适应
  17. 火狐浏览器和IE的CSS区别
  18. 史上最强的美名腾智能起名成功发布
  19. DataX oracle同步mysql(全量和增量)
  20. 男人应该摒弃“处女情结”

热门文章

  1. 电能质量在线监测装置化工厂医院光伏用
  2. python最小二乘法_用python实现最小二乘法
  3. java中的GC原理
  4. JQ循环获取input的值 $(...)[i].val is not a function
  5. Window 查看 端口操作
  6. 动态分配IP-DHCP协议详解
  7. .c与.h的真实解释
  8. 血型遗传关系c语言编程,血型遗传
  9. 【云原生】具体指什么呢---此文和大伙儿分享答案
  10. java中密码修改核心代码_彻底告别加解密模块代码拷贝-JCE核心Cpiher详解