我正在开发一个Android视频播放器。我在本机代码中使用ffmpeg来解码视频帧。在本机代码中,有一个调用avcodec_decode_video2()的名为decode_thread的线程
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()的行为并给我一个解决方案吗?
发布于 2014-01-26 14:26:17
看起来视频解码功能的性能不可能仅仅因为你的线程休眠而提高。很可能视频解码线程被另一个线程抢占,因此你得到了增加的计时(因此你的线程不工作)。当您添加对usleep的调用时,这会将上下文切换到另一个线程。因此,当下次再次调度解码线程时,它将从整个CPU切片开始,并且在decode_ video2函数中不再中断。
你应该怎么做?你肯定想要比你展示的稍微提前一点解码数据包- avcodec_decode_video2的性能肯定不是恒定的,如果你试图保持领先一帧,你可能没有足够的时间来解码其中一个帧。
我会用解码的帧创建一个生产者-消费者队列,并有最高限制。解码器线程是一个生产者,它应该运行,直到它填满队列,然后它应该等待,直到有空间为另一个帧。显示线程是一个消费者,它将从该队列中获取帧并显示它们。
https://stackoverflow.com/questions/21359416
复制相似问题