在嵌入式板子上插了一个usb摄像头(摄像头为索尼的,输入格式为mjpeg4),利用linux v4l2驱动抓取mpeg4图片,然后写入avi文件,在网上找了好几个开源库,找到两个库:

一个库在这里:

http://avifile.cvs.sourceforge.net/avifile/avifile-0.6/

但是这个库很久没有维护了,编译的时候还出了好多错,而且还是语法错误,各种问题比较多,而且比较庞大,暂时放弃,如果有兴趣的朋友可以继续研究,后面我会写一篇文章专门讲述编译过程。

另一个库是一个小巧的库,目前使用的就是这个库。(ps:我在网上搜到好几个站点介绍这个库的使用,都只是写了一半,然后把开源的源代码放在自己设定的下载站或者别的什么站点,下载时要扣除高额积分,这是一种无耻卑鄙下作的做法,用别人开源代码还藏着掖着,甚至为自己牟利。)

这个库的地址在这儿:

https://github.com/lanyou1900/avilib

下面是我使用的示例代码(其中v4l2-camera也是在网上找的代码修改的):
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "v4l2-camera.h"

/*We add this tag since here reference the c source file but the obj file in c++*/
extern "C"
{
    #include "avilib.h"
}
using namespace v4l2;

int main()
{
    V4l2Camera avobj;
    //int fd = open("/dev/video0", O_RDONLY); 
    int numbers = avobj.get_number_of_cameras();
    printf("The number of camera is:%d\n",numbers);
    //printf("fd=%d\n",fd);
    
    /*
    if(fd>0)
    {
        close(fd);        
    }
    */
    V4l2Capture parameter;
    //int ret = avobj.InitDevice(&parameter,VideoFormat::MJPEG,"/dev/video0",30,1280,760);
    int ret = avobj.InitDevice(&parameter,VideoFormat::MJPEG,"/dev/video0",25,320,240);
    printf("init device,ret=%d\n",ret);    
    printf("fd=%d\n",parameter.fd);
    printf("quality=%d\n",parameter.quality);
    printf("brightness=%d\n",parameter.brightness);
    
    avobj.StartDevice(parameter.fd);
    
    int i = 1;
    
    //avifile
    char avifile[128] = {0};
    char tmp[16] = {0};
    snprintf(tmp,16,"%s","movie.avi");
    strcat(avifile,"/home/");
    strcat(avifile,tmp);
    printf("the avi file name is:%s\n",avifile);
    avi_t* avi_fd = NULL;
    avi_fd = AVI_open_output_file(avifile);
    if(avi_fd == NULL)
    {
        printf("Can not open the avifile.\n");
        return 0;
    }
    printf("open the avifile.\n");
    //AVI_set_video(avi_fd,1280,760,30,"MJPG");
    AVI_set_video(avi_fd,320,240,25,"MJPG");
    for(;;)
    {
        if(i==501)
        {
            break;
        }
        printf("begin to capture %d picture.\n",i);
        
        ret = avobj.GetFrame(&parameter);    
        printf("get frame ret=%d\n",ret);    
        printf("parameter.v4l2Info.length=%d\n",parameter.v4l2Info.length);

char buffer[512];
        memset(buffer,0,512*sizeof(char));
        char data = 0;
        /*
        memset(parameter.v4l2Info.buffer,1,1);
        memset((void*)(((char*)parameter.v4l2Info.buffer)+1),2,1);
        memset((void*)(((char*)parameter.v4l2Info.buffer)+2),3,1);
        memset((void*)(((char*)parameter.v4l2Info.buffer)+3),4,1);
        memset((void*)(((char*)parameter.v4l2Info.buffer)+4),5,1);*/
                
        for(int i=0;i<10;i++)
        {
            data = ((char*)parameter.v4l2Info.buffer)[i];
            snprintf(buffer+2*i,3,"%02X",data);
        }
        printf("the buffer is:%s\n",buffer);
        
        /*
        char tmp[8] = {0};
        snprintf(tmp,8,"%d.jpg",i);
        char filename[128];
        memset((void*)filename,0,128*sizeof(char));
        strcat(filename,"/home/");
        strcat(filename,tmp);
        printf("the file name is:%s\n",filename);
        FILE *fp = fopen(filename,"wb+");
        
        if(fp == NULL)
        {
            printf("open file %s fail!\n",filename);            
        }
        else
        {
            printf("begin to write image to file %s.................\n",filename);    
            fwrite(parameter.v4l2Info.buffer,parameter.v4l2Info.length,1,fp);
            fclose(fp);
            fp = NULL;
            printf("end to write image to file %s\n",filename);                
        }
        */
        
        printf("begin to write avi file.\n");
        AVI_write_frame(avi_fd,(char*)parameter.v4l2Info.buffer,parameter.v4l2Info.length,0);
        printf("end to write avi file.\n");
        
        i++;
        
        //sleep(1);
    }
    
    AVI_close(avi_fd); 
    
    return 0;
}

写成的avi文件用暴风播放器可以播放,其它播放器没有试过,抓的时候时间适当长一点。

MPEG4写为avi文件相关推荐

  1. vc++实现avi文件的操作 用于视频解析及录制(转)

    vc++实现avi文件的操作 为了对avi进行读写,微软提供了一套API,总共50个函数,他们的用途主要有两类,一个是avi文件的操作,一类是数据流streams的操作. 1.打开和关闭文件 AVIF ...

  2. AVI文件数据流操作

    Video for Windows (VFW)在16位Windows中就引入了,现在的很多功能被DirectX所代替或超越了.但是还是有一些用处的. Audio-video-interleaved f ...

  3. vc++实现avi文件的操作

    vc++实现avi文件的操作 为了对avi进行读写,微软提供了一套API,总共50个函数,他们的用途主要有两类,一个是avi文件的操作,一类是数据流streams的操作. 1.打开和关闭文件 AVIF ...

  4. 如何让nextcloud支持avi文件在线播放

    默认的nextcloud是不支持avi文件播放的,google查了一圈,都说是没法支持. 然而我觉得都是html5写的,为啥偏偏不支持. 查了一些资料,发现还是官方的代码少写了东西,可能是没考虑那么全 ...

  5. FFMPEG保存H264流到AVI文件中形成录像

    研究了使用FFMPEG保存H264流到AVI文件中形成录像的方法,下面是大致流程. 使用的FFMPEG版本   ffmpeg-2.6.9.然后我静态编译后使用的静态库,至于怎么静态编译看我之前的文章. ...

  6. Qt利用avilib实现录屏功能,生成avi文件

    环境: Qt + vs2013 + avilib demo下载:https://download.csdn.net/download/birenxiaofeigg/12087607 界面 开始录制: ...

  7. 怎样用DirectShow来压缩一个AVI文件

    原文出处:http://littleflute.blog.hexun.com/1043233_d.html 这里我们讲解怎样用DirectShow来压缩一个AVI文件.我们重点放到视频压缩,同样的方法 ...

  8. AVI文件花屏问题分析和解决

    一.背景 用一段采集到的桌面数据流进行编码,复用后生成AVI文件,结果AVI文件播放过程中会有花屏现象. 环境:ffmpeg二次开发环境 二.分析 1.首先是想办法把花屏的问题复现出来,但是尝试了很多 ...

  9. 重新压缩一个AVI文件

    效果图: directshow文档中有一节关于重新压缩一个AVI,按照文章的思路: 1.选择一个压缩Filter 2.设置视频压缩属性 3.生成重新压缩graph 4.写文件 给出所有源代码(文档中已 ...

  10. matlab读取avi文件出错

    1,出现问题 在使用matlab做实验的时候出现问题,具体信息如下: >> m2=aviread('C:/test.avi'); ??? Error getting frame data. ...

最新文章

  1. 呼叫中心的技术创新源于管理文化的变革
  2. 过程声明与同名事件或过程的描述不匹配_多特征结合的倾斜无人机影像匹配方法...
  3. WireShark抓DNS请求和回复数据报的分析
  4. 中医为什么会发明比血管更玄乎的经脉呢
  5. 教之初在线计算机考题,教之初计算机考试系统出题说明.pdf
  6. 考研-数学经验贴(总结)
  7. VMware上Ubuntu联网(NAT方式)
  8. [离散数学]集合论基础P_4:运算定律及其证明
  9. 深度学习实战(4)如何向BERT词汇表中添加token,新增特殊占位符
  10. SN74HC165驱动
  11. MySQL 实现FULL JOIN的几种方式
  12. Mac Terminal (终端) 使用ssh快速登录远程服务器
  13. VisionPro空间转换
  14. Go操作Elasticsearch总结
  15. 解读相机镜头中的那些名词 — 焦距、焦段、光圈、景深
  16. 车品觉-《决战大数据》
  17. 产品需求规格说明书写法
  18. Ubuntu添加路由规则
  19. 【基于侧扫声呐和SFS方法的地形三维重构】(二)侧扫声呐SFS数学模型建立
  20. firefox下载失败

热门文章

  1. 机器人油封_机器人油封 机器人减速机 机器人伺服电机油封 KVNOK油封
  2. 断面测量数据格式转换
  3. 罗马音平假名片假名转换器_平假名与片假名
  4. win10录屏电流声_Win10自带录音录屏工具使用体验,值得一试
  5. 物联网从业者必须知道的知识:IMSI号介绍与解析
  6. 通过子网掩码和ip地址计算网络地址和广播地址
  7. matlab-imresize-最近邻插值、双线性插值、双三次插值学习总结
  8. IconFont图标库
  9. 在线硬盘存储计算机,【模拟攒机-模拟装机】在线攒电脑-ZOL中关村在线
  10. 如何通过5S管理改变工作环境?