WilDonkey

WilDonkey

1个粉丝

3

问答

0

专栏

0

资料

WilDonkey  发布于  2024-05-11 11:23:08
采纳率 0%
3个问答
330

求助 RV1126 VMIX的使用方法或者绘制多个框的方法

目前已经可以实现用RK_MPI_VENC_RGN_SetBitMap来绘制字符,但如果需要绘制多个框,需要共用一个region,每次后续添加或删除框都需要重新绘制bitmap,在计算上来说有些麻烦。
原流程:VI->VENC(OSD->VENC_RGN)->rtsp
增加VMIX:VI->VMIX->VENC(OSD->VENC_RGN)->rtsp
查阅文档发现VMIX有个接口RK_MPI_VMIX_SetLineInfo,需要有两个码流0和1,打印显示码流0成功绑定了,调用这个接口也没有绘制出框,而且码流1报错”RK_MPI_SYS_Bind Dst Mode[VMIX]:Chn[1] is not ready!”
求助各位大佬有没有用过VMIX的经验或者绘制多个框的方法,万分感谢!

////////////
ret = RK_MPI_VI_SetChnAttr(0, stream_id, &vi_chn_attr);
ret |= RK_MPI_VI_EnableChn(0, stream_id);
////////////
ret = RK_MPI_VENC_CreateChn(stream_id, &chn_attr);
////////////
int vmix_init(int stream_id, int width, int height)
{
    VMIX_DEV_INFO_S stDevInfo;
    stDevInfo.enImgType = IMAGE_TYPE_NV12;
    stDevInfo.u16ChnCnt = 1;
    stDevInfo.u16Fps = 15;
    stDevInfo.u32ImgWidth = width;
    stDevInfo.u32ImgHeight = height;
    stDevInfo.bEnBufPool = RK_TRUE;
    stDevInfo.u16BufPoolCnt = 3;

    stDevInfo.stChnInfo[0].enImgInType = IMAGE_TYPE_NV12;
    stDevInfo.stChnInfo[0].enImgOutType = IMAGE_TYPE_NV12;
    stDevInfo.stChnInfo[0].stInRect.s32X = 0;
    stDevInfo.stChnInfo[0].stInRect.s32Y = 0;
    stDevInfo.stChnInfo[0].stInRect.u32Width = width;
    stDevInfo.stChnInfo[0].stInRect.u32Height = height;
    stDevInfo.stChnInfo[0].stOutRect.s32X = 0;
    stDevInfo.stChnInfo[0].stOutRect.s32Y = 0;
    stDevInfo.stChnInfo[0].stOutRect.u32Width = width;
    stDevInfo.stChnInfo[0].stOutRect.u32Height = height;

    int ret = RK_MPI_VMIX_CreateDev(stream_id, &stDevInfo);
    if (ret)
    {
        PRINT_WARN("Init VMIX device failed! ret=%d\n", ret);
        return -1;
    }

    ret = RK_MPI_VMIX_EnableChn(stream_id, 0);
    if (ret)
    {
        PRINT_WARN("Enable VM[0]:Chn[0] failed! ret=%d\n", ret);
        return -1;
    }

    PRINT_INFO("create vm[%d] success\n", stream_id);
    return 0;
}

int chn_bind(int stream_id)
{
    assert(stream_id <= MAX_MEDIA_STREAM_CNT);
    MPP_CHN_S stSrcChn;
    stSrcChn.enModId = RK_ID_VI;
    stSrcChn.s32DevId = 0;
    stSrcChn.s32ChnId = stream_id;
    MPP_CHN_S stDestChn;
    stDestChn.enModId = RK_ID_VMIX;
    stDestChn.s32DevId = 0;
    stDestChn.s32ChnId = stream_id;
    int ret = RK_MPI_SYS_Bind(&stSrcChn, &stDestChn);
    if (ret)
    {
        PRINT_WARN("ERROR: Bind VI[%d] and VMIX[%d] error! ret=%d\n", stream_id, stream_id, ret);
        return -1;
    }
    PRINT_INFO("Bind VI[%d] and VMIX[%d] success\n", stream_id, stream_id);

    stSrcChn.enModId = RK_ID_VMIX;
    stSrcChn.s32DevId = 0;
    stSrcChn.s32ChnId = stream_id;
    stDestChn.enModId = RK_ID_VENC;
    stDestChn.s32DevId = 0;
    stDestChn.s32ChnId = stream_id;
    ret = RK_MPI_SYS_Bind(&stSrcChn, &stDestChn);
    if (ret)
    {
        PRINT_WARN("ERROR: Bind VMIX[%d] and VENC[%d] error! ret=%d\n", stream_id, stream_id, ret);
        return -1;
    }
    PRINT_INFO("Bind VMIX[%d] and VENC[%d] success\n", stream_id, stream_id);

    RK_MPI_SYS_SetMediaBufferDepth(RK_ID_VENC, stream_id, 3);

    return -1;
}
我来回答
回答1个
时间排序
认可量排序

WilDonkey

1个粉丝

3

问答

0

专栏

0

资料

WilDonkey 2024-05-14 10:05:37
认可0

更新:
由于需要绘制多个检测框,使用RK_MPI_VMIX_SetLineInfo可能出现资源不够的情况。
采用使用opencv绘制一个和视频相同分辨率的透明图片,调用cv::rectangle(image, detect_box, cv::Scalar(0, 0, 255, 255), 1, cv::LINE_8, 0);将每个框叠加到图片中,最后将图片数据通过RK_MPI_VENC_RGN_SetBitMap传输进去。
但现在的问题是:rectangle中的参数“1”表示线条宽度(int),当线条宽度大于等于2时,视频中颜色显示正常,但是线条宽度为2时对于低分辨率(目前是640x360)来说太粗了,配置为1后发现线条部分显示不正常。(下面图是线宽为1的情况)
有大佬知道该如何解决吗?

或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区