吹梦西州

吹梦西州

0个粉丝

1

问答

0

专栏

0

资料

吹梦西州  发布于  2026-05-03 22:08:19
采纳率 0%
1个问答
5

RV1126-BP使用VI模块,获取的NV12视频是绿色的。

视频截取部分

代码:

#include <errno.h>
#include <pthread.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/poll.h>
#include <time.h>
#include <unistd.h>

#include "inc/rk_debug.h"
#include "inc/rk_defines.h"
#include "inc/rk_mpi_adec.h"
#include "inc/rk_mpi_aenc.h"
#include "inc/rk_mpi_ai.h"
#include "inc/rk_mpi_ao.h"
#include "inc/rk_mpi_avs.h"
#include "inc/rk_mpi_cal.h"
#include "inc/rk_mpi_ivs.h"
#include "inc/rk_mpi_mb.h"
#include "inc/rk_mpi_rgn.h"
#include "inc/rk_mpi_sys.h"
#include "inc/rk_mpi_tde.h"
#include "inc/rk_mpi_vdec.h"
#include "inc/rk_mpi_venc.h"
#include "inc/rk_mpi_vi.h"
#include "inc/rk_mpi_vo.h"
#include "inc/rk_mpi_vpss.h"

static bool quit =false;
static RK_S32 dev_pipe =0;
static RK_S32 vi_pipe =0;
static RK_S32 vi_chn =0;

static void sigterm_handler(int sig) {
    fprintf(stderr, "signal %d\n", sig);
    quit = true;
}

int dev_init()
{   int ret;
    VI_DEV_ATTR_S vi_dev_attr_s;
    memset(&vi_dev_attr_s,0,sizeof(VI_DEV_ATTR_S));
    RK_MPI_VI_GetDevAttr(dev_pipe,&vi_dev_attr_s);
    RK_MPI_VI_SetDevAttr(dev_pipe,&vi_dev_attr_s);
    ret = RK_MPI_VI_EnableDev(dev_pipe);
    if(ret !=0)
    {
        printf("RK_MPI_VI_EnableDev is failed.....\n");
        RK_MPI_SYS_Exit();
        return -1;
    }
    else
    {
        printf("RK_MPI_VI_EnableDev is success.....\n");
    }
    VI_DEV_BIND_PIPE_S vi_dev_bind_pipe_s;
    memset(&vi_dev_bind_pipe_s,0,sizeof(VI_DEV_BIND_PIPE_S));
    vi_dev_bind_pipe_s.u32Num =1;
    vi_dev_bind_pipe_s.PipeId [0] = dev_pipe;
    ret = RK_MPI_VI_SetDevBindPipe(dev_pipe,&vi_dev_bind_pipe_s);
    if(ret !=0)
    {
        printf("RK_MPI_VI_SetDevBindPipe is failed.....\n");
        RK_MPI_SYS_Exit();
        return -1;
    }
    else
    {
        printf("RK_MPI_VI_SetDevBindPipe is success.....\n");
    }
    return 0;
}

int vi_chn_init()
{   int ret;
    VI_CHN_ATTR_S vi_chn_attr_s;
    memset(&vi_chn_attr_s,0,sizeof(VI_CHN_ATTR_S));
    vi_chn_attr_s.stIspOpt.u32BufCount = 3;
    vi_chn_attr_s.stIspOpt.enMemoryType =VI_V4L2_MEMORY_TYPE_DMABUF;


    vi_chn_attr_s.stSize.u32Height =1080;
    vi_chn_attr_s.stSize.u32Width =1920;
    vi_chn_attr_s.enPixelFormat =RK_FMT_YUV420SP ;
    vi_chn_attr_s.enCompressMode =COMPRESS_MODE_NONE;
    vi_chn_attr_s.u32Depth =1;
    ret = RK_MPI_VI_SetChnAttr(vi_pipe,vi_chn,&vi_chn_attr_s);
    if(ret !=0)
    {
        printf("RK_MPI_VI_SetChnAttr is failed.....\n");
        RK_MPI_SYS_Exit();
        return -1;
    }
    else
    {
        printf("RK_MPI_VI_SetChnAttr is success.....\n");
    }
    ret =  RK_MPI_VI_EnableChn(vi_pipe,vi_chn);
    if(ret !=0)
    {
        printf("RK_MPI_VI_EnableChn is failed.....\n");
        RK_MPI_SYS_Exit();
        return -1;
    }
    else
    {
        printf("RK_MPI_VI_EnableChn is success.....\n");
    }

    return 0;
}

void*vi_getbuffer(void*argc)
{   int ret;
    FILE*fd;
    fd =fopen("/data/NV12.yuv","wb");
    VIDEO_FRAME_INFO_S stFrame;

    printf("................pthread..............\n");
    if(fd ==NULL)
    {
        printf("/data/NV12.yuv if open failed....\n");
        return NULL;
    }
    while(!quit)
    {
    ret = RK_MPI_VI_GetChnFrame(vi_pipe,vi_chn,&stFrame,-1);
        if(ret==RK_SUCCESS)
        {
            void*Data = RK_MPI_MB_Handle2VirAddr(stFrame.stVFrame.pMbBlk);
           if(Data != RK_NULL)
           {
            size_t writett = fwrite(Data,1,3133440,fd);  
            if(writett!=3133440)
            {
                 perror("fwrite failed");
                    break; // 写失败就退出循环
            }

            fflush(fd);


           }else
           {
            printf("RK_MPI_MB_Handle2VirAddr is failed.......\n");
           }
              RK_MPI_VI_ReleaseChnFrame(vi_pipe,vi_chn, &stFrame);
        }



    }
    printf(".........................................\n");
    fclose(fd);
    return NULL;
}

int main(int argc,char*argv[])
{   signal(SIGINT,sigterm_handler);
    //rk_mpi_init
    RK_MPI_SYS_Init();
    //dev_init
    dev_init();
    //vi_chn_init
    vi_chn_init();
    //pthread_getbuffer

    pthread_t pthread;

    pthread_create(&pthread,NULL,vi_getbuffer,NULL);
     while(!quit)
    {
        usleep(50000);
    }
        pthread_join(pthread,NULL);
    RK_MPI_VI_DisableChn(vi_pipe,vi_chn);
    RK_MPI_SYS_Exit();
    return 0;
}

用的摄像头是GC2053,播放器是ffmpeg
用的播放指令是ffplay -f rawvideo -video_size 1920x1080 -pixel_format nv12 -framerate 25 C:\Users\king\Desktop\NV12.yuv。

我来回答
回答0个
时间排序
认可量排序
易百纳技术社区暂无数据
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区