Fab*_*bio 6 java audio android
我有一个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();
Run Code Online (Sandbox Code Playgroud)
实际上,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();
}
Run Code Online (Sandbox Code Playgroud)
所以它第三次播放声音(!)然后没有音频!并且Log会被此错误消息淹没:
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
Run Code Online (Sandbox Code Playgroud)
然后,我必须重新启动手机(模拟或真实)否则日志洪水不会停止..
(mis)在我的IDEOS 2.1和模拟器(各种版本)上运行我的Galaxy 2.2.1 ..所以这不是手机错误问题.
如果我使内部缓冲区更大(AudioTrack中的第5个参数),它会在停止发出声音并开始充斥日志之前播放更多次,所以我认为这就像内部缓冲区是否超过
PS:你知道getMinBufferSize是否返回样本或字节(即使对于PCM_16BIT),正如一些人报道的那样?
小智 5
这是运行了几次的代码示例!!“ super”是一个音轨
公共无效玩(){
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;
}
Run Code Online (Sandbox Code Playgroud)
}
| 归档时间: |
|
| 查看次数: |
5298 次 |
| 最近记录: |