Я разрабатываю Android-плеер для Android. Я использую ffmpeg в собственном коде для декодирования видеофрагмента. В родном коде, у меня есть нить под названием decode_thread, который вызывает avcodec_decode_video2()
Странное исполнение avcodec_decode_video2
int decode_thread(void *arg) {
avcodec_decode_video2(codecCtx, pFrame, &frameFinished,pkt);
}
У меня есть еще один поток, называемый display_thread, который использует aNativeWindow
для отображения декодированного кадра на SurfaceView.
Проблема в том, что если я разрешаю 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? –
Невозможно определить, что поток WHICH запланирован на следующий, не испортив ядро ОС. И вы не должны этого делать, поскольку это может быть даже не ваш поток приложений, и в любом случае это может быть другой поток каждый раз - обратите внимание на то, что ваша ОС Android запускает много разных процессов, много многопоточных, и у вас не более 4 процессоров в вашем устройстве. –
У меня возникло ощущение, что вам нужны счетчики производительности, если вам интересно измерить сырую производительность; см. http://stackoverflow.com/questions/13729717/does-androidon-arm-have-the-hardware-performance-counters –