녹음 된 샘플을 사용하여 음악을 재생하는 Android 앱을 작성 중입니다 (SoundPool 사용). 현재 시간 (realTimeElapsed)에 따라 재생해야하는 샘플을 확인하는 Player가 있습니다. 플레이어는 1ms로 설정 한 타이머로 업데이트됩니다. 대부분의 경우에는 정상적으로 작동하지만 때로는 약 100ms의 지연이 있습니다.Android : 정확한 타이밍의 오디오 재생
타이머의 우선 순위를 높일 수있는 방법을 찾지 못했습니다. 이러한 지연을 얻을 수있는 또 다른 방법이 있습니까?
나는 동시에 OpenGL을 사용하여 장면을 렌더링하고 있지만 모든 도면을 비활성화하면 동일한 지연이 발생합니다.
감사
편집 :내가 TraceView으로 분석 : 오디오 스레드 (스레드-16)은 모든 밀리 실행됩니다. 그러나 t = 2580에서 약 200ms의 휴식이 있습니다. 스레드는이 기간 동안 Sleep에 있지 않지만 SoundPool.play 메서드에서 중단되고 중단됩니다. 이러한 지연이있을 때마다 오디오 스레드가 중단됩니다. 이러한 중단을 방지 할 방법이 없습니까?
GL 스레드 (오디오 스레드를 중단시키는)의 우선 순위를 THREAD_PRIORITY_LOWEST로 설정했습니다.
이미지를 마우스 오른쪽 버튼으로 클릭하고 "show image"또는 그 근처에서 전체 해상도로 이미지를 확인하십시오.
200ms는 의심스러운 큰 소리입니다. 가비지 수집으로 인한 것일 수 있습니까? 가비지 수집이 발생할 때 logcat에 인쇄되는 메시지가 있습니다. 프로세스의 메시지인지, 다른 임의의 프로세스가 아닌지 확인하십시오. – JesusFreke
현재 실행중인 GC가 없으면 TraceView에서 GC를 볼 수 있습니다. 이 200ms 동안 OpenGL 스레드가 항상 실행 중입니다. 이미지를 마우스 오른쪽 단추로 클릭하고 "이미지 표시"또는 그 근처에서 전체 해상도로 이미지를 확인하십시오. – osiris81
내가 소리를 내지 않으면 Soundpool의 문제 여야합니다. SoundPool의 play 메서드를 호출하지 않아도 전혀 지연이 없습니다. 이 문제에 대한 새 스레드를 열어야합니다. – osiris81