v4l2在帧缓冲区预览摄像头

在应用层通过v4l2 api将采集的摄像头数据yuv转为rgb后写到帧缓冲区达到预览摄像头的目的,程序运行后切换到tty下就可以看到。我的屏幕是bgra格式的,这点要注意,不同屏幕格式不同,不同r,g,b的偏移通过修改(0x00<<24) | (R0<<16) | (G0<<8) | (B0<<0);中的顺序即可

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
/**
 ** v4l2在帧缓存区预览摄像头: gcc -std=c99 -o main main.c
 **/
static int width;//屏幕宽度
static int height;//屏幕高度
static __u32 *pfb;//屏幕缓冲区指针
static int fb;
static struct fb_fix_screeninfo finfo;
static struct fb_var_screeninfo vinfo;
void fb_fillimg(const __u32* img);
void initFb()
{
    int ret = -1;
    //打开帧缓冲区设备
    fb = open("/dev/fb0", O_RDWR);
    if (fb < 0) {  perror("open fb0"); return;  }
    printf("open /dev/fb0 success \n");
    //得到固定屏幕信息
    ret = ioctl(fb,FBIOGET_FSCREENINFO,&finfo);
    //得到可变屏幕信息
    ret = ioctl(fb, FBIOGET_VSCREENINFO, &vinfo);
    if (ret < 0) { perror("get var info"); return; }
    width = vinfo.xres_virtual;
    height = vinfo.yres_virtual;
    printf("width=%d,height=%d\n",width,height);
    //映射帧缓冲区基址
    pfb = (__u32*)mmap(NULL, finfo.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0);
    if (NULL == pfb) { perror("fb0 mmap"); return; }
}
void closeFb()
{
    munmap(pfb,finfo.smem_len);
    close(fb);
}
/**
 ** yuv422转bgra
 **/
int max(int a,int b){ return a

预览效果:



你可能感兴趣的:(c,linux)