2014-01-26 4 views
0

Android 비디오 플레이어를 개발 중입니다. 나는 네이티브 코드에서 ffmpeg를 사용하여 비디오 프레임을 디코딩합니다. 네이티브 코드에서, 나는 서피스 뷰 SurfaceView에 디코딩 프레임을 표시하는 aNativeWindow를 사용 display_thread라는 또 다른 스레드가 avcodec_decode_video2()이상한 성능의 avcodec_decode_video2

int decode_thread(void *arg) { 
    avcodec_decode_video2(codecCtx, pFrame, &frameFinished,pkt); 
} 

를 호출하는 스레드라는 decode_thread 있습니다.

문제는 내가 decode_thread를 지연없이 연속적으로 실행하게하는 것입니다. avcodec_decode_video2()의 성능이 크게 저하됩니다. 때로는 프레임 디코딩에 약 0.1 초가 걸립니다. 그러나 만약 내가 decode_thread에 지연을 넣어. 뭔가가 좋아해요.

int decode_thread(void *arg) { 
    avcodec_decode_video2(codecCtx, pFrame, &frameFinished,pkt); 
    usleep(20*1000); 
} 

avcodec_decode_video2()의 성능은 약 0.001 초 정말 좋은 것입니다. 그러나 decode_thread에 지연을 가하는 것은 재생에 영향을 미치기 때문에 좋은 해결책이 아닙니다. 누구든지 avcodec_decode_video2()의 동작을 설명하고 해결책을 제안 할 수 있습니까?

답변

1

스레드가 잠자기 상태이기 때문에 비디오 디코딩 기능의 성능이 향상되는 것은 불가능합니다. 비디오 디코딩 스레드가 다른 스레드에 의해 선점 될 가능성이 높으므로 타이밍이 높아집니다 (따라서 스레드가 작동하지 않습니다). usleep에 대한 호출을 추가하면 컨텍스트가 다른 스레드로 전환됩니다. 따라서 다음 번에 디코딩 스레드가 다시 예약되면 전체 CPU 슬라이스로 시작하여 더 이상 decode_ video2 함수에서 인터럽트되지 않습니다.

어떻게해야합니까? avcodec_decode_video2의 성능은 확실히 일정하지 않으며 앞으로 하나의 프레임 만 유지하려고하면 프레임 중 하나를 디코딩 할 시간이 충분하지 않을 수 있습니다.

나는 최고 한계를 지닌 디코딩 된 프레임으로 생산자 - 소비자 대기열을 만들 것입니다. 디코더 스레드는 제작자이며 큐를 채울 때까지 실행해야하며 다른 프레임을 저장할 공간이 생길 때까지 기다려야합니다. 디스플레이 스레드는 소비자이며이 대기열에서 프레임을 가져 와서 표시합니다.

+0

SDL_CreateThread()를 사용하여 스레드를 만듭니다. 어떤 스레드가 decode_thread를 선점하는지 검색하는 방법에 대한 제안 사항을 제공해 주시겠습니까? –

+0

OS 커널을 망치지 않고 다음에 예약 된 스레드를 감지 할 수 없습니다. 어쨌든 이것은 당신의 어플리케이션 스레드조차도 아니기 때문에 그렇게하지 않아도됩니다. 그리고 어쨌든 이것은 매번 다른 스레드 일 수 있습니다 - 당신의 안드로이드 OS는 많은 다른 프로세스를 실행하고 있고, 다중 스레드가 많으며 당신은 최대 4 개의 CPU를 가지고 있습니다 귀하의 장치에. –

+0

원시 성능을 측정하는 데 관심이 있다면 성능 카운터가 필요하다는 생각이 들었습니다. http://stackoverflow.com/questions/13729717/does-androidon-arm-have-the-hardware-performance-counter를 참조하십시오. –

관련 문제