2011-02-28 3 views
1

AudioTrack 클래스를 사용하여 PCM 스트림을 재생하려고합니다. 다음 코드입니다.AudioTrack을 사용하여 Android의 소켓에서 오디오 스트리밍

AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, 20000, AudioTrack.MODE_STREAM); 
audioTrack.play(); 
// Reading data. 
byte[] data = new byte[200]; 
int n = 0; 
try { 
    while ((n = s.getInputStream().read(data)) != -1) 
     audioTrack.write(data, 0, n); 
} 
catch (IOException e) { 
    return; 
} 

불행히도 오디오가 계속 끊어집니다. 나는 audioTrack에 쓰는 대신에 파일에 데이터를 기록하려고 애쓰는 것으로 재생했다. 그것은 완벽하게 보인다. 중단 없음. audioTrack을 사용할 때 내가보고 한 코드에 문제가 있습니까? 아니면 단순히 데이터가 시간에 도착하지 않고 있을까요? 감사합니다.

답변

2

당신은 몇 가지 검사를 할 수있는 :

  1. 는 파일을 읽을 코드를 사용합니다. 파일을 스트림으로 열면됩니다.

  2. 처리량을 측정하십시오. 데이터 덩어리가 도착할 때마다 시간 (System. nanoTime())과 길이를 기록하십시오. 그런 다음 데이터가 늦게 도착하는지 계산할 수 있습니다.

+1

나는 파일을 스트리밍 해 보았고 완벽하게 작동했다. 중단 없음. 하지만 처리량을 계산하면 어떻게됩니까? 당신의 도움을 주셔서 감사합니다. –

+0

어디에서 데이터를 가져올 지 모르지만 AudioTrack이 데이터를 더 빨리 소비하고있는 것 같습니다. –

0

내가 전에 AudioTrack를 사용하지 않는했지만, this implementation로 버전을 비교하는 것은 내가 보는 가장 큰 차이점은 당신이 당신의 자신의 버퍼를 사용하는 것보다 다른 버퍼 크기와 AudioTrack 만드는 것입니다 : 20000200 대를. 나는 둘 다 동일한 크기를 사용하려고합니다.

+0

나는 이미 다른 값으로 시도했다. 나는 항상 방해를 받는다. –

2

가변 지연 시간 스트림에서 오디오 데이터를 읽고 동일한 스레드에서 audioTrack.write로 보내는 것은 관찰 한대로 제대로 작동하지 않습니다. 이것은 스트림에서 데이터를 읽고 (적당한 양의 버퍼링) 다른 하나는 audioTrack 객체에 오디오 데이터를 쓰는 2 개의 스레드에 대한 작업입니다. 한 번에 큰 블록의 오디오 데이터를 읽고 쓸 수는 있지만 잠재적으로 audioTrack 클래스는 제한을 두었습니다. 오디오 트랙 스레드가 쓰기 작업 후에 깨어 나면 해당 스레드에서 중요한 작업을 수행 할 수 없거나 오디오 출력에 간격이 생깁니다. 데이터의 연속적인 스트림을 제공해야합니다.

+0

그래서, 올바르게 이해하고 있다면 : 하나의 쓰레드가 소켓에서 읽고 데이터를 어딘가에, 아마도 공유 큐에 놓을 수 있습니까? 아니면 다른 구조를 제안합니까? 그 동안 다른 스레드는 해당 버퍼에서 audioTrack으로 데이터를 가져 와서 반복합니다. 이게 당신이 제안한 것입니까? 감사! –

+0

제 구현에서 저는 방금 워드 배열과 헤드/테일 포인터로부터 제 자신의 FIFO를 만들었습니다. 중요한 것은 audioTrack.write가 오디오 데이터를 수락 할 준비가되었을 때 오디오 데이터를 준비하는 것입니다. – BitBank

3

우선 순위가 높은 별도의 스레드에 코드를 삽입 해보십시오. 읽고 데이터를 기록하는 스레드의 실행()에서

android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO)

.