• 使用FFmpeg捕获一帧摄像头图像


    最近在研究FFmpeg,比较惊讶的是网上一大堆资料都是在说如何从已有的视频中截取一帧图像,却很少说到如何直接从摄像头中捕获一帧图像,其实我一直有个疑问,就是在Linux下,大家是用什么库来采集摄像头的(opencv?)?还是自己写v4l2的代码来实现?我之前一直都是用v4l2来采集摄像头的。经过一些时间的研究,最后成功地用FFmpeg实现了从摄像头采集一帧图像,实现代码也非常简单。不多说,上代码。

    #include 
    #include 
    #include 
    #include 
    #include 
    
    #include 
    #include 
    #include 
    
    
    void captureOneFrame()
    {
        AVFormatContext *fmtCtx = NULL;
        AVFormatParameters inputFmtParameter;
        AVPacket *pcaket;
            
        //输入格式(V4L2)
        AVInputFormat *inputFmt = av_find_input_format ("video4linux2"); 
        if (inputFmt == NULL) 
        {
            printf("can not find_input_format
    ");
            return;
        }
    
        memset (&inputFmtParameter, 0, sizeof(inputFmtParameter));
        //采集图像的高度
        inputFmtParameter.height = 240;
        //采集图像的宽度
        inputFmtParameter.width  = 320;
    
        //打开摄像头设备
        if (av_open_input_file ( &fmtCtx, "/dev/video0", inputFmt,
                   sizeof(inputFmtParameter),&inputFmtParameter) < 0)
        {
            printf("can not open_input_file
    ");
             return;
        }
        //从摄像头获取一帧图像
        av_read_frame(fmtCtx, pcaket);
        //输出图像的大小
        printf("data length = %d
    ",pcaket->size);
        
        FILE *fp;
        //打开(新建)文件
        fp = fopen("out.yuv", "wb");
        if (fp < 0)
        {
            printf("open frame data file failed
    ");
            return ;
        }
        //将数据写入文件
        fwrite(pcaket->data, 1, pcaket->size, fp);
        //关闭文件
        fclose(fp);
    
        //关闭设备文件
        av_close_input_file(fmtCtx);
    }
    
    
    int main()
    {
        avcodec_init();    
        avcodec_register_all();
        avdevice_register_all();
    
        captureOneFrame();
    
        return 0;
    }
    注意:采集出来的图像的是YV12格式的。
  • 相关阅读:
    微信打开网址添加在浏览器中打开提示遮罩
    Java内存分配之堆、栈和常量池
    腾讯面试题04.进程和线程的区别?
    cookie 和 session的区别
    jvm内存模型-回收算法-和内存分配以及jdk、jre、jvm是什么关系(阿里,美团,京东面试题)
    HTTP中GET与POST的区别
    Socket send函数和recv函数详解
    JSP九大内置对象及四个作用域
    JavaScript
    网页布局(html+css基础)
  • 原文地址:https://www.cnblogs.com/djzny/p/3393687.html
Copyright © 2020-2023  润新知