gpt4 book ai didi

android - avcodec_decode_video2 的奇怪表现

转载 作者:行者123 更新时间:2023-12-04 23:17:09 25 4
gpt4 key购买 nike

我正在开发一个 Android 视频播放器。我在 native 代码中使用 ffmpeg 来解码视频帧。在 native 代码中,我有一个名为 decode_thread 的线程调用 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() 的行为并建议我一个解决方案?

最佳答案

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

你该怎么办?你肯定想比你展示的更早一点解码数据包——avcodec_decode_video2 的性能当然不是恒定的,如果你试图保持领先一帧,你可能没有足够的时间来解码其中一帧。

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

关于android - avcodec_decode_video2 的奇怪表现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21359416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com