news 2026/5/1 23:24:31

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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验证播放正常


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 23:22:25

体验Taotoken官方价折扣活动对于降低项目运营成本的实际影响

体验Taotoken官方价折扣活动对于降低项目运营成本的实际影响 1. 项目背景与迁移动机 我们运营着一个基于大模型API的智能客服系统,长期使用某主流模型的文本生成服务。随着业务规模扩大,API调用量从最初的每月数百万Token增长到数千万Token级别&#x…

作者头像 李华
网站建设 2026/5/1 23:20:46

养老院做GEO优化踩的坑:不是内容不够,是AI不敢随便引用

去年接了个郑州的养老院客户,做GEO优化。他们之前的内容挺用心的,服务项目、护理标准、环境照片都有,但家属在DeepSeek和豆包里问"郑州哪家养老院收失能老人""护理人员配比多少"的时候,AI几乎不引用他们的信息…

作者头像 李华
网站建设 2026/5/1 23:20:43

3步快速上手:用vectorizer将位图智能转换为可无限缩放的矢量图

3步快速上手:用vectorizer将位图智能转换为可无限缩放的矢量图 【免费下载链接】vectorizer Potrace based multi-colored raster to vector tracer. Inputs PNG/JPG returns SVG 项目地址: https://gitcode.com/gh_mirrors/ve/vectorizer 在数字设计的世界里…

作者头像 李华
网站建设 2026/5/1 23:20:02

InterPrior框架:机器人意图识别与自适应控制技术解析

1. 项目背景与核心价值在机器人控制和人机交互领域,如何让机器系统自然地理解并响应人类操作意图一直是个关键挑战。InterPrior框架的提出,正是为了解决传统控制方法在物理交互场景中的局限性——那些基于预设轨迹或离散指令的系统往往缺乏对连续物理接触…

作者头像 李华
网站建设 2026/5/1 23:18:09

Kling-Omni框架:多模态AI视频生成技术解析

1. 项目概述:当视觉语言遇上视频生成最近在实验室里折腾一个有意思的项目——Kling-Omni框架。简单来说,这是一个能够理解多模态输入(文字、图片、音频等),并据此生成高质量视频的AI系统。不同于传统的单一模态视频生成…

作者头像 李华