RK3568视频开发系列——rockit venc(2)
简介本文对自己编写test_mpi_uvc_venc代码讲解目标采集UVC摄像头数据并且利用rockit库去实现H264编码最终得到H264文件技术栈要求V4L2相关知识上一篇文档代码中使用的是MMAP这一篇文档代码中使用的DMABUF原因是为了配合rockit相关API之所以从MMAP方法改到了DMA BUF方法有两个原因1DMABUF 的效率更高空间换时间以实现零拷贝方案对比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.cppmainRK_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_InitRK_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);ThreadGetUvcDatafdsOpen_USB_CAMERA();USB_CAMERA_Init_Buffer_DMA_BUF();USB_CAMERA_Stream_On();while(1){poll(fds,1,-1);ioctl(fds,VIDIOC_DQBUF,buf)blkg_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_BUFtypedefstructdma_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 DESTINATIONbin)将程序放到板子上运行以后可以看到打印正常并且中断程序运行当前路径下面有了我们的目标文件uvc.h264,并且使用eleclard验证播放正常
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2573399.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!