2013-12-18 3 views
0

나는 Android apps 중 하나에 openSL ES를 사용하고 있습니다. 앱이 포 그라운드에있을 때 콜백은 꽤 규칙적입니다. 마이크 콜백은 약 10ms마다 호출되므로 스피커 콜백도 있습니다. 그러나 배경에 앱을 넣고 브라우저 (또는 그 문제에 대한 다른 앱)를 열면 브라우저를 열 때 (또는 탐색 할 때) 콜백의 "폭풍"이 발생한다는 것을 알 수 있습니다. 그 문제를 해결할 방법이 있습니까? 그리고 그것은 왜 일어날까요? openSL은 콜백을 실행할 수없는 시간 동안 보상을합니까? (그것이 따라 잡으려고 노력하고있는 것처럼).openSL ES Android : 불규칙한 오디오 콜백

내 소스 코드 C에 있고 나는 AudioTrackAudioRecorder의 스레드 우선 순위를 높이기 위해 노력했다 Jelly Bean 4.3.

에있어, 그리고 도움이 보인다,하지만 난 그에게 방법 확실하지 않다 가기.

추가 질문

그래서 당신도 증가 스레드 우선 순위는 콜백의 버스트를 얻을 수 있고 당신이 그 폐기해야한다는 말을하는지?

어떻게 좋은 해결책입니까? 마이크 패킷을 버리거나 스피커 패킷의 소스를 뽑을 것입니다. 맞습니까? 마이크 패킷을 드롭하지 않으면 마이크 패킷의 수신기가 마이크 패킷 버스트를 과도한 지터로 해석합니다. 맞습니까?

더 중요하게는 : AudioTrack 및 AudioRecorder의 스레드 우선 순위를 수동으로 늘리고 sched 방침을 라운드 로빈으로 변경했습니다. BusyBox (스레드 우선 순위/sched 정책 변경을위한 명령 줄 유틸리티와 함께 ​​제공됨)의 루트 액세스와 설치가 모두 필요했습니다. C에서 프로그래밍 방식으로이 작업을 수행하는 방법은 무엇입니까? 나는 개별 스레드 우선 순위가 증가하고 내 앱 (프로세스)의 우선 순위가 아니라는 것을 확인하고 싶다.

+0

부재 중 콜백이 * 지연 * 된 경우? 아니면 당신이 기대하는 것보다 더? – marko

+0

나는 부재 중 콜백이 지연되면서 폭풍이 몰아 치고있다. – user1884325

+0

앱을 백그라운드로 가져 가면 오디오가 끊기거나 끊기는 현상이 발생 했습니까? – rmigneco

답변

1

예, 이것은 의도적으로 설계된 동작입니다. 스레드 우선 순위를 높이기 위해 시도하는 것은 합법적 인 방법입니다. 최상의 결과를 얻으려면 기본 버퍼 크기 및 샘플링 (Low-latency audio playback on Android 참조)으로 작업해야합니다. 결코 콜백이 발생하지 않을 것이라고 보장 할 수있는 방법이 없기 때문에 콜백의 버스트를 폐기 할 준비가되어 있어야합니다. 백그라운드에서 진행되는 동안 앱의 전체 CPU 사용량과 RAM 풋 프린트를 줄여야합니다.

+0

따라서 스레드 우선 순위가 증가해도 콜백 폭주가 발생하고이를 버려야한다고 말하는 것입니다. 어떻게 좋은 솔루션입니까? 마이크 패킷을 버리거나 스피커 패킷의 소스를 뽑을 것입니다. 맞습니까? 마이크 패킷을 드롭하지 않으면 마이크 패킷의 수신기가 마이크 패킷 버스트를 과도한 지터로 해석합니다. 맞습니까? 나는 원래의 질문을 편집했다. 추가 질문에 답변 해 주실 수 있습니까? 고맙습니다. – user1884325

+0

기타 답변 : 열심히 시도해도 파열이 계속 일어날 수 있다고 말하는 것은 좋지 않았습니다. 그러나 불행히도 콜백이 무시할 수있는 지터로 항상 도착한다는 보장은 없습니다. 메신저를 죽이지 마라. –

+0

스레드 스케줄러의 루팅 및 튜닝에 관해서는 잘못된 경로입니다. 안드로이드를 기반으로하는 커스텀 HW 솔루션을 만드는 경우, 먼저 커널에 일부 RT 패치를 적용해야합니다. 그렇지 않으면 버스트가 자주 발생하지는 않지만 계속 발생합니다. 여하튼 프로세스 (Process)만큼 높은 개별 스레드 우선 순위 (https://groups.google.com/forum/m/#!topic/android-developers/b2SKprSxPvw)를 설정할 수 있습니다.THREAD_PRIORITY_URGENT_AUDIO = -19', –

관련 문제