Tarsos dsp Android AudioTrack播放静态或太快

时间:2014-09-21 06:21:12

标签: java android audio signal-processing audiotrack

这个问题让我感到沮丧了一段时间。我正在尝试使用Tarsos DSP对我正在为Android工作的项目执行一些基本的信号处理。音频来自44.1k,16位立体声的标准WAV文件。当我使用使用Android的AudioTrack输出声音的AudioProcessor设置并运行Tarsos AudioDispatcher时,我得到静态或音频播放速度太快。

以下是设置音频调度程序的代码

public void Play(String source, double startTime, final double endTime){
    InputStream wavStream;
    try {
        wavStream = new FileInputStream(source);
        UniversalAudioInputStream audioStream = new UniversalAudioInputStream(wavStream, audioFormat); 
        dispatcher = new AudioDispatcher(audioStream, bufferSize, overLap);
        AndroidAudioPlayer player = new AndroidAudioPlayer(audioFormat, buffersize);
        dispatcher.addAudioProcessor(player);
        dispatcher.skip(startTime);
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (dispatcher.secondsProcessed() < endTime) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                dispatcher.stop();
            }
        }).start();
        dispatcher.run();
        try {
            audioStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }catch (FileNotFoundException e){e.printStackTrace();}
}

我注意到的一件事是,如果我让AudioDispatcher运行整个WAV文件,它会报告处理的总秒数比WAV文件的标题中指示的长,这使得方法成为设置开始和结束时间不准确但仍然在边界内(通常)。 (为什么会这样?)**

以下是实现Tarsos AudioProcessor的AndroidAudioPlayer的代码:

public class AndroidAudioPlayer implements AudioProcessor {
private AudioTrack audioTrack;
AndroidAudioPlayer(TarsosDSPAudioFormat audioFormat, int bufferSize){
    audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
            (int)audioFormat.getSampleRate(),
            AudioFormat.CHANNEL_OUT_STEREO,
            AudioFormat.ENCODING_PCM_16BIT,
            bufferSize,
            AudioTrack.MODE_STREAM);
}
@Override
public boolean process(AudioEvent audioEvent){
    short[] shorts = new short[audioEvent.getBufferSize() / 2];
    ByteBuffer.wrap(audioEvent.getByteBuffer()).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shorts);
    audioTrack.write(shorts, 0, shorts.length);
    audioTrack.play();
    return true;
}

@Override
public void processingFinished(){}

}

我有另一个我写过的音频处理器,它使用AudioDispatcher使用JavaZoom从WAV文件中写入一个剪辑,它也会产生静态或不正确的音频。但是,当我使用InputStream和JavaZoom从WAV文件中编写剪辑时,它在某些时候工作正常或产生静态,我假设是因为我的方法依赖于Tarsos而错误地设置了startTime和stopTime变量。任何见解将不胜感激。

在调用上述方法之前,我最初调用一个方法,该方法在与Oscilloscope和ComplexOnsetDetector音频处理器相同的WAV文件上使用AudioDispatcher生成波形视图,并使用时间码填充数组。 audioFormat变量创建如下:TarsosDSPAudioFormat audioFormat = new TarsosDSPAudioFormat(sampleRate, 16, 2, false, false);,从WAV文件中读取采样率,并检查它是否正确读取。 *缓冲区大小为1024,重叠为512,我尝试使用所有这些值。

我已将缓冲区大小更改为64kb,重叠为32kb。当音频播放时,听起来几乎是正确的,跳过一点点。但是,它仍然有时只播放静态,无论我使用的WAV文件长度如何,AudioDispatcher都会报告它长达315秒*

**我已经解决了这个问题。我正在加载由JavaZoom MP3转换器创建的WAV文件,该文件不断地覆盖文件而不首先删除它。我认为Tarsos正在使用文件长度来确定由于覆盖删除而导致的播放长度不正确。删除文件首先解决了问题。

我只需要弄清楚为什么音频在播放过程中会跳过,有时只是静态播放然后我觉得我很高兴。

1 个答案:

答案 0 :(得分:0)

使用单声道(1声道)输入。 TarsosDSP音频处理器目前不支持立体声。