wangweiup 2025-04-22 19:52 采纳率: 0%
浏览 37

RV1126芯片DVR 系统CPU占用高的问题

RV1126芯片DVR 系统CPU占用高的问题
问题描述:
使用RV1126做车载DVR,DVR接四路AHD1080P摄像头,业务需求是每路摄像头需要分别编码主码流1080P和子码流D1分辨率的两路码流

方案一:使用RGA来缩放产生D1分辨率的子码流,业务流程如下:

第一个摄像头:
VI(0,0)-1080P ------------------------------>VENC(0,0)-1080P
VI(0,0)-1080P------>RGA(0,0)-D1------->VENC(1,1)-D1

第二个摄像头:
VI(1,1)-1080P ------------------------------>VENC(2,2)-1080P
VI(1,1)-1080P------>RGA(1,1)-D1------->VENC(3,3)-D1

第三个摄像头:
VI(2,2)-1080P ------------------------------>VENC(4,4)-1080P
VI(2,2)-1080P------>RGA(2,2)-D1------->VENC(5,5)-D1

第三个摄像头:
VI(3,3)-1080P ------------------------------>VENC(6,6)-1080P
VI(3,3)-1080P------>RGA(3,3)-D1------->VENC(7,7)-D1

这样下来发现CPU占用率极高,平均值达到40-50%。最初怀疑编码性能不足导致,把主子码流都注释掉,发现CPU占用率并没有明显改善。最后发现性能瓶颈在RGA,在只使用主码流情况下CPU占用率正常,一般在10%以下,而只要一打开RGA,CPU占用率就明显增加,达到40%+。后尝试使用方案二使用VP来缩放。

方案二:使用VP来缩放产生D1分辨率的子码流,业务流程如下:

第一路摄像头:
VI(0,0)-1080P---------------------------------- >VENC(0,0)-1080P
VI(0,0)-1080P--------VP(0,0)-D1------------->VECN(1,1)-D1

第二路摄像头:
VI(1,1)-1080P----------------------------------->VENC(2,2)-1080P
VI(1,1)-1080P--------VP(1,1)-D1------------->VECN(3,3)-D1

第三路摄像头:
VI(2,2)-1080P----------------------------------->VENC(4,4)-1080P
VI(2,2)-1080P--------VP(2,2)-D1------------->VECN(5,5)-D1
第四路摄像头:
VI(3,3)-1080P----------------------------------->VENC(6,6)-1080P
VI(3,3)-1080P--------VP(3,3)-D1------------->VECN(7,7)-D1

发现对比方案一使用RGA CPU占用率高的问题并没有明显改善。
分析方案二的性能瓶颈在VP。如果开启主码流,不使用VP,系统CPU占用率在10%一下:
如下图所示:

img

但是只要打开VP并开启子码流,系统CPU占用率就飙升到40%左右,如下图所示:

img

这时,如果把子码流编码关掉,保留VP模块的使用,系统占用率虽有所下降,但是仍然在20%左右,如下图:

img

这时,只要关闭掉VP模块,系统CPU占用率会明显下降到10%以下,如下图所示:

img

使用top -H 发现如下:

img

使用pidstat -t发现如下图:

img

请问一下,怎么在使用4个1080P摄像头且每个摄像头编码一路1080P主码流和一路D1子码流的情况下,改善CPU占用率?请协助分析并解决该问题。

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2025-04-22 19:53
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    RV1126芯片DVR 系统CPU占用高的问题

    问题描述:使用RV1126做车载DVR,DVR接四路AHD1080P摄像头,业务需求是每路摄像头需要分别编码主码流1080P和子码流D1分辨率的两路码流。

    解决方案:

    1. 优化编码参数:检查编码器的参数设置,是否可以调整编码参数以减少CPU占用。例如,可以尝试降低编码 bitrate、调整GOP大小、或使用更高效的编码算法。
    2. 使用多线程编码:RV1126芯片支持多线程编码,可以将编码任务分配到多个线程中,以提高编码效率和减少CPU占用。
    3. 优化摄像头采样率:检查摄像头的采样率是否可以降低,以减少数据量和CPU占用。
    4. 使用硬件加速:RV1126芯片支持硬件加速,可以使用硬件加速来加速编码和解码任务,以减少CPU占用。
    5. 优化系统配置:检查系统配置是否可以优化,以减少CPU占用。例如,可以尝试关闭不必要的服务、或调整内存分配。

    核心代码:

    // 优化编码参数
    x264_param_t param;
    param.i_width = 1920;
    param.i_height = 1080;
    param.i_fps_num = 30;
    param.i_fps_den = 1;
    param.i_bitrate = 5000000; // 5Mbps
    param.i_gop_size = 30;
    param.i_keyint_max = 60;
    x264_encoder_open(&encoder, &param);
    
    // 使用多线程编码
    pthread_t threads[4];
    for (int i = 0; i < 4; i++) {
        pthread_create(&threads[i], NULL, encode_thread, (void*)i);
    }
    
    // 优化摄像头采样率
    camera_set_sampling_rate(camera, 10); // 10fps
    
    // 使用硬件加速
    hwaccel_init();
    hwaccel_encode(encoder, hwaccel);
    

    注意:上述代码仅供参考,实际实现中需要根据具体情况进行调整和修改。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月22日