java - Android 的 AudioTrack MODE_STATIC 重放问题

标签 java android audio

我对 AudioTrack 有疑问,这个 Android API 快要死了。我以前没有 Android 或 Java 经验,但我是一个非常有经验的编码人员(在很多平台上使用 asm、C++ 等),而且我从没想过我特别笨,就像 Android 现在让我有这种感觉一样。

我做错了什么?显然什么都没有:

audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, minbufsizbytes*64, AudioTrack.MODE_STATIC);
audioTrack.write(Buffer, 0, numSamples);
audioTrack.play();

实际上 sampleRate=8000 和 minbufsizbytes=742,(742*64 = 47488) 比我正在写的缓冲区(16000 个 16 位样本)大得多。

音频第一次播放时效果很好。但是...我如何多次播放它? (例如响应事件,例如按下钢琴键)。如果我再次调用 play(),将不会产生新的声音。所以经过几天的挫折,这就是我想出的:

for (i=0;;i++) {
   SystemClock.sleep(3000L); // so the problem is NOT "fast, repeated attempts to replay sound", but looks like internal buffer overrun related (please see the Log'ed error below)
   audioTrack.stop();
   audioTrack.reloadStaticData();
   audioTrack.setPlaybackHeadPosition(0);
   audioTrack.play();
}

所以它第二次播放声音或(!)第三次......然后没有音频!日志被这条错误消息淹没:

05-18 13:03:16.785: ERROR/AudioFlinger(345): TrackBase::getBuffer buffer out of range:
05-18 13:03:16.785: ERROR/AudioFlinger(345):     start: 0x404fb680, end 0x404fb7f2 , mBuffer 0x40507000 mBufferEnd 0x40512980
05-18 13:03:16.785: ERROR/AudioFlinger(345):                     server 0, serverBase 23744, user 47488, userBase 47488, channels 1

然后我必须重启手机(模拟的或真实的)否则日志泛滥不会停止..

(错误)在我的 Galaxy 2.2.1、我的 IDEOS 2.1 和模拟器(各种版本)上表现良好。所以这不是手机错误问题。

如果我使内部缓冲区更大(AudioTrack 中的第 5 个参数),它将在停止发出声音并开始充斥日志之前播放更多次,所以我认为这就像内部缓冲区被溢出了一样

附注:您是否知道 getMinBufferSize 是否返回样本或字节(即使对于 PCM_16BIT),正如一些人所报告的那样?

最佳答案

这是一个已经运行了好几次的代码示例!! 'super' 是一个 AudioTrack

公共(public)无效播放(){

    switch (super.getPlayState()) {
    case AudioTrack.PLAYSTATE_PAUSED:
    super.stop();
        super.reloadStaticData();
        super.play();
        break;
    case AudioTrack.PLAYSTATE_PLAYING:
    super.stop();
        super.reloadStaticData();
        super.play();
        break;
    case AudioTrack.PLAYSTATE_STOPPED:
        super.reloadStaticData();
        super.play();
        break;
    }

关于java - Android 的 AudioTrack MODE_STATIC 重放问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6049221/

相关文章:

java - 为什么 setImageResource 方法不起作用?

android - 如何在 Android 中制作拖放按钮

java - 编写一个在 Java 源文件中添加 HTTP 链接的 IntelliJ 插件

java - 如何将数组列表转换为多维数组

android - Vuforia 视频播放问题 - 视频倒转播放

php - 在请求播放之前,如何阻止嵌入的声音片段下载到浏览器缓存中?

swift - 在 Mac 上的 Swift 中暂停当前播放的音乐

python - 通过低通滤波器后,音频文件听起来不佳/嘈杂

java - 如何合并来自不同语言环境的 GWT 排列?

java - 比较 onClickListener 中的两个可绘制对象