【发布时间】:2014-12-22 12:11:22
【问题描述】:
这是我正在使用的代码:
void playSound(){
final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
sampleRate, AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT, generatedSnd.length,
AudioTrack.MODE_STATIC);
// audioTrack.setNotificationMarkerPosition(generatedSnd.length/2);
audioTrack.setNotificationMarkerPosition(1);
audioTrack.setPlaybackPositionUpdateListener(new AudioTrack.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));
Log.d("MY LOG", "Audio track end of file reached...");
bitPatternValTextView.setText("End of play");
}
});
audioTrack.write(generatedSnd, 0, generatedSnd.length);
audioTrack.play();
}
playSound() 函数在内部定义
公共类 InSituActivity 扩展 ActionBarActivity{...}
我的假设是,当 AudioTrack 的播放到达第 N 个音频样本(每个 N 是一个短字节或 2 个字节)时,audioTrack.setNotificationMarkerPosition(N); 将导致 onMarkerReached(AudioTrack track) 被调用。但是,如我的示例代码所示,我尝试了generatedSnd.length/2(generatedSnd[] 是一个包含我要播放的音频样本的字节数组)以及使用小的常量值,例如 1、10 或 20,以及 @987654329在任何这些情况下,@ 似乎都不会被调用。这里有什么问题,我该如何解决?我希望能够在当前 AudioTrack 完成播放时播放另一种声音。 playSound() 函数本身将在一个线程中调用(与 UI 线程分开)。
这是我从以下位置获取代码的地方:
How to tell when AudioTrack object has finished playing?
其他参考:
AudioTrack: how to detect end of sound?
Confusion about Thread life and AudioTrack in android java
【问题讨论】:
-
您应该使用 setNotificationMarkerPosition 而不是 1 的帧数中的文件长度。顺便说一句,它应该是很大的数字。
-
1 只是一个测试编号,如果它正在工作,我应该在 logcat 中看到一些通知
-
如果您使用单独的线程,请尝试 MODE_STREAM,并循环输入 AudioTrack 直到数据结束
-
好吧,这似乎可行,但为什么它不适用于静态?
-
提要音轨是什么意思?我在 generatedSnd 数组中有我需要生成的所有音频样本,我认为将所有内容都播放为静态会更好
标签: java android audio audiotrack