海思3531获取多个摄像头在整个屏幕的画面

要想获取整个摄像头画面在整个屏幕的画面只需要比平常的操作多一步即可,例如通常海思SDK通常提供的VENC例子里的流程是:VI->VPSS->VENC,而我们把他修改成VI->VPSS->虚拟VO->VENC,这样我们就可以获取所有摄像头在屏幕显示的画面。虚拟VO配置如下:

    s32Ret = SAMPLE_COMM_VO_MemConfig(VO_VIRT, "ddr1");
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("BJ_Multimedia_VO_MemConfig failed with %d!\n", s32Ret);
        goto END_4HD_HOMO_0;
    }
HI_S32 startVoVirtual(VIDEO_NORM_E gs_enNorm)
{
    HI_S32 s32Ret;
    VO_DEV voDev = VO_VIRT;
    VO_PUB_ATTR_S stVoPubAttr;
    VO_VIDEO_LAYER_ATTR_S stLayerAttr;
    VO_CHN_ATTR_S stChnAttr;
    HI_U32 u32Width = 1920;
    HI_U32 u32Height = 1080;
    HI_S32 WIN_NUM = 4;

    int i;
    VO_CHN chn;

    stVoPubAttr.u32BgColor = 0x00000000;
    stVoPubAttr.enIntfType = VO_INTF_VGA | VO_INTF_HDMI;
    stVoPubAttr.enIntfSync =(VIDEO_ENCODING_MODE_PAL == gs_enNorm) ? VO_OUTPUT_1080P50 : VO_OUTPUT_1080P60;
    stVoPubAttr.bDoubleFrame = HI_FALSE;
    s32Ret = HI_MPI_VO_SetPubAttr(voDev, &stVoPubAttr);
    if (s32Ret != HI_SUCCESS) {
        SAMPLE_PRT("HI_MPI_VO_SetPubAttr failed with 0x%#x!\n", s32Ret);
        return HI_FAILURE;
    }

    s32Ret = HI_MPI_VO_Enable(voDev);
    if (s32Ret != HI_SUCCESS) {
        SAMPLE_PRT("HI_MPI_VO_Enable failed with 0x%#x!\n", s32Ret);
        return HI_FAILURE;
    }

    stLayerAttr.enPixFormat = SAMPLE_PIXEL_FORMAT;
    stLayerAttr.u32DispFrmRt = (VIDEO_ENCODING_MODE_PAL == gs_enNorm)?25:30;
    stLayerAttr.stDispRect.s32X       = 0;
    stLayerAttr.stDispRect.s32Y       = 0;
    stLayerAttr.stDispRect.u32Width   = u32Width;
    stLayerAttr.stDispRect.u32Height  = u32Height;
    stLayerAttr.stImageSize.u32Width  = u32Width;
    stLayerAttr.stImageSize.u32Height = u32Height;

    s32Ret = HI_MPI_VO_SetVideoLayerAttr(voDev, &stLayerAttr);
    if (s32Ret != HI_SUCCESS) {
        SAMPLE_PRT("HI_MPI_VO_SetVideoLayerAttr failed with 0x%#x!\n", s32Ret);
        return HI_FAILURE;
    }

    s32Ret = HI_MPI_VO_EnableVideoLayer(voDev);
    if (s32Ret != HI_SUCCESS) {
        SAMPLE_PRT("HI_MPI_VO_EnableVideoLayer failed with 0x%#x!\n", s32Ret);
        return HI_FAILURE;
    }

    for (i = 0; i < WIN_NUM; i++) {

        chn = i;

        stChnAttr.stRect.s32X       = (i % 2) * u32Width / 2;   //开启画面显示的通道
        stChnAttr.stRect.s32Y       = (i / 2) * u32Height / 2;
        stChnAttr.stRect.u32Width   = u32Width/2;
        stChnAttr.stRect.u32Height  = u32Height/2;
        stChnAttr.u32Priority       = i;
        stChnAttr.bDeflicker        = HI_FALSE;

        s32Ret = HI_MPI_VO_SetChnAttr(voDev, chn, &stChnAttr);
        if (s32Ret != HI_SUCCESS)
        {
            SAMPLE_PRT("HI_MPI_VO_SetChnAttr failed with %#x!\n", s32Ret);
        }

        s32Ret = HI_MPI_VO_EnableChn(voDev, chn);
        if (s32Ret != HI_SUCCESS)
        {
            SAMPLE_PRT("HI_MPI_VO_EnableChn failed with %#x!\n", s32Ret);
            return HI_FAILURE;
        }
    }

    return HI_SUCCESS;

}

配置好了就是VPSS绑定虚拟VO了,在这里千万要注意,要绑定虚拟VO与真实VO是有区别的,必须用VPSS的 VPSS_BYPASS_CHN来绑定,原因如图:



如何要想看到显示器显示界面同时我们将虚拟vo绑定vo设备就可以了

HI_S32 VoVirtualBindVo()
{
    HI_S32 s32Ret = HI_SUCCESS;
    MPP_CHN_S stSrcChn;
    MPP_CHN_S stDestChn;

    stSrcChn.enModId = HI_ID_VOU;
    stSrcChn.s32DevId = VO_VIRT;
    stSrcChn.s32ChnId = 0;

    stDestChn.enModId = HI_ID_VOU;
    stDestChn.s32DevId = VO_DHD0;
    stDestChn.s32ChnId = 0;

    s32Ret = HI_MPI_SYS_Bind(&stSrcChn, &stDestChn);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("failed with %#x!\n", s32Ret);
        return HI_FAILURE;
    }

    return s32Ret;

}

最后附上代码:https://download.csdn.net/download/yinsui1839/10436592 

这份代码是在Qt上打的,建议装个Qt查看,要想正常编译得移植Qt

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hmbbPdx_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值