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.

[参考译文] AM62A7:使用 HWA 编写视频

Guru**** 2399105 points
Other Parts Discussed in Thread: AM62A7

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1486659/am62a7-write-video-with-hwa

器件型号:AM62A7

工具与软件:

你好

我想使用硬件加速器来创建视频。

我正在基于 AM62A7 SDK 10.00的定制 Linux 电路板上开发。

我的目标是从摄像头模块捕获帧、单独存储这些帧、然后将其合并到视频中。

目前、我正在使用 CV::VideoWriter、但我想利用硬件加速来减少 CPU 的使用。

我使用以下 GStreamer 流水线将帧捕获为 CV::Mat、而不是 CV::VideoWriter、而是逐帧存储它们、并以这种方式推动它们。

GstElement* pipeline = gst_parse_launch(
        "v4l2src device=/dev/video3 io-mode=5 ! "
        "video/x-raw,format=UYVY,width=1920,height=1080,framerate=30/1 ! tiovxmemalloc pool-size=8 ! "
        "appsink name=sink emit-signals=True sync=True max-buffers=30 drop=False",
        nullptr);
        
cv::cvtColor(uyvy_img, img_bgr, cv::COLOR_YUV2BGR_UYVY);

 pipeline = gst_parse_launch(
            "appsrc name=mysource ! "
            "video/x-raw, format=NV12, width=1920, height=1080 framrate=7/1 ! "
            "v4l2h264enc ! h264parse ! avimux ! filesink location=/output.avi"
            , nullptr);
            
        appsrc = gst_bin_get_by_name(GST_BIN(pipeline), "mysource");

        gst_element_set_state(pipeline, GST_STATE_PLAYING);

        caps = gst_caps_new_simple(
            "video/x-raw",
            "format", G_TYPE_STRING, "NV12",
            "width", G_TYPE_INT, 1920,
            "height", G_TYPE_INT, 1080,
            "framerate", GST_TYPE_FRACTION, 7, 1,
            "interlace-mode", G_TYPE_STRING, "progressive",
            "colorimetry", G_TYPE_STRING, "bt709", 
            nullptr);

        gst_app_src_set_caps(GST_APP_SRC(appsrc), caps);
        
        for(int i=0;i<frames.size();i++){
            cv::Mat yuv_image;
            yuv_image = convertBGRtoNV12(frames[i]);
            buffer = gst_buffer_new_allocate(nullptr, yuv_image.total() * yuv_image.elemSize(), nullptr);

            gst_buffer_map(buffer, &map, GST_MAP_WRITE);
            memcpy(map.data, yuv_image.data, yuv_image.total() * yuv_image.elemSize());
            gst_buffer_unmap(buffer, &map);

            gst_app_src_push_buffer(GST_APP_SRC(appsrc), buffer);
       
            this_thread::yield(); 
            // this_thread::sleep_for(chrono::milliseconds(10));
        }

虽然运行正常、但在检查 perf_stats 时我观察到 CPU 使用情况没有变化、并且 HWA 统计信息中不显示任何内容。

谢谢你

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

    您好、Kim、

    我看到您的摄像头配置为提供 UVYY 帧进行编码、为什么要将其转换为 NV12? 我们的编码器还支持 UYVY 和 NV12作为输入格式。  

    此致、

    Suren

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

    感谢 Porwar、

    cv::cvtColor(uyvy_img, img_bgr, cv::COLOR_YUV2BGR_UYVY);

    我删除了此行和

    for(int i=0;i<frames.size();i++){
                cv::Mat yuv_image;
                yuv_image = frames[i];
                buffer = gst_buffer_new_allocate(nullptr, yuv_image.total() * yuv_image.elemSize(), nullptr);
    
                gst_buffer_map(buffer, &map, GST_MAP_WRITE);
                memcpy(map.data, yuv_image.data, yuv_image.total() * yuv_image.elemSize());
                gst_buffer_unmap(buffer, &map);
    
                gst_app_src_push_buffer(GST_APP_SRC(appsrc), buffer);
           
                this_thread::yield(); 
                // this_thread::sleep_for(chrono::milliseconds(10));
            }

    我按照您的建议修改了代码。

    起初,我看到了包含警告的日志,程序开始工作,但在大约40–50次迭代后停止。

    0:00:07.492101350  6678 0xffffb4001230 WARN v4l2bufferpool gstv4l2bufferpool.c:850:gst_v4l2_buffer_pool_start:<v4l2h264enc0:pool0:src> Uncertain or not enough buffers, enabling copy threshold
    0:00:07.742663075  6678 0xffffb4000ed0 WARN h264parse gsth264parse.c:2219:gst_h264_parse_update_src_caps:<h264parse0> VUI framerate 7.0 exceeds allowed maximum 0.2
    

    谢谢你

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

    您好、Kim、

    您能否共享整个日志进行分析?

    此外、您是否可以在运行这些迭代时观察 CMA 存储器?  

    此致、

    Suren

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

    您好、Porwar、

    这是在运行main函数之后、但在执行创建的管道之前捕获的日志filesink

    e2e.ti.com/.../7178.log1.txt

    这是在执行创建filesink.的管道后记录的日志、直至停止运行。

    e2e.ti.com/.../0245.log2.txt

    对于 CMA 监控、我watch -n 0.1 'cat /proc/meminfo | grep Cma'在执行应用程序时运行。 最初CmaTotal为589,825 KB 和583,256CmaFree KB。 在执行期间、CmaFree降至约45x、xxxKB。

    gst_debug_file=gst_debug/log gst_debug=5 logfile

    e2e.ti.com/.../6076.gst_5F00_debug.log

    谢谢

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

    您好、Kim、

    能否详细说明一下实际问题? 您是否看到 CPU 使用率高或性能指标未得到满足?

    可以使用 perf_stats 工具来在执行管道时查看 DDR BW 和 CPU 的使用情况。

    从日志中:

    0:00:00.876381270 [31m 2790[00m     0x208ec9e0 [37mDEBUG  [00m [00m        GST_REGISTRY gstregistry.c:1416:gst_registry_scan_path_internal:<registry0>[00m scanning path /usr/lib/python3.12/site-packages/cv2/../../../../lib/gstreamer-1.0
    0:00:00.878334410 [31m 2790[00m     0x208ec9e0 [37mDEBUG  [00m [00;01;36m  GST_PLUGIN_LOADING gstplugin.c:1709:gst_plugin_ext_dep_scan_dir_and_match_names:<plugin25>[00m g_dir_open(/dev/v4l2) failed: Error opening directory “/dev/v4l2”: No such file or directory
    0:00:00.879954540 [31m 2790[00m     0x208ec9e0 [37mDEBUG  [00m [00;01;36m  GST_PLUGIN_LOADING gstplugin.c:1709:gst_plugin_ext_dep_scan_dir_and_match_names:<plugin113>[00m g_dir_open(/root/.frei0r-1/lib) failed: Error opening directory “/root/.frei0r-1/lib”: No such file or directory
    0:00:00.880133780 [31m 2790[00m     0x208ec9e0 [37mDEBUG  [00m [00;01;36m  GST_PLUGIN_LOADING gstplugin.c:1709:gst_plugin_ext_dep_scan_dir_and_match_names:<plugin113>[00m g_dir_open(/usr/lib/frei0r-1) failed: Error opening directory “/usr/lib/frei0r-1”: No such file or directory
    0:00:00.880214755 [31m 2790[00m     0x208ec9e0 [37mDEBUG  [00m [00;01;36m  GST_PLUGIN_LOADING gstplugin.c:1709:gst_plugin_ext_dep_scan_dir_and_match_names:<plugin113>[00m g_dir_open(/usr/local/lib/frei0r-1) failed: Error opening directory “/usr/local/lib/frei0r-1”: No such file or directory
    0:00:00.880267180 [31m 2790[00m     0x208ec9e0 [37mDEBUG  [00m [00;01;36m  GST_PLUGIN_LOADING gstplugin.c:1709:gst_plugin_ext_dep_scan_dir_and_match_names:<plugin113>[00m g_dir_open(/usr/lib32/frei0r-1) failed: Error opening directory “/usr/lib32/frei0r-1”: No such file or directory
    0:00:00.880311640 [31m 2790[00m     0x208ec9e0 [37mDEBUG  [00m [00;01;36m  GST_PLUGIN_LOADING gstplugin.c:1709:gst_plugin_ext_dep_scan_dir_and_match_names:<plugin113>[00m g_dir_open(/usr/local/lib32/frei0r-1) failed: Error opening directory “/usr/local/lib32/frei0r-1”: No such file or directory
    0:00:00.880353760 [31m 2790[00m     0x208ec9e0 [37mDEBUG  [00m [00;01;36m  GST_PLUGIN_LOADING gstplugin.c:1709:gst_plugin_ext_dep_scan_dir_and_match_names:<plugin113>[00m g_dir_open(/usr/lib64/frei0r-1) failed: Error opening directory “/usr/lib64/frei0r-1”: No such file or directory
    0:00:00.880393410 [31m 2790[00m     0x208ec9e0 [37mDEBUG  [00m [00;01;36m  GST_PLUGIN_LOADING gstplugin.c:1709:gst_plugin_ext_dep_scan_dir_and_match_names:<plugin113>[00m g_dir_open(/usr/local/lib64/frei0r-1) failed: Error opening directory “/usr/local/lib64/frei0r-1”: No such file or directory
    0:00:00.881599465 [31m 2790[00m     0x208ec9e0 [37mDEBUG  [00m [00m        GST_REGISTRY gstregistry.c:1419:gst_registry_scan_path_internal:<registry0>[00m registry changed in path /usr/lib/python3.12/site-packages/cv2/../../../../lib/gstreamer-1.0: 0
    0:00:00.881705880 [31m 2790[00m     0x208ec9e0 [37mDEBUG  [00m [00m        GST_REGISTRY gstregistry.c:1650:gst_registry_remove_cache_plugins:<registry0>[00m removing cached plugins

    此致、

    Suren

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

    尊敬的 Powar:

    根据perf_stats、每次制作视频时、CPU 使用率增加约30-40%、我想降低这一比例。 为了降低 CPU 使用率、我尝试使用 HWA、而不是cv::VideoWriter通过 GStreamer 流水线创建视频、但 CPU 使用率未显著降低、并且我无法验证 HWA 统计信息。

    不管使用什么方法,我想减少 CPU 的使用,而创建视频.

    谢谢

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

    您好、Kim、

    您是否能够在您的设置中共享运行该简单 gstreamer 流水线的 perf_stats、以分析问题并帮助为您提供支持?

    gst-launch-1.0 -v v4l2src device=/dev/video3 io-mode=5 num-buffers=100!  video/x-raw、格式=UYVY、宽度=1920、高度=1080、帧速率=30/1!  v4l2h264enc! filesink location=test.264.

    此致、

    Suren

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

    尊敬的 Powar:

    当我使用流水线时、它不起作用、并显示以下错误

    警告:错误的管道:无法将 v4l2src0链接到 v4l2h264enc0。 v4l2h264enc0无法处理 cap video/x-raw、format=(string) UYVY、width=(int) 1920、height=(int) 1080、framerate=(fractional) 30/1。

    谢谢

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

    您好、Kim、

    您是否可以使用10.1 SDK 对此进行测试、因为10.1中增加了对 YUV 的支持  

    您也可以在10.0上返回此提交

    git.ti.com/.../wave5

    此致、

    Suren