2014-09-21 3 views
2

이 문제는 당황 스럽습니다. 나는 Tarsos DSP를 사용하여 Android에서 작업중인 프로젝트에서 기본적인 신호 처리를 수행하려고합니다. 오디오는 44.1k, 16 비트 스테레오의 표준 WAV 파일에서 가져옵니다. Android의 AudioTrack을 사용하여 소리를 출력하는 AudioProcessor를 사용하여 Tarsos AudioDispatcher를 설정하고 실행할 때 나는 너무 빨리 재생되는 정적 또는 오디오를 얻습니다. 여기 Tarsos dsp Android AudioTrack이 정적이거나 너무 빠름

는 오디오 Dispatcher를 설정하는 코드입니다

내가 언급 한
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 파일에서 클립을 작성합니다. 그러나 WAV 파일에서 InputStream 및 JavaZoom을 사용하여 클립을 작성할 때 일부는 시간이 많이 걸리거나 Tarsos에 의존하는 메서드로 startTime 및 stopTime 변수가 잘못 설정되어 있기 때문에 정적 인 것으로 나타납니다. 어떤 통찰력이라도 대단히 감사하겠습니다.

위 메서드를 호출하기 전에 오실로스코프 및 ComplexOnsetDetector 오디오 프로세서가있는 동일한 WAV 파일에서 AudioDispatcher 메서드를 사용하여 파형보기를 생성하고 onset에 대한 시간 코드가있는 배열을 채 웁니다. audioFormat 변수는 다음과 같이 작성됩니다. TarsosDSPAudioFormat audioFormat = new TarsosDSPAudioFormat(sampleRate, 16, 2, false, false);, WAV 파일에서 샘플 속도를 읽고 올바르게 읽는지 확인했습니다. * 버퍼 크기는 1024이고 겹치는 부분은 512이며 모든 값을 가지고 재생 해 보았습니다.

버퍼 크기를 64kb로 변경하고 오버랩을 32kb로 변경했습니다. 오디오가 재생되면 거의 소리가 나지 않아 조금 건너 뜁니다. 그러나 가끔은 정적 인 경우에만 사용하고 내가 사용하는 WAV 파일의 길이에 상관없이 AudioDispatcher은 길이가 315 초 *이라고보고합니다.

**이 문제가 해결되었습니다. 파일을 먼저 삭제하지 않고 파일을 계속 덮어 쓰는 JavaZoom MP3 변환기에서 작성한 WAV 파일을로드하고있었습니다. Tarsos는 파일 길이를 사용하여 삭제 길이가 겹쳐 쓰기로 인해 잘못된 재생 길이를 결정했다고 생각합니다. 먼저 파일을 삭제하면 문제가 해결됩니다.

왜 나는 재생 중에 오디오가 건너 뛰고 때로는 정적으로 재생되는지 알아 내야 만합니다.

+0

현재 상태는 무엇입니까? –

+0

Tarsos에서이 문제를 결코 해결하지 못했습니다. 나는 대신에 처리를 스스로했습니다. Tarsos를위한 github에 대한 많은 활동이 있었으므로 몇 가지 해답이있을 수 있습니다. –

답변

0

모노 (1 채널) 입력을 사용하십시오. TarsosDSP 오디오 프로세서는 현재 스테레오를 지원하지 않습니다.