器件型号: TDA4VH-Q1
Thread 中讨论的其他器件: TDA4VH
工具/软件:
TDA4VH
SDK 11.0 Linux+FreeRTOS
TDA4VH-Q1:v4l2h264enc CPU 负载优化
上述文章中提到的 v4l2h264enc 使用案例是否有任何更新?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
器件型号: TDA4VH-Q1
Thread 中讨论的其他器件: TDA4VH
工具/软件:
TDA4VH
SDK 11.0 Linux+FreeRTOS
TDA4VH-Q1:v4l2h264enc CPU 负载优化
上述文章中提到的 v4l2h264enc 使用案例是否有任何更新?
你(们)好
我们使用的 gstreamer 命令如下
[2025-06-13 12:08:11] gst_wrapper: GstCmdString: [2025-06-13 12:08:11] appsrc format=GST_FORMAT_TIME is-live=true do-timestamp=true block=false name=myAppSrc0 ! queue [2025-06-13 12:08:11] ! video/x-raw, width=(int)1536, height=(int)1728, framerate=(fraction)30/1, format=(string)NV12, interlace-mode=(string)progressive, colorimetry=(string)smpte240m [2025-06-13 12:08:11] ! v4l2h264enc [2025-06-13 12:08:11] ! video/x-h264 [2025-06-13 12:08:11] ! h264parse config-interval=-1 [2025-06-13 12:08:11] ! queue ! appsink name=myAppSink0 max-buffers=50 drop=true [2025-06-13 12:08:11] [2025-06-13 12:08:11] GstPipe init status 0!
2.我们使用“top -H -p pid“命令发现, t_h264_save 线程(将 H264 文件保存到文件系统)的 CPU 负载非常低,只有 1.7%,但 queue0:Gstreamer src 线程(应该是 Gstreamer 命令行中的第一个“队列“)相当高,为 14%。
为什么队列 0:src 线程会消耗这么多 CPU? 这是合理的吗?

3.由 perf 生成的火焰图还显示、queue0:src 的负载最高。您可以下载 out.zip 文件进行查看。

您好:
appSrc 正在传递多少个流?
队列元素的作用是解耦上行元素和下行元素。 第一个队列配置为持续轮询将帧推入下游、以保持时序同步。 我建议尝试设置 is-live=false 和 blocking=true、以查看 CPU 是否中断且未发生不同步。 如果帧不同步、则需要 is-live=true。
请告诉我这是否有用、如果不有用、我们可以探索其他一些属性来限制队列元素的 CPU 利用率。
谢谢、
Sarabesh S.
你(们)好
appSrc 正在传递多少个流?
我们的应用使用马赛克节点将六幅图像合并成一幅 1536*1728 图像,然后将其推送到 appsrc。 实际帧速率约为每秒 23 帧。
我建议尝试设置 is-live=false 和 blocking=true、以查看 CPU 是否中断、是否发生不同步。
我们尝试配置 is-live=false 和 block=true、但 CPU 负载没有变化。实际帧速率与之前相同、每秒 23 帧。

您好:
是否可以尝试使用具有以下属性的队列:
队列泄漏=下行最大大小 — 时间=87000000
我注意到、您的流水线没有利用 dma-buf 来避免 memcpys 从 appsrc 摄像头缓冲器到下游元素。 这可能是 CPU 开销的来源、无法通过对队列元素设置限制来降低 CPU 开销。 您是否还可以使用 gst_debug=queue:6 gst_debug_no_color=1 gst_debug_file=queue.log 运行应用程序并共享日志、以便我们可以看到每个队列的满量程度。
谢谢、
Sarabesh S.
你(们)好
[引述 userid=“567667" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1574476/tda4vh-q1-v4l2h264enc-cpu-load-optimization/6080620是否可以尝试使用具有以下属性的队列:
队列泄漏=下行最大大小 — 时间=87000000
[/报价]我们尝试了此配置、似乎 CPU 负载没有发生显著变化。
您是否还可以使用 gst_debug=queue:6 gst_debug_no_color=1 gst_debug_file=queue.log 运行应用程序并共享日志、以便我们可以看到每个队列获得的满量。

您可以下载“queue.zip"文件“文件进行查看。
您好:
在这个问题上是否有进一步的进展? 如上所述、您需要利用 dma-buf 来降低 CPU 利用率、以及流水线中元素之间的存储器副本。 此外,由于您正在使用 Appsink 写入文件,您无疑会看到用于写入文件的 CPU 使用情况,您可以尝试使用 fakesink 来查看您是否看到任何改进。
根据上面的命令、您会显示编码器硬件的 CPU 利用率实际上非常低~1.7%、我认为这种利用率不会低得多。 您可以尝试将以下内容添加到 vl42h264enc 元素中:
i += snprintf(¶ms->m_cmdString[i], CODEC_MAX_LEN_CMD_STR-i,"! v4l2h264enc output-io-mode=4 capture-io-mode=2 bitrate=1500000 \n");
并将摄像机配置为从 v4l2 元素导入缓冲区。
谢谢、
Sarabesh S.