当前位置: 首页 > news >正文

RK3568视频开发系列——rockit venc(2)

简介

本文对自己编写test_mpi_uvc_venc代码讲解

目标

采集UVC摄像头数据,并且利用rockit库去实现H264编码,最终得到H264文件

技术栈要求

V4L2相关知识(上一篇文档代码中使用的是MMAP,这一篇文档代码中使用的DMABUF,原因是为了配合rockit相关API)
之所以从MMAP方法改到了DMA BUF方法有两个原因
(1)DMABUF 的效率更高,空间换时间,以实现零拷贝方案,对比MMAP,帧率更稳定
(2)配合rockit 库内存管理接口RK_MPI_MMZ_Handle2Fd(),将转换得到的fd句柄传入给DMA BUF

代码讲解

代码路径https://gitee.com/jiangsinian/dshan-pi-r1-usb_-camera_-mpp/blob/master/test_mpi_uvc_venc.cpp

main

RK_MPI_SYS_Init();TEST_VENC_Para_Init();//初始化VENC相关代码,并且创建通道pthread_create(ThreadGetUvcData);//创建线程,申请DMA内存队列以及实现venc_send_framewhile(1){RK_MPI_VENC_GetStream(u32Ch,&stFrame,-1);write(fd);//写文件RK_MPI_VENC_ReleaseStream(u32Ch,&stFrame);}

TEST_VENC_Para_Init

RK_MPI_VENC_CreateChn(u32Ch,&stAttr);// for output stream poolRK_MPI_MB_CreatePool(&stMbPoolCfg);RK_MPI_VENC_AttachMbPool(u32Ch,ctx.vencPoolOutput[u32Ch]);RK_MPI_VENC_StartRecvFrame(u32Ch,&stRecvParam);

ThreadGetUvcData

fds=Open_USB_CAMERA();USB_CAMERA_Init_Buffer_DMA_BUF();USB_CAMERA_Stream_On();while(1){poll(&fds,1,-1);ioctl(fds,VIDIOC_DQBUF,&buf)blk=g_dma_pool.blk[buf.index];//后续USB_CAMERA_Init_Buffer_DMA_BUF讲解中会提到RK_MPI_SYS_MmzFlushCache(blk,RK_FALSE);RK_MPI_VENC_SendFrame(u32Ch,&stFrame,-1);ioctl(fds,VIDIOC_QBUF,&buf)}

USB_CAMERA_Init_Buffer_DMA_BUF

typedefstructdma_pool_info{MB_BLK blk[FRAMEBUFFER_COUNT];RK_S32 dma_fd[FRAMEBUFFER_COUNT];}dma_pool_info;dma_pool_info g_dma_pool={0};//调用VIDIOC_REQBUFS时,使用DMABUF方法ioctl(VIDIOC_REQBUFS)//type = V4L2_BUF_TYPE_VIDEO_CAPTURE;memory = V4L2_MEMORY_DMABUF;for(){//多帧缓存循环//rockit接口 申请内存RK_MPI_MMZ_Alloc(&g_dma_pool.blk[USB_CAMERA.buf.index],frame_size,RK_MMZ_ALLOC_CACHEABLE);//rockit接口 将内存区域转换成fd句柄,至此实现fd和BLK的互通,也就是我们之所以这么构造结构体的原因g_dma_pool.dma_fd[USB_CAMERA.buf.index]=RK_MPI_MMZ_Handle2Fd(g_dma_pool.blk[USB_CAMERA.buf.index]);//入队操作,VIDIOC_QBUF 使用DMABUF方法,传入dma_fd句柄ioctl(USB_CAMERA.fd,VIDIOC_QBUF,&buf)}

编译运行

参考rockit/mpi/cmake文件,增加rk_mpi_uvc_ven_test,即可进行代码编译

set(RK_MPI_TEST_UVC_VENC_SRC test_mpi_uvc_venc.cpp)#--------------------------#rk_mpi_uvc_venc_test#--------------------------add_executable(rk_mpi_uvc_venc_test ${RK_MPI_TEST_UVC_VENC_SRC}${RK_MPI_TEST_COMMON_SRC})target_link_libraries(rk_mpi_uvc_venc_test ${ROCKIT_DEP_COMMON_LIBS})install(TARGETS rk_mpi_uvc_venc_test RUNTIME DESTINATION"bin")

将程序放到板子上运行以后,可以看到打印正常,并且中断程序运行,当前路径下面有了我们的目标文件uvc.h264,并且使用eleclard验证播放正常


http://www.jsqmd.com/news/734622/

相关文章:

  • 2026年PMP报考条件与费用深度对比榜单TOP 5 - 众智商学院课程中心
  • Jeandle项目解析:基于LLVM的Java JIT编译器架构与实战
  • CVE-2026-31431:Linux 本地权限提升漏洞的受影响版本与修复情况
  • pymol作图,蛋白surface
  • Qt+VS2019编译报‘无法定位程序输入点’?别慌,这3个坑我帮你踩过了
  • 别再只用ChatGPT了!手把手教你用Ollama在本地电脑免费部署Llama3等开源大模型
  • LPDDR4的ZQ校准到底在干嘛?从原理到实操,一次讲清这个容易被忽略的关键步骤
  • 终极实战指南:基于Scrapy框架的拼多多电商数据采集解决方案
  • openclaw_2026.04.09_2
  • nodejs 服务如何通过 taotoken 统一调用多模型 ai 接口
  • 雷视融合态势感知系统DF3000-VR|AI 赋能周界安防,全天候守护重点区域安全
  • Apollo Save Tool:终极PS4存档管理解决方案完全指南
  • 讲解GitHub Actions 自动 CI 测试 WorkFlows工作流
  • 养老院做GEO优化踩的坑:不是内容不够,是AI不敢随便引用
  • 别再为模糊的3D重建头疼了!手把手教你用3DSlicer处理DICOM数据,搞定医学图像清晰重建
  • Kling-Omni框架:多模态AI视频生成技术解析
  • Windows字体渲染终极优化指南:用MacType实现专业级文字显示效果
  • NTU VIRAL多传感器融合数据集技术深度解析:从算法挑战到工程实现
  • Open Claw 京东商品监控选品实战:一键抓取、实时监控、高效选品
  • Softmax函数大揭秘:从原理到应用,你了解多少?
  • 深度学习图像处理:CNN与GAN核心技术解析
  • 工业软件自主化背后的测试攻坚战
  • **DeepSeek-V4-Pro:当1M上下文真正“可用”时,开源模型用数据终结了闭源前沿的溢价神话**
  • 用Scratch 3.29.1教孩子做‘像素画动画’:从导入图片到逐帧动画的保姆级教程
  • XG-140G-TF原厂固件疑似有故障
  • 魔兽争霸III兼容性终极指南:5大功能让经典游戏重焕新生
  • 体验Taotoken官方价折扣活动对于降低项目运营成本的实际影响
  • 南京 GEO 优化怎么做?本地 AI 获客实战指南 - 小艾信息发布
  • 儿童尤克里里选购干货|选对解锁天赋,选错浇灭兴趣,新手家长必看
  • 6SA8252-0AC60控制器模块