热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Hi3536视频编解码之视频叠加

通过Hi3536sdk中Hi3536_SDK_V2.0.7.0mpp_mastersamplevo的例程修改而来的视频叠加简单例程。例程实现了打开16个窗口,通过按键

通过Hi3536sdk中Hi3536_SDK_V2.0.7.0/mpp_master/sample/vo的例程修改而来的视频叠加简单例程。
例程实现了打开16个窗口,通过按键输入,控制每个窗口以规定的大小、位置叠加起来。
效果如下:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

主要功能函数代码如下(注释行为关键部分):

HI_S32 SAMPLE_VO_Virtual_HD0(HI_VOID)
{HI_S32 s32Ret &#61; HI_SUCCESS; VB_CONF_S stVbConf; HI_U32 u32BlkSize;VDEC_CHN VdChn &#61; 1;PAYLOAD_TYPE_E enType; SIZE_S stSize; HI_S32 s32VpssGrpCnt &#61; 6, s32VpssChnCnt &#61; 1; HI_S32 i,x,y;HI_U32 u32WndNum;VPSS_GRP_ATTR_S stGrpAttr; VPSS_CHN_MODE_S stVpssChnMode;VENC_CHN VeJpegChn &#61; 0;VO_DEV VoDev; VO_LAYER VoLayer;VO_PUB_ATTR_S stVoPubAttr; SAMPLE_VO_MODE_E enVoMode;VO_VIDEO_LAYER_ATTR_S stLayerAttr;HI_CHAR ch;VDEC_CHN_ATTR_S stVdecChnAttr[VDEC_MAX_CHN_NUM];VdecThreadParam stVdecSend[VDEC_MAX_CHN_NUM]; pthread_t VdecThread[2 * VDEC_MAX_CHN_NUM];/******************************************step 1: init variable ******************************************/ memset(&stVbConf,0,sizeof(VB_CONF_S)); u32BlkSize &#61; SAMPLE_COMM_SYS_CalcPicVbBlkSize(VIDEO_ENCODING_MODE_PAL,\PIC_HD1080, SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH);stVbConf.u32MaxPoolCnt &#61; 128;stVbConf.astCommPool[0].u32BlkSize &#61; u32BlkSize;stVbConf.astCommPool[0].u32BlkCnt &#61; 20;s32Ret &#61; SAMPLE_COMM_SYS_GetPicSize(VIDEO_ENCODING_MODE_PAL, PIC_HD1080, &stSize);if (HI_SUCCESS !&#61;s32Ret){SAMPLE_PRT("get picture size failed!\n");return HI_FAILURE;}if (704 &#61;&#61; stSize.u32Width){stSize.u32Width &#61; 720;}else if (352 &#61;&#61; stSize.u32Width){stSize.u32Width &#61; 360;}else if (176 &#61;&#61; stSize.u32Width){stSize.u32Width &#61; 180;}/******************************************step 2: mpp system init. ******************************************/s32Ret &#61; SAMPLE_COMM_SYS_Init(&stVbConf);if (HI_SUCCESS !&#61; s32Ret){SAMPLE_PRT("system init failed with %d!\n", s32Ret);goto END_VIRTUAL_1;}/******************************************step 3: start vdec ******************************************/ enType &#61; PT_H264;memset(&stVbConf,0,sizeof(VB_CONF_S)); SAMPLE_COMM_VDEC_ModCommPoolConf(&stVbConf, enType, &stSize, VdChn); s32Ret &#61; SAMPLE_COMM_VDEC_InitModCommVb(&stVbConf);if(s32Ret !&#61; HI_SUCCESS){ SAMPLE_PRT("init mod common vb fail for %#x!\n", s32Ret);goto END_VIRTUAL_1;}/**************create vdec chn****************************/ SAMPLE_COMM_VDEC_ChnAttr(VdChn, &stVdecChnAttr[0], enType, &stSize);s32Ret &#61; SAMPLE_COMM_VDEC_Start(VdChn, &stVdecChnAttr[0]); if (HI_SUCCESS !&#61; s32Ret){SAMPLE_PRT("Start Vdec failed!\n");goto END_VIRTUAL_2;} /**************send stream****************************/SAMPLE_COMM_VDEC_ThreadParam(VdChn, &stVdecSend[0], &stVdecChnAttr[0], "1080P.h264"); SAMPLE_COMM_VDEC_StartSendStream(VdChn, &stVdecSend[0], &VdecThread[0]);/******************************************step 4: start vpss with vdec bind vpss ******************************************/stGrpAttr.u32MaxW &#61; stSize.u32Width;stGrpAttr.u32MaxH &#61; stSize.u32Height;stGrpAttr.bIeEn &#61; HI_FALSE;stGrpAttr.bNrEn &#61; HI_TRUE;stGrpAttr.bHistEn &#61; HI_FALSE;stGrpAttr.enDieMode &#61; VPSS_DIE_MODE_NODIE;stGrpAttr.enPixFmt &#61; SAMPLE_PIXEL_FORMAT;stGrpAttr.bDciEn &#61; HI_FALSE;stGrpAttr.bEsEn &#61; HI_TRUE;s32Ret &#61; SAMPLE_COMM_VPSS_Start(s32VpssGrpCnt, &stSize, s32VpssChnCnt, &stGrpAttr);if (HI_SUCCESS !&#61; s32Ret){SAMPLE_PRT("Start Vpss failed!\n");goto END_VIRTUAL_3;}for(i&#61;0; i<1; i&#43;&#43;){s32Ret &#61; HI_MPI_VPSS_GetChnMode(i, 0, &stVpssChnMode);if (HI_SUCCESS !&#61; s32Ret){SAMPLE_PRT("HI_MPI_VPSS_SetChnMode failed with %x\n",s32Ret);goto END_VIRTUAL_3;}stVpssChnMode.bDouble &#61; HI_FALSE;stVpssChnMode.enChnMode &#61; VPSS_CHN_MODE_USER;stVpssChnMode.enPixelFormat &#61; PIXEL_FORMAT_YUV_SEMIPLANAR_420;stVpssChnMode.u32Width &#61; 1920;stVpssChnMode.u32Height &#61; 1080;stVpssChnMode.enCompressMode &#61; COMPRESS_MODE_NONE; s32Ret &#61; HI_MPI_VPSS_SetChnMode(i, 0, &stVpssChnMode);if (HI_SUCCESS !&#61; s32Ret){SAMPLE_PRT("HI_MPI_VPSS_SetChnMode failed with %x\n",s32Ret);goto END_VIRTUAL_3;}}for(i &#61; 0;i < VdChn; i&#43;&#43;){s32Ret &#61; SAMPLE_COMM_VDEC_BindVpss(i,i);if (HI_SUCCESS !&#61; s32Ret){SAMPLE_PRT("SAMPLE_COMM_VDEC_BindVpss failed!\n");goto END_VIRTUAL_4;}}/***************************************************step 5: start VIRT0 with 4 windows and bind to VENC***************************************************/ /**************start Dev****************************/VoDev &#61; SAMPLE_VO_DEV_VIRT0; stVoPubAttr.enIntfSync &#61; VO_OUTPUT_1080P30;stVoPubAttr.enIntfType &#61; VO_INTF_HDMI;stVoPubAttr.u32BgColor &#61; 0x0;s32Ret &#61; SAMPLE_COMM_VO_StartDev(VoDev, &stVoPubAttr); if (HI_SUCCESS !&#61; s32Ret){SAMPLE_PRT("SAMPLE_COMM_VO_StartDev failed!\n");goto END_VIRTUAL_4;}/**************start Layer****************************/VoLayer &#61; SAMPLE_VO_LAYER_VIRT0;stLayerAttr.bClusterMode &#61; HI_FALSE;stLayerAttr.bDoubleFrame &#61; HI_FALSE;stLayerAttr.enPixFormat &#61; SAMPLE_PIXEL_FORMAT; s32Ret &#61; SAMPLE_COMM_VO_GetWH(stVoPubAttr.enIntfSync, \&stLayerAttr.stDispRect.u32Width, &stLayerAttr.stDispRect.u32Height, &stLayerAttr.u32DispFrmRt);if (s32Ret !&#61; HI_SUCCESS){SAMPLE_PRT("failed with %#x!\n", s32Ret);goto END_VIRTUAL_5;}stLayerAttr.stImageSize.u32Width &#61; stLayerAttr.stDispRect.u32Width;stLayerAttr.stImageSize.u32Height &#61; stLayerAttr.stDispRect.u32Height;HI_MPI_VO_SetVideoLayerPartitionMode(VoLayer,VO_PART_MODE_SINGLE);s32Ret &#61; SAMPLE_COMM_VO_StartLayer(VoLayer, &stLayerAttr); if (HI_SUCCESS !&#61; s32Ret){SAMPLE_PRT("SAMPLE_COMM_VO_StartLayer failed!\n");goto END_VIRTUAL_5;} /**************start Chn****************************/ enVoMode &#61; VO_MODE_16MUX; //16个窗口s32Ret &#61; SAMPLE_COMM_VO_StartChn(VoLayer,enVoMode); if (s32Ret !&#61; HI_SUCCESS){SAMPLE_PRT("failed with %#x!\n", s32Ret);goto END_VIRTUAL_6;} /**************vo bind to vpss****************************/u32WndNum &#61; 16; //16个窗口for(i &#61; 0;i < u32WndNum;i&#43;&#43;){s32Ret &#61; SAMPLE_COMM_VO_BindVpss(VoLayer, i, 0, VPSS_CHN0);if (HI_SUCCESS !&#61; s32Ret){SAMPLE_PRT("SAMPLE_COMM_VO_BindVpss failed!\n");goto END_VIRTUAL_6;} }sleep(1);/******************************************step 6: start jpege snap.*****************************************/VoDev &#61; SAMPLE_VO_DEV_DHD0;VoLayer &#61; SAMPLE_VO_LAYER_VHD0;enVoMode &#61; VO_MODE_1MUX; //单分屏
#ifdef HI_FPGAstVoPubAttr.enIntfSync &#61; VO_OUTPUT_1080P30;stVoPubAttr.enIntfType &#61; VO_INTF_VGA;
#elsestVoPubAttr.enIntfSync &#61; VO_OUTPUT_3840x2160_30;stVoPubAttr.enIntfType &#61; VO_INTF_HDMI;
#endif stVoPubAttr.u32BgColor &#61; 0x0;s32Ret &#61; SAMPLE_COMM_VO_StartDev(VoDev, &stVoPubAttr); if (HI_SUCCESS !&#61; s32Ret){SAMPLE_PRT("SAMPLE_COMM_VO_StartDev failed!\n");goto END_VIRTUAL_4;}
#ifndef HI_FPGAif (HI_SUCCESS !&#61; SAMPLE_COMM_VO_HdmiStart(stVoPubAttr.enIntfSync)){SAMPLE_PRT("Start SAMPLE_COMM_VO_HdmiStart failed!\n");goto END_VIRTUAL_5;}
#endif/**************start Layer****************************/ stLayerAttr.bClusterMode &#61; HI_FALSE;stLayerAttr.bDoubleFrame &#61; HI_FALSE;stLayerAttr.enPixFormat &#61; SAMPLE_PIXEL_FORMAT; s32Ret &#61; SAMPLE_COMM_VO_GetWH(stVoPubAttr.enIntfSync, \&stLayerAttr.stDispRect.u32Width, &stLayerAttr.stDispRect.u32Height, &stLayerAttr.u32DispFrmRt);if (s32Ret !&#61; HI_SUCCESS){SAMPLE_PRT("failed with %#x!\n", s32Ret);goto END_VIRTUAL_5;}stLayerAttr.stImageSize.u32Width &#61; stLayerAttr.stDispRect.u32Width;stLayerAttr.stImageSize.u32Height &#61; stLayerAttr.stDispRect.u32Height;s32Ret &#61; SAMPLE_COMM_VO_StartLayer(VoLayer, &stLayerAttr); if (HI_SUCCESS !&#61; s32Ret){SAMPLE_PRT("SAMPLE_COMM_VO_StartLayer failed!\n");goto END_VIRTUAL_6;} /**************start Chn****************************/ s32Ret &#61; SAMPLE_COMM_VO_StartChn(VoLayer,enVoMode); if (s32Ret !&#61; HI_SUCCESS){SAMPLE_PRT("failed with %#x!\n", s32Ret);goto END_VIRTUAL_6;} SAMPLE_COMM_Vpss_BindVO(SAMPLE_VO_LAYER_VIRT0,0,4,0);/**************vo bind to vpss****************************/s32Ret &#61; SAMPLE_COMM_VO_BindVpss(VoLayer, 0, 4, 0);s32Ret &#61; SAMPLE_COMM_VO_BindVpss(VoLayer, 6, 5, 0);i &#61; 0;while(1){printf("\tpress &#39;q&#39; to exit this sample.\n");printf("\tpress &#39;s&#39; to snap one picture\n");ch &#61; getchar();if (10 &#61;&#61; ch){continue;}getchar(); if (&#39;q&#39; &#61;&#61; ch){break;}else if(&#39;s&#39; &#61;&#61; ch){if(i > 15) //0~15&#xff0c;16个窗口goto END_VIRTUAL_1;x &#61; 200&#43;i*20; //通过X轴坐标定位窗口位置SAMPLE_COMM_VO_SetChn(SAMPLE_VO_LAYER_VIRT0,i,x,x);i&#43;&#43;;usleep(10);}else{SAMPLE_PRT("the input is invaild! please try again.\n");continue;}}/******************************************step 9: exit process******************************************/
END_VIRTUAL_7: SAMPLE_COMM_VO_SnapStop(VeJpegChn);END_VIRTUAL_6:VoLayer &#61; SAMPLE_VO_LAYER_VIRT0;enVoMode &#61; VO_MODE_4MUX; SAMPLE_COMM_VO_StopChn(VoLayer,enVoMode); SAMPLE_COMM_VO_StopLayer(VoLayer);u32WndNum &#61; 4; for(i &#61; 0;i < u32WndNum;i&#43;&#43;){SAMPLE_COMM_VO_UnBindVpss(VoLayer,i,i,VPSS_CHN0);}END_VIRTUAL_5: VoDev &#61; SAMPLE_VO_DEV_VIRT0; SAMPLE_COMM_VO_StopDev(VoDev); END_VIRTUAL_4: for(i &#61; 0;i < VdChn;i&#43;&#43;){SAMPLE_COMM_VDEC_UnBindVpss(i,i);}END_VIRTUAL_3: SAMPLE_COMM_VPSS_Stop(s32VpssGrpCnt, VPSS_MAX_CHN_NUM);END_VIRTUAL_2:SAMPLE_COMM_VDEC_Stop(VdChn); SAMPLE_COMM_VDEC_StopSendStream(VdChn, &stVdecSend[0], &VdecThread[0]);END_VIRTUAL_1:SAMPLE_COMM_SYS_Exit();return s32Ret;
}

完整代码与编译生成文件&#xff1a;https://download.csdn.net/download/weixin_43793181/19037437


推荐阅读
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • ***byte(字节)根据长度转成kb(千字节)和mb(兆字节)**parambytes*return*publicstaticStringbytes2kb(longbytes){ ... [详细]
  • 本文介绍了关于Java异常的八大常见问题,包括异常管理的最佳做法、在try块中定义的变量不能用于catch或finally的原因以及为什么Double.parseDouble(null)和Integer.parseInt(null)会抛出不同的异常。同时指出这些问题是由于不同的开发人员开发所导致的,不值得过多思考。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文介绍了在Python中使用zlib模块进行字符串的压缩与解压缩的方法,并探讨了其在内存优化方面的应用。通过压缩存储URL等长字符串,可以大大降低内存消耗,虽然处理时间会增加,但是整体效果显著。同时,给出了参考链接,供进一步学习和应用。 ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
author-avatar
雪狱冰魂_520
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有