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

RV1126采集VI视频数据流

        这节分享一下通过rkmedia的api获取RV1126的VI视频流,但是具体的已经在第一个推流项目已经说了。这里更多是回顾一下这部分的api。

采集vi数据实现

        VI_CHN_ATTR_S,视频采集的VI模块。

int main()
{
    int ret;
    VI_CHN_ATTR_S vi;
    vi.pcVideoNode = CAMERA_PAHT; //video node
    vi.u32Width = 1920; //宽度
    vi.u32Height = 1080;//高度
    vi.enPixFmt = IMAGE_TYPE_NA12; //图像格式
    vi.BufCnt = 3; //一般默认3 
    vi.enWorkMode = VI_WORK_MODE_NORMAL;
    vi.enBufType = VI_CHN_BUF_TYPE_MMAP
    //把配置好的参数传进去
    ret = RK_MPI_VI_SetChnAttr(VI_PIPE_ID, VI_CHN_ID, &vi);
    if(ret)
    {
        printf("RK_MPI_VI_SetChnAttr 失败\n");
        return -1;
    }
    else 
    {
        printf("RK_MPI_VI_SetChnAttr 成功\n");
    }
    //使能vi模块
    ret = RK_MPI_VI_EnableChnAttr(VI_PIPE_ID,VI_CHN_ID);
    if(ret)
    {
        printf("RK_MPI_VI_EnableChnAttr 失败\n");
    }
    else{
        printf("RK_MPI_VI_EnableChnAttr 成功\n");
    }
}

        启动VI模块进行摄像头数据的采集

        下面代码是启动VI模块进行摄像头采集,这里使用的API是RK_MPI_VI_StartStream。

    //启动视频输入流
    ret = RK_MPI_VI_StartStream(PIPE_ID, CHN_ID);
    if (ret)
    {
        printf("RK_MPI_VI_StartStream Failed...\n");
        return -1;
    }
    else
    {
        printf("RK_MPI_VI_StartStream Success...\n");
    }

        视频采集到了就开始创建多线程获取VI码流数据并传输到RGA模块 

//创建多线程工作
pthread_t pid;
pthread_create(&pid, nullptr, get_camera_vi_thred, nullptr);
//获取VI码流数据并传输到RGA模块, 起始主要功能就是做一个转发
void* get_camera_vi_thred(void* args)
{
    //起始就是一个指针类型
    MEDIA_BUFFER mb;

    while(1)
    {
        // 获取VI数据
        mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VI,VI_CHN_ID, -1);
        if(!mb)
        {
            printf("获取vi数据失败\n");
            break; //不要在一直获取了
        }

        // 传输到RGA模块
        RK_MPI_SYS_SendMediaBuffer(RK_ID_RGA, 0, mb);

        // 释放mb数据
        RK_MPI_MB_ReleaseBuffer();
    }
}

        初始化VI模块后,则需要创建get_camera_vi_thread线程去获取VI码流数据并发送到RGA模块。这个线程需要使用RK_MPI_SYS_GetMediaBuffer死循环获取VI码流的数据,这里的模块号是RK_ID_VI,通道号是CHN_ID:0,第三个参数:-1阻塞获取。

        获取了每一帧的VI数据后,则调用RK_MPI_SYS_SendMediaBuffer的API把每一帧VI数据发送到RGA模块,第一个参数:模块号ID(RK_ID_RGA)、第二个参数:通道号ID(这里填0,因为RGA模块创建的通道号是0)、第三个参数:VI码流的缓冲数据。发送完每一帧VI码流数据之后,则释放资源RK_MPI_MB_ReleaseBuffer。

        总结一下,起始就是做了一下数据转发,获取到vi数据,然后转发到rga模块。

 

 

 


http://www.kler.cn/a/574311.html

相关文章:

  • 自动任务:安卓与鸿蒙上的高效自动化助手
  • Mac 基于 Ollama 安装 DeepSeek-R1(蒸馏版本)、AnythingLLM 及使用体验
  • JavaEE Servlet02
  • docker目录挂载与卷映射的区别
  • 洛谷————B2056 求整数的和与均值
  • 【网络】实现电脑与笔记本电脑之间的直接网络连接
  • 双向选择排序算法
  • 文档处理控件Aspose.Total教程:使用 C# 将 Obsidian Markdown 转换为 OneNote
  • 无线可视挖耳勺适合老年人吗?无线可视挖耳勺操作简单又安全
  • WPS AI+office-ai的安装、使用
  • 3.6V-30V宽压输入降压同步IC内置MOS,电流4A/5A/6A,可以满足汽车应急电源,BMS电池,电池组USB口输出等储能应用
  • TTP/HTTPS、TCP/IP 协议、RPC、Socket 通信机制
  • RxJS与Redux革命性协同:打造高效、解耦的前端状态管理方案
  • 【摸鱼指南】--- VSCode 使用 Thief-Book 隐形阅读模式配置教程 程序员必备插件
  • 全新方案80M/S,告别限速!
  • 【Hadoop】Hadoop的MapReduce
  • 如何确保爬虫遵守1688的使用协议
  • 博查搜索API日调用量突破3000万次,达到Bing API的1/3。
  • HBuilder X 使用 TortoiseSVN 设置快捷键方法
  • 在【k8s】中部署Jenkins的实践指南