我正在开发一款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的建议吗? –
不可能检测到接下来调度的是哪个线程,而不会搞乱OS内核。你也不应该这样做,因为这可能不是你的应用程序线程,并且在任何情况下,这可能是一个不同的线程 - 请注意,你的Android操作系统正在运行许多不同的进程,许多多线程,并且最多只有4个CPU在您的设备中。 –
如果你有兴趣测量原始性能,我感觉你需要性能计数器;请参阅http://stackoverflow.com/questions/13729717/does-androidon-arm-have-the-hardware-performance-counters –