本文讲解使用ffmpeg从USB摄像头中采集一帧数据并写入文件保存,测试平台使用全志A20平台,其他平台修改交叉工具链即可移植。开发环境使用eclipse+CDT。交叉工具链使用arm-Linux-gcc4.4版本。

ffmpeg库的移植和编译请参考博客http://blog.csdn.net/smilefyx/article/details/32714743,开发板usb摄像头支持配置请参照博客http://blog.csdn.net/smilefyx/article/details/29574783。转载请声明。

1、工程建立

使用eclipse建立一个空的C++工程,工程目录请参照http://blog.csdn.net/smilefyx/article/details/32714743博文。工程建立后在编译选项中加入-D__STDC_CONSTANT_MACROS,否则会报一个错,可以自己尝试。

2、编写源代码

打开刚才创建工程时创建的avcodec.cpp文件,编写测试代码,本文测试代码如下,代码比较简单,没做相应的错误检测等操作:

  1. /*
  2. *FileName:avcodec.cpp
  3. *Author:yingxianFei
  4. *Description:capture one frame data from usb camera and save into file named out.yuv .
  5. **/
  6. #include <iostream>
  7. using namespace std;
  8. extern "C" {
  9. #include <math.h>
  10. #include <libavutil/opt.h>
  11. #include <libavcodec/avcodec.h>
  12. #include <libavutil/channel_layout.h>
  13. #include <libavutil/common.h>
  14. #include <libavutil/imgutils.h>
  15. #include <libavutil/mathematics.h>
  16. #include <libavutil/samplefmt.h>
  17. #include <libavformat/avformat.h>
  18. #include <libavdevice/avdevice.h>
  19. #include <libavutil/dict.h>
  20. };
  21. int main(int argc, char **argv) {
  22. int ret;
  23. AVFormatContext *fmtCtx = NULL;
  24. AVPacket pkt1, *pcaket = &pkt1;
  25. /*1、注册*/
  26. avcodec_register_all();
  27. avdevice_register_all();
  28. /*2、连接视频源*/
  29. AVInputFormat *inputFmt = av_find_input_format("video4linux2");
  30. if (NULL != inputFmt) {
  31. std::cout << "input device name:" << inputFmt->name << std::endl;
  32. } else {
  33. std::cout << "Null point!" << std::endl;
  34. }
  35. /*3、打开视频采集设备*/
  36. ret = avformat_open_input(&fmtCtx, "/dev/video0", inputFmt, NULL);
  37. if (0 == ret) {
  38. std::cout << "Open input device seccess!" << std::endl;
  39. }
  40. /*4、读取一帧数据,编码依据摄像头类型而定,我使用的摄像头输出的是yuv422格式*/
  41. av_read_frame(fmtCtx, pcaket);
  42. std::cout << "packet size:" << (pcaket->size) << std::endl;
  43. /*5、写入帧数据到文件*/
  44. FILE *fp = NULL;
  45. fp = fopen("out.yuv", "wb");
  46. if (NULL != fp) {
  47. //将数据写入文件
  48. fwrite(pcaket->data, 1, pcaket->size, fp);
  49. }
  50. //关闭文件
  51. fclose(fp);
  52. /*6、释放读取的帧数据*/
  53. av_free_packet(pcaket);
  54. /*7、关闭视频输入源*/
  55. avformat_close_input(&fmtCtx);
  56. return 0;
  57. }

3、编译测试

编译工程,将生成的源文件nfs到开发板上,运行可执行文件,成功后将保存一帧数据到out.yuv文件中。

使用Pyuv工具可以打开文件查看文件内容,打开时按照自己摄像头的参数进行选项配置,如本文测试效果如下:

http://blog.csdn.net/smilefyx/article/details/33728881

ffmpeg从USB摄像头采集一张原始图片(转)的更多相关文章

  1. 基于DirectShow和FFmpeg的USB摄像头监控软件-转

    第一个版本 ### 软件版本及实现功能 0.0.1 1. USB摄像头枚举和设备信息获取2. 实时视频观看3. 24小时不间断录像,录像文件支持暴风影音播放 ### 软件说明: 软件基于 Direct ...

  2. 【Xilinx-Petalinux学习】-06-OpenCV通过USB摄像头采集图像。

    占位, 实现USB摄像头的图像采集与保存

  3. QT学习之usb摄像头采集(Opencv+QT)[cvCapture,IplImage,QImage]

    参考自:http://blog.chinaunix.net/uid-23381466-id-3826748.html 将Opencv中的cvCaptureFromCAM不断获得摄像头采集到的图像数据, ...

  4. FFmpeg命令:几种常见场景下的FFmpeg命令(摄像头采集推流,桌面屏幕录制推流、转流,拉流等等)

    前提: 首先你得有FFmpeg(ffmpeg官网快捷通道:http://ffmpeg.org/) 再者,推流你得有个流媒体服务,个人测试用小水管:rtmp://eguid.cc:1935/rtmp/t ...

  5. dede调用文章内第一张原始图片(非缩略图)的实现方法

    第一步,修改include/extend.func.php文件,最下面插入函数,查询的是文章附加表,如需查询图片集什么的,改表名即可 //取原图地址 function GetFirstImg($arc ...

  6. 搭建USB摄像头转RTSP服务器的多种方法

    USB摄像头与网络摄像头相比,可选择范围广.种类多.成本低,但是实际使用时需要通过rtsp流来访问,起到直播的效果,因此在摄像头采集终端上构建rtsp流媒体服务器,将USB摄像头数据转化为rtsp,可 ...

  7. C# Activex调用USB摄像头--附带源码

    前言 最近在整理一些自己写过的东西,也算是重新熟悉一下并且优化一下吧. 需求:获取本地USB摄像头视频显示,并且获取图片数据给底层做人脸识别. 记得当时直接采用H5已经做好了,调试好了....结果放上 ...

  8. Linux下用FFMPEG采集usb摄像头到RTMP

    Linux下用 FFMPEG 采集 usb摄像头视频 和 摄像头内置麦克风音频 到RTMP服务   ffmpeg -f video4linux2 -qscale 10 -r 12 -s 640x480 ...

  9. 基于ZedBoard的Webcam设计(一):USB摄像头(V4L2接口)的图片采集【转】

    转自:http://www.cnblogs.com/surpassal/archive/2012/12/19/zed_webcam_lab1.html 一直想把USB摄像头接到Zedboard上,搭建 ...

随机推荐

  1. day33 Python与金融量化分析(三)

    第三部分 实现简单的量化框架 框架内容: 开始时间.结束时间.现金.持仓数据 获取历史数据 交易函数 计算并绘制收益曲线 回测主体框架 计算各项指标 用户待写代码:初始化.每日处理函数 第四部分 在线 ...

  2. Ansible 小手册系列 九(Playbook)

    playbook是由一个或多个"play"组成的列表.play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色.从根本上来讲所谓task无非 ...

  3. Slasher Flick

    打不死的小强! 返回一个数组被截断n个元素后还剩余的元素,截断从索引0开始. 这是一些对你有帮助的资源: Array.slice() Array.splice() 按照提供的第一种方法,代码如下: f ...

  4. gitlab下载安装及部署

    初次操作成功,记录一下   1. 安装依赖软件 yum -y install policycoreutils openssh-server openssh-clients postfix   2.设置 ...

  5. C++:tinyxml的使用

    1. 简介 TinyXML2(最新版本)是一个开源的功能齐全的XML解析库 For C++,源码见:github. 2. 开始使用 首先从Github上获得源码,是一个完整的演示工程,我们只需要其中的 ...

  6. wxpython的简单的应用

    import wximport wx.xrc import pandas as pd from conf.env import * # 允许选择的文件wildcard = "Python s ...

  7. LeetCode OJ:Climbing Stairs(攀爬台阶)

    You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...

  8. jQuery 选择器效率

    http://blog.csdn.net/cxl444905143/article/details/48808809 ID > Tag > Class ID 选择器是速度最快的,这主要是因 ...

  9. 左边的div导航根据右部div内容的高自动调整

    div结构如下: <div class="mainbody"> <div class="left">导航</div> < ...

  10. Dom4j下载及使用Dom4j读写XML简介(转)

    Dom4j下载及使用Dom4j读写XML简介 要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站在 http://www.dom4j.org/目前最新dom4j包下载地址:ht ...