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()의 동작을 설명하고 해결책을 제안 할 수 있습니까?
SDL_CreateThread()를 사용하여 스레드를 만듭니다. 어떤 스레드가 decode_thread를 선점하는지 검색하는 방법에 대한 제안 사항을 제공해 주시겠습니까? –
OS 커널을 망치지 않고 다음에 예약 된 스레드를 감지 할 수 없습니다. 어쨌든 이것은 당신의 어플리케이션 스레드조차도 아니기 때문에 그렇게하지 않아도됩니다. 그리고 어쨌든 이것은 매번 다른 스레드 일 수 있습니다 - 당신의 안드로이드 OS는 많은 다른 프로세스를 실행하고 있고, 다중 스레드가 많으며 당신은 최대 4 개의 CPU를 가지고 있습니다 귀하의 장치에. –
원시 성능을 측정하는 데 관심이 있다면 성능 카운터가 필요하다는 생각이 들었습니다. http://stackoverflow.com/questions/13729717/does-androidon-arm-have-the-hardware-performance-counter를 참조하십시오. –