- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了一个问题,我想在静态模式下反复播放半秒长的 AudioTrack
,但声音断断续续。但是,我注意到当 TransitionDrawable
并行运行时,声音非常清晰。
我的代码的简化框架是:
thread = new Thread(new Runnable() {
public void run() {
createTransition();
try {
createAudioTrack();
while (true) {
if (audio) {
playSoundClip();
}
if (display) {
playScreenTransition();
}
Thread.sleep(getDelayBetweenBeats());
}
} catch (InterruptedException e) {
} finally {
resetScreenTransition();
stopSoundClip();
}
}
private void createAudioTrack() {
short[] samples = generateSamples();
track = new AudioTrack(AudioManager.STREAM_MUSIC, SAMPLERATE, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, samples.length * 2, AudioTrack.MODE_STATIC);
if (track.getState() != AudioTrack.STATE_UNINITIALIZED) {
track.write(samples, 0, samples.length);
}
}
private void playSoundClip() {
if (track != null && track.getState() != AudioTrack.STATE_UNINITIALIZED) {
track.stop();
track.reloadStaticData();
track.play();
}
}
private void playScreenTransition() {
view.post(new Runnable() {
public void run() {
view.setBackgroundDrawable(transition);
transition.startTransition(DURATION);
}
});
}
});
thread.start();
如您所见,thread
未在 UI 线程上执行,因此我假设 track
面临多线程问题。我不认为播放过渡的 UI 线程会占用整个 CPU,因为我的音频是并行播放的。似乎该 Activity 以某种方式消耗了 CPU 而没有执行任何其他操作。
我也曾尝试在 playSoundClip()
中使用 view.post(new Runnable() {...});
,但这没有帮助.
我考虑过将所有更改为 AsyncTask
,但恕我直言,这不会更改任何内容,因为它仍然是后台任务。因为我不需要用声音更新 UI 元素,而且转换仍然必须并行播放,所以我什至没有尝试过。
一个解决方案可能是始终并行运行一些过渡(实际的或虚拟的),但这对我来说听起来很糟糕(双关语?)。
有谁知道另一种方法可以让 track
始终清晰播放?
编辑:
在这个问题上做了更多工作并扩展了我的程序后,我注意到我必须使用上面列出的线程方法,因为其中的逻辑需要一些时间才能完成,而且我无法在 UI 线程上完成所有操作更多的。目前,我在播放音频时播放虚拟过渡,这对我来说听起来仍然很糟糕。因此,如果您仍然可以对这个主题贡献一些见解,欢迎您在此处发布/回答。
最佳答案
您可能想看看 SoundPool
,它可以让您将短音频样本静态加载到内存中一次,然后以更低的延迟按需播放。您使用 AudioTrack
的方式可以很好地重播音频而无需重新加载,但对于如此短且经常重复的声音字节来说,它可能仍然有点笨重。
您也可以考虑完全不使用后台线程。从您的代码 fragment 看来,您实际上只是将 Thread
用作计时器,使用 Handler
发布您的 Runnable< 可能会获得更好的性能
在一个定时间隔(这也将允许您在主线程上调用您的音频/转换方法)。
HTH
关于Android:AudioTrack 与多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12520680/
我发现很多教程和帖子展示了如何使用 AudioTrack 在 AudioTrack.MODE_STREAM 中播放 wav 文件,我已经成功实现了 this example . 但是,我在一次播放多个
我正在试验 AudioTrack 类。基本上,当用户触摸屏幕上的特定对象时,我的应用程序必须发出声音。我用过 this example作为指南。 我的应用程序似乎可以正常运行,但通常在触摸屏幕大约一分
我有一个带有 AudioTrack 的线程,我在向下按钮上调用它,在向上按钮上我想停止音频。到目前为止,一切都很好。我的应用程序有 Activity A 和 Activity B。 Activity
我正在开发一个音频播放器,其中包含向 AudioTrack 提供的内容, 在 native 的帮助下,我从音轨中获得了声音,但事情是经过一段时间后,我的 AudioTrack 类中出现堆栈溢出错误。
文档说:sessionId-必须将AudioTrack附加到音频 session 的ID 我可以用这样的东西吗: MediaPlayer mp = MediaPlayer.create(this, R
我有一个 Android AudioTrack,例如: private AudioTrack mAudioTrack; int min = AudioTrack.getMinBufferSize(sa
我想在 android 中使用带有 PCM 16 位 channel 的立体声播放带有 AudioTrack 类的音乐轨道。这是我的 的代码MusicListFragment.java import
我正在尝试使用 AudioTrack 播放原始声音数据Android 中的类,我使用 write方法,但我注意到在 write 方法返回和播放实际声音之间存在延迟,为简单起见,让我们使用 AudioR
我有以下代码: public class MainActivity extends Activity { private int freq = 8000; private AudioR
我正在尝试在 Android 中播放一些循环声音,这对我来说效果很好。不过,所有美好的事情都必须结束,我希望这包括我的音频循环。但是,如果我调用 AudioTrack.release()在这个循环之后
我目前正在流模式下使用 AudioTrack 来播放一些预先录制的轨道。播放和停止机制正常工作。但是,当我按下暂停并尝试在之后恢复时,缓冲区只读取 -1,表明已达到 EOF。 我尝试标记并重置输入流,
我试图以 600hz 播放 10 秒的声音,但我得到 600hz 的播放时间不超过 3 秒。有人可以指出我做错了什么吗? int minBuffersize = AudioTrack.getM
我正在尝试使用 AudioTrack 播放音乐。轨道播放,但音频播放速度减半。就好像这首歌变成了慢动作。 try{ AudioTrack track= new AudioTrack( Audi
我已经像这样设置了一个 AudioTrack: public NoiseThread(byte[] data) { rawData = data; bufferSize = 2* Au
我遇到了一个问题,我想在静态模式下反复播放半秒长的 AudioTrack,但声音断断续续。但是,我注意到当 TransitionDrawable 并行运行时,声音非常清晰。 我的代码的简化框架是: t
我生成一个 PCM 并想要循环播放声音。我遵循文档,但 Eclipse 一直告诉我 08-05 15:46:26.675: E/AudioTrack(27686): setLoop invalid v
我正在尝试播放连续的正弦波流。当我按住按钮时,正弦波的频率会发生变化。一旦我松开按钮,它就会恢复正常频率。 当我运行以下代码时,输出声音会定期出现“咔嗒声”(尖锐的声压变化)——每秒大约 5 次咔
我想知道哪个版本的 SDK 支持“AudioTrack”类?是否可以从 1.5 SDK、1.6 SDK 和 2.0 SDK 使用“AudioTrack”? 谢谢。 最佳答案 我相信 AudioTrac
我在静态模式下使用 AudioTrack 一遍又一遍地再现相同的信号。 我按照这里的示例进行操作,有时效果很好,但有时会抛出此错误并且没有声音: AudioTrack: start called fr
我在初始化 android AudioTrack 时遇到问题。我有带 android 2.3.3 的 Nexus One。 这是我的代码: int _rate = AudioTrack.getNati
我是一名优秀的程序员,十分优秀!