首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >avcodec_decode_video2的奇怪性能

avcodec_decode_video2的奇怪性能
EN

Stack Overflow用户
提问于 2014-01-26 11:46:23
回答 1查看 923关注 0票数 0

我正在开发一个Android视频播放器。我在本机代码中使用ffmpeg来解码视频帧。在本机代码中,有一个调用avcodec_decode_video2()的名为decode_thread的线程

代码语言:javascript
复制
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上设置延迟。像这样的东西。

代码语言:javascript
复制
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()的行为并给我一个解决方案吗?

EN

回答 1

Stack Overflow用户

发布于 2014-01-26 14:26:17

看起来视频解码功能的性能不可能仅仅因为你的线程休眠而提高。很可能视频解码线程被另一个线程抢占,因此你得到了增加的计时(因此你的线程不工作)。当您添加对usleep的调用时,这会将上下文切换到另一个线程。因此,当下次再次调度解码线程时,它将从整个CPU切片开始,并且在decode_ video2函数中不再中断。

你应该怎么做?你肯定想要比你展示的稍微提前一点解码数据包- avcodec_decode_video2的性能肯定不是恒定的,如果你试图保持领先一帧,你可能没有足够的时间来解码其中一个帧。

我会用解码的帧创建一个生产者-消费者队列,并有最高限制。解码器线程是一个生产者,它应该运行,直到它填满队列,然后它应该等待,直到有空间为另一个帧。显示线程是一个消费者,它将从该队列中获取帧并显示它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21359416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档