zoukankan      html  css  js  c++  java
  • 使用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格式的。
  • 相关阅读:
    TreeSet集合的add()方法的源码解析
    Ubuntu下定时任务和自启动任务的部署
    基于Django的独立运行脚本开发
    python做量化交易干货分享
    使用Glide以及OkHttp集成
    Redis实现简单消息队列
    Linux下高并发socket最大连接数
    Ubuntu14.04部署pyspider的过程
    pymongo "ServerSelectionTimeoutError: No servers found yet" 错误的解决
    gitolite服务器部署中的一些坑
  • 原文地址:https://www.cnblogs.com/djzny/p/3393687.html
Copyright © 2011-2022 走看看