2016-09-13 5 views
0

동일한 MediaCodec 개체에 액세스하는 두 개의 스레드가 있으며 동시에 실행해야 할 수도 있습니다. 이제 문제가 있습니다 : 두 스레드가 동시에 실행될 때 코드는 다음과 같습니다.MediaCodec 다중 스레드 참조

try { 
    mediaCodec.releaseOutputBuffer(encoderStatus, false); 
} catch (IllegalStateException e) { 
    e.printStackTrace(); 
} 

이 코드를 어떻게 처리합니까?

두 스레드가 동일한 mediaCodec 개체를 참조하기 때문에이 코드를 실행하는 스레드 중 하나가 mediaCodec에 대한 다른 스레드의 참조에 영향을주고 다른 스레드는 정상적으로 실행할 수 없습니다. 그것을 해결하는 방법?

+0

그냥 'mediaCodec' 개체에서 동기화 하시겠습니까? 우리는 당신이 무엇을 더 알기 위해 노력하는지 알지 못합니다. – SOFe

+0

나는 안드로이드 전화의 화면을 recorde하고 같은 시간에 전화에 MP4 파일을 저장하는 동안 그것을 PC에 밀어하려고합니다. 나는 스트림을 얻으려면 mediaCodec 개체를 사용하여 파일로 저장하려면 하나의 스레드를 사용하십시오 다른 스레드가 PC에 푸시합니다. 그러나 mediaCodec.releaseOutputBuffer (encoderStatus, false)를 실행하면 서로 영향을 미칩니다. 수정 방법을 모르겠습니다. – Max

답변

0

여러 스레드에서 현명한 접근 인 경우 MediaCodec인지 확실하지 않습니다. 동기화에주의해야하며 많은 동기화로 인코딩/디코딩 프로세스가 지연 될 수 있습니다.

MP4 파일을 저장하는 동안 PC로 밀어 넣으려면 한 스레드에서 MediaCodec 작업을 수행하고 출력 결과를 스레드 안전 대기열에 넣은 다음 다른 스레드에서 결과를 처리해야한다고 생각합니다. 비동기 적으로 (핸들러, Executor 등을 사용하여 수행 할 수 있음)

0

동기 모드에서 MediaCodec이 다중 스레드 안전성이 있어야 할 필요는 없지만 (예 : dequeueInputBuffer()에 스레드를 가질 수 있고 파이프 라인의 한쪽 끝을 채울 수 있습니다 , 그리고 dequeueOutputBuffer()에 대한 두 번째 스레드, 파이프 라인의 다른 끝을 배출), 난 2 Threads 및 1 MediaCodec 인스턴스 (그리고 내 애플 리케이션은 많은 장치에서 테스트되었습니다 충돌 할 어떤 HW 디코더 모르겠다). 나는 네가 잘하는 것 같아.