这个问题让我感到沮丧了一段时间。我正在尝试使用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正在使用文件长度来确定由于覆盖删除而导致的播放长度不正确。删除文件首先解决了问题。
我只需要弄清楚为什么音频在播放过程中会跳过,有时只是静态播放然后我觉得我很高兴。
答案 0 :(得分:0)
使用单声道(1声道)输入。 TarsosDSP音频处理器目前不支持立体声。