2012-04-14 3 views
3

녹음 된 샘플을 사용하여 음악을 재생하는 Android 앱을 작성 중입니다 (SoundPool 사용). 현재 시간 (realTimeElapsed)에 따라 재생해야하는 샘플을 확인하는 Player가 있습니다. 플레이어는 1ms로 설정 한 타이머로 업데이트됩니다. 대부분의 경우에는 정상적으로 작동하지만 때로는 약 100ms의 지연이 있습니다.Android : 정확한 타이밍의 오디오 재생

타이머의 우선 순위를 높일 수있는 방법을 찾지 못했습니다. 이러한 지연을 얻을 수있는 또 다른 방법이 있습니까?

나는 동시에 OpenGL을 사용하여 장면을 렌더링하고 있지만 모든 도면을 비활성화하면 동일한 지연이 발생합니다.

감사

편집 :

내가 TraceView으로 분석 : 오디오 스레드 (스레드-16)은 모든 밀리 실행됩니다. 그러나 t = 2580에서 약 200ms의 휴식이 있습니다. 스레드는이 기간 동안 Sleep에 있지 않지만 SoundPool.play 메서드에서 중단되고 중단됩니다. 이러한 지연이있을 때마다 오디오 스레드가 중단됩니다. 이러한 중단을 방지 할 방법이 없습니까?

GL 스레드 (오디오 스레드를 중단시키는)의 우선 순위를 THREAD_PRIORITY_LOWEST로 설정했습니다. TraceView

이미지를 마우스 오른쪽 버튼으로 클릭하고 "show image"또는 그 근처에서 전체 해상도로 이미지를 확인하십시오.

+0

200ms는 의심스러운 큰 소리입니다. 가비지 수집으로 인한 것일 수 있습니까? 가비지 수집이 발생할 때 logcat에 인쇄되는 메시지가 있습니다. 프로세스의 메시지인지, 다른 임의의 프로세스가 아닌지 확인하십시오. – JesusFreke

+0

현재 실행중인 GC가 없으면 TraceView에서 GC를 볼 수 있습니다. 이 200ms 동안 OpenGL 스레드가 항상 실행 중입니다. 이미지를 마우스 오른쪽 단추로 클릭하고 "이미지 표시"또는 그 근처에서 전체 해상도로 이미지를 확인하십시오. – osiris81

+0

내가 소리를 내지 않으면 Soundpool의 문제 여야합니다. SoundPool의 play 메서드를 호출하지 않아도 전혀 지연이 없습니다. 이 문제에 대한 새 스레드를 열어야합니다. – osiris81

답변

0

타이머 대신 Handler.postDelayed()을 시도해보고 더 나은 결과를 얻는 지 확인하십시오.

아니요, 아니면 Thread.Sleep()의 짧은 스레드 일 수도 있고 System.nanoTime()의 확인 일 수도 있습니다.

+0

안녕하세요, 답변 주셔서 감사합니다. 두 가지를 시도했지만 실제 성공은 없습니다. Handler.postDelayed를 사용하는 것은 Timer와 거의 같습니다. 나는 현재 자신의 스레드를 높은 우선 순위로 사용하고 있고 1ms 동안 잠을 자지 만, 여전히 약 100ms의 지연이 있습니다 ... – osiris81