我正在使用ffmpeg libx264来编码从x11实时捕获的720p屏幕,其fps为30.当我使用-tune zerolatency参数时,每帧的平均编码时间可以与配置文件基线一样大到12ms.
在研究了ffmpeg x264源代码之后,我发现导致如此长编码时间的关键参数是切片线程,它通过-tune zerolatency启用.使用-x264-params slic-threads = 0禁用后,编码时间可低至2ms
禁用切片线程后,CPU使用率将为40%,而启用时仅为20%.
有人可以解释这个切片线程的细节吗?特别是在实时编码中(假设没有帧被缓冲以进行编码.仅在捕获帧时进行编码).
我遇到了使用共享上下文的问题:
我有两个线程,每个都有一个上下文,比如Thr1(thread1)和Ctx1(Context1)以及Thr2和Ctx2.Ctx2与Ctx1共享创建.
然后,在Thr2中,我使用Ctx2创建一些纹理作为当前上下文,并进行一些渲染.之后,我销毁Ctx2并完成Thr2.
现在问题出现了:在我销毁Ctx2之后,在Ctx2下创建的纹理没有被释放(其中一些,不是全部).我使用gDebugger来配置我的程序,看到这些纹理没有被释放,并列在Ctx1下.
当我重复创建Thr2/Ctx2并创建纹理并破坏Thr2/Ctx2时,纹理变得越来越多,以及内存.
我尝试过的:
在销毁Ctx2之前删除Thr2中的纹理;
在Thr2中使Ctx1成为当前并尝试删除纹理,在Ctx2被破坏之前;