gpt4 book ai didi

android - 在 Eclipse 上通过缓冲区使用 AudioTrack 缓冲区播放音乐 - 没有声音

转载 作者:太空宇宙 更新时间:2023-11-03 10:29:16 25 4
gpt4 key购买 nike

我正在为 Android 2.1 编程。你能帮我解决以下问题吗?

我有三个文件,一般目的是通过buffer.buffer来播放带有audiotrack的声音。我在这里变得非常绝望,因为我尝试了所有方法,但我的扬声器仍然没有声音(而 android 的集成媒体播放器通过模拟器播放声音没有问题)。

源代码:

音频播放器类,实现音轨。它将接收一个缓冲区,其中包含声音。

    public AudioPlayer(int sampleRate, int channelConfiguration, int audioFormat) throws ProjectException {
minBufferSize = AudioTrack.getMinBufferSize(sampleRate, channelConfiguration, audioFormat);
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, channelConfiguration,
audioFormat, minBufferSize, AudioTrack.MODE_STREAM);

if(audioTrack == null)
throw new ProjectException("Erreur lors de l'instantiation de AudioTrack");

audioTrack.setStereoVolume((float)1.0, (float)1.0);
}

@Override
public void addToQueue(short[] buffer) {
audioTrack.write(buffer, 0, buffer.length*Short.SIZE);
if(!isPlaying ) {
audioTrack.play();
isPlaying = true;
}
}

模型类,我用它来填充缓冲区。通常,它会从文件中加载声音,但这里它仅使用模拟器 (440Hz) 进行调试。

缓冲区大小的选择非常松散;通常第一个缓冲区大小应该是 6615,然后是 4410。同样,这仅用于调试。

public void onTimeChange() {
if(begin) {

//First fill about 300ms

begin = false;
short[][] buffer = new short[channels][numFramesBegin];
//numFramesBegin is for example 10000
//For debugging only buffer[0] is useful
fillSimulatedBuffer(buffer, framesRead);
framesRead += numFramesBegin;
audioPlayer.addToQueue(buffer[0]);

}

else {
try {
short[][] buffer = new short[channels][numFrames];

//Afterwards fill like 200ms

fillSimulatedBuffer(buffer, framesRead);
framesRead += numFrames;
audioPlayer.addToQueue(buffer[0]);
} catch (Exception e) {
e.printStackTrace();
}


}
}

private short simulator(int time, short amplitude) {
//a pure A (frequency=440)
//this is probably wrong due to sampling rate, but 44 and 4400 won't work either
return (short)(amplitude*((short)(Math.sin((double)(simulatorFrequency*time)))));
}

private void fillSimulatedBuffer(short[][] buffer, int offset) {
for(int i = 0; i < buffer[0].length; i++)
buffer[0][i] = simulator(offset + i, amplitude);
}

一个 timeTask 类,每 200 毫秒调用一次 model.ontimechange()。

public class ReadMusic extends TimerTask {
private final Model model;

public ReadMusic(Model model) {
this.model = model;
}


@Override
public void run() {
System.out.println("Task run");
model.onTimeChange();
}

}

调试向我展示了什么:

  • timeTask 工作正常,它完成了它的工作;
  • 缓冲区值看起来连贯,缓冲区大小大于 minBufSize;
  • Audiotrack 的播放状态为“正在播放”
  • 模型函数中没有捕获到异常。

任何想法将不胜感激!

最佳答案

好的,我发现了问题。

关于 AudioTrack 和短缓冲区输入的当前 AudioTrack 文档中存在一个错误:指定的缓冲区大小应该是缓冲区本身的大小 (buffer.length) 而不是字节大小。

关于android - 在 Eclipse 上通过缓冲区使用 AudioTrack 缓冲区播放音乐 - 没有声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8493045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com