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.

[参考译文] AM68A:gstreamer 视频流的延迟和失真问题

Guru**** 2416110 points
Other Parts Discussed in Thread: AM69A

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1530336/am68a-latency-and-distortion-issues-with-gstreamer-video-stream

部件号:AM68A
主题中讨论的其他器件:AM69A

工具/软件:

您好:

我遇到了流延迟和视频失真问题。

摄像头的输入分辨率 3280x2464 我正在流式传输原始源、而不进行任何对象检测。

下面是链接元素的流水线分支:

if (!gst_element_link_many( stream_queue_cam1, final_scaler_stream_cam1, stream_videoconvert_cam1, final_caps_stream_cam1, stream_encoder_cam1, parser_stream_cam1, stream_muxer_cam1, stream_sink1, NULL)) {
g_printerr("Failed to link stream branch of CAM1.\n");
return;
}

元素属性:

  • STREAM_QUEUE_CAM1

g_object_set(G_OBJECT(stream_queue_cam1), "max-size-buffers", 2, "leaky", 2, NULL);
  • STREAM_ENCODER_CAM1 (使用)v4l2h264enc

  // STREAM_ENCODER_CAM1
  GstStructure *EXTRA_CONTROL_STREAM_CAM1 = GST_STRUCT_NEW(“controls",“,</s>、
    “H264_I_FRAME_PERIOD",“,G_TYPE_INT、G_TYPE_INT、30
    “video_bitrate",“,G_TYPE_INT、G_TYPE_INT、4000000、
    “video_bitrate_mode",“,G_type_INT、G_type_INT、1
    “H264_PROFILE",“,G_TYPE_INT、G_TYPE_INT、0、
    “H264_LEVEL",“,G_TYPE_INT、G_TYPE_INT、31、
    “VIDEO_GOP_SIZE",“,G_TYPE_INT、G_TYPE_INT、30
    “VIDEO_b_FRAME_COUNT",“,G_TYPE_INT、G_TYPE_INT、0
    “iframeinterval",“,G_TYPE_INT、G_TYPE_INT、1
    “ratecontrol_enable",“,G_type_Boolean、G_type_Boolean、true、
    “low_delaying",“,G_type_Boolean、G_type_Boolean、true、
    空)
  G_OBJECT_SET (G_OBJECT (STREAM_ENCODER_CAM1)、
    “extra-controls",“,extra_controls_stream_CAM1、extra_controls_stream_CAM1、
    空)
  GST_STRUCT_FREE (EXTRA_CONTROL_STREAM_CAM1);
  • STREAM_sink1 (使用 RTMP 流式传输)rtmp2sink

g_object_set(G_OBJECT(stream_sink1), "location", cam0_url, "sync", TRUE, "async", TRUE, "max-lateness", 20000000, "qos", TRUE, NULL);
  • final_caps_stream_CAM1

GstCaps *final_caps_stream_val_cam1 = gst_caps_new_simple("video/x-raw", "width", G_TYPE_INT, 1280, "height", G_TYPE_INT, 720, "framerate", GST_TYPE_FRACTION, 15, 1, NULL); g_object_set(G_OBJECT(final_caps_stream_cam1), "caps", final_caps_stream_val_cam1, NULL);
gst_caps_unref(final_caps_stream_val_cam1);

您能帮我确定流中延迟和失真的原因吗?

谢谢您、
Nihal

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Nihal:

    请在发布主题时使用有意义的标题、以便轻松识别主题并允许其他论坛用户进行搜索。

    我继续 更新了标题。

    此致

    Suman

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Nihal:

    您可以使用 gst_tracer 脚本查看导致延迟的原因。 编码器是否使用 DMA 缓冲器?

    此致、
    Jared

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jared、

    今天、我尝试使用双摄像头设置来调试问题。

    我运行了流式传输和节省管道 高分辨率单摄像头 和它完美的工作—与 无延迟或帧丢弃 问题。

    但是、当我使用运行相同的流水线时 不同的摄像机 ID 和服务器地址 同时对于第二台摄像机、问题就开始了。 我在两种不同的配置下对此进行了测试:

    • 甚至在我使用的时候 fakesinkrtmpsink对于另一个,我仍然观察到严重失真和非常高的帧跌落。

    • 我还测试了 A 包含两个摄像头流的单流水线 —一个使用rtmpsinkfakesink、另一个使用、但问题仍然存在。

    这使我怀疑它可能是一个 硬件限制 、可能是由于同时处理多个编码器或多路复用器。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Nihal:

     v4l2h264enc 的最大带宽为 3840x2160@60fps。 如果您流式传输的数据多于该数据、则会导致延迟。

    此致、
    Jared

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jared、
    输入分辨率 3280x2464 、我已将输出电容设置为 1280x720  用于流式传输和保存分支  。 我还指定了 帧速率为 15fps source_caps和输出电容器中。

    今天、我测试了用于autovideosink单个摄像头流的流水线。 它自身运行顺畅、不会出现任何问题。 但是、当我启动另一个管道时、问题就开始了—流式传输和显示都开始遇到性能问题。

    启用 GStreamer 调试日志后、我发现了重复的消息、表明了这一点 “缓冲区太多“ 或建议使用 计算机太慢 跟上步伐。

    谢谢你
    Nihal

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Nihal:

    如果您对两条管道都使用假链接、结果是什么?

    此致、
    Jared

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Nihal:

    似乎出现流式传输问题(显示冻结/帧复制) 仅当物体检测分支处于活动状态时

    [/报价]

    当您的基线测试显示没有问题时、情况如何?

    第一种情况(基线测试):

    • 一个分支 保存并检测物体 第二个分支是 要显示的原始流式传输
    • 结果: 即使保存分支具有对象检测功能、显示流仍能顺利运行、不会出现帧丢弃问题。
    [/报价]

    您能否运行 perf_stats 脚本以查看加速器中是否存在任何瓶颈?

    我将分享我当前用于的代码 具有物体检测和原始流式传输功能的单摄像头流水线
    我知道有很多问题、但您能请 仔细查看并指出我处理检测分支的方式是否可能导致该问题  (像过多的帧,背压或不正确的队列管理)?
    [/quote]

    您是否有 GST-launch-1.0 CLI 命令? 审查起来会容易得多。

    此致、
    Jared

    [/quote][/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。



    您好 Jared、

    CPU 负载汇总、
    ====================

    CPU:mpu1_0:总负载= 15。 0%(HWI = 0。 0%、SWI = 0。 0%)
    CPU:MCU2_0:总负载= 7。 0%(HWI = 0。 0%、SWI = 0。 0%)
    CPU:MCU2_1:总负载= 1。 0%(HWI = 0。 0%、SWI = 0。 0%)
    CPU:c7x_1:总负载= 11。 0%(HWI = 0。 0%、SWI = 0。 0%)
    CPU:c7x_2:总负载= 0。 0%(HWI = 0。 0%、SWI = 0。 0%)

    HWA 性能统计数据、
    ==========================

    HWA:VISS:负载= 51.12 %(354 MP/s)
    HWA:MSC0:负载= 100.78 %(471 MP/s)

    DDR 性能统计数据、
    ==========================

    DDR:读取 BW:平均值= 1839MB/s
    DDR:写入 BW:平均值= 1333 MB/s
    DDR:总 BW:平均值= 3172 MB/s

    SoC 温度统计
    =========================

    THERMAL_Zone0 (MCU_R5F):54.56 摄氏度
    Thermal_zone1 (MCU):56.08 摄氏度
    THERMAL_Zone2(编解码器):54.35 摄氏度
    Thermal_zone3 (DPHY):53.91 摄氏度
    THERMAL_Zone4 (R5F):54.78 摄氏度
    Thermal_zone5 (CPU):54.56 摄氏度
    THERMAL_Zone6 (C7x):55.22 摄氏度

    我查看perf_stats并注意到多标量的使用量相当高。 我计划分享我的管道流程图、以帮助您更好地了解流程、尤其是检测分支(从 T 型到标量队列)、以便您可以帮助识别任何潜在的瓶颈或设计问题。

    我试图将替换tiovxmultiscalervideoscale、但遇到了源代码协商问题。 是否有办法解决这一问题并videoscale有效使用、或者您建议坚持、tiovxmultiscaler而不是专注于优化管道?

    此外、我尝试仅使用一个标量(而不是两个)来减少检测分支中的标量数量。 我将散热垫属性设置为 820x616、将 src 属性设置为 320x320、然后移除中间封盖滤波器 (820x616)、在预处理之前只保留一个封盖滤波器为 320x320。 但是、这种变化会对检测性能产生负面影响。

    此外、在tiovxmultiscaler检测分支中的 TEE 和之间添加了一个队列后、高帧丢弃问题也得到了解决。 以前、我没有包括此内容scaler_queue、添加它有助于消除严重的机架跌落。

    现在、在运行两个摄像头的情况下、帧下降幅度很小、但我仍然看到流中存在中等失真。 但是、当使用三个摄像头运行时、会出现失真和明显的帧丢失。

    因此、此时:

    • 2 个摄像头: 低帧落、但失真度中等

    • 3 个摄像头: 高失真和中等帧落

    您能否提供有关解决这些问题和优化渠道的最佳方法的建议?

    谢谢您、
    Nihal

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。



    您好 Jared、

    CPU 负载汇总、
    ====================

    CPU:mpu1_0:总负载= 15。 0%(HWI = 0。 0%、SWI = 0。 0%)
    CPU:MCU2_0:总负载= 7。 0%(HWI = 0。 0%、SWI = 0。 0%)
    CPU:MCU2_1:总负载= 1。 0%(HWI = 0。 0%、SWI = 0。 0%)
    CPU:c7x_1:总负载= 11。 0%(HWI = 0。 0%、SWI = 0。 0%)
    CPU:c7x_2:总负载= 0。 0%(HWI = 0。 0%、SWI = 0。 0%)

    HWA 性能统计数据、
    ==========================

    HWA:VISS:负载= 51.12 %(354 MP/s)
    HWA:MSC0:负载= 100.78 %(471 MP/s)

    DDR 性能统计数据、
    ==========================

    DDR:读取 BW:平均值= 1839MB/s
    DDR:写入 BW:平均值= 1333 MB/s
    DDR:总 BW:平均值= 3172 MB/s

    SoC 温度统计
    =========================

    THERMAL_Zone0 (MCU_R5F):54.56 摄氏度
    Thermal_zone1 (MCU):56.08 摄氏度
    THERMAL_Zone2(编解码器):54.35 摄氏度
    Thermal_zone3 (DPHY):53.91 摄氏度
    THERMAL_Zone4 (R5F):54.78 摄氏度
    Thermal_zone5 (CPU):54.56 摄氏度
    THERMAL_Zone6 (C7x):55.22 摄氏度

    我查看perf_stats并注意到多标量的使用量相当高。 我计划分享我的管道流程图、以帮助您更好地了解流程、尤其是检测分支(从 T 型到标量队列)、以便您可以帮助识别任何潜在的瓶颈或设计问题。

    我试图将替换tiovxmultiscalervideoscale、但遇到了源代码协商问题。 是否有办法解决这一问题并videoscale有效使用、或者您建议坚持、tiovxmultiscaler而不是专注于优化管道?

    此外、我尝试仅使用一个标量(而不是两个)来减少检测分支中的标量数量。 我将散热垫属性设置为 820x616、将 src 属性设置为 320x320、然后移除中间封盖滤波器 (820x616)、在预处理之前只保留一个封盖滤波器为 320x320。 但是、这种变化会对检测性能产生负面影响。

    此外、在tiovxmultiscaler检测分支中的 TEE 和之间添加了一个队列后、高帧丢弃问题也得到了解决。 以前、我没有包括此内容scaler_queue、添加它有助于消除严重的机架跌落。

    现在、在运行两个摄像头的情况下、帧下降幅度很小、但我仍然看到流中存在中等失真。 但是、当使用三个摄像头运行时、会出现失真和明显的帧丢失。

    因此、此时:

    • 2 个摄像头:非常低  帧丢弃、但失真适中

    • 3 个摄像头:  高失真和中等帧落

    您能否提供有关解决这些问题和优化渠道的最佳方法的建议?

    谢谢您、
    Nihal

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Nihal:

    我建议沿用  tiovxmultiscaler。 克服多标量瓶颈的唯一方法是降低摄像头的分辨率、降低帧速率或移至具有 2 个多标量的 AM69A。

    您也可以裁剪图像。

    此致、
    Jared