本文讲解使用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. HDU 5699 二分+线性约束

    http://acm.hdu.edu.cn/showproblem.php?pid=5699 此题满足二分性质,关键在于如何判断当前的时间值可以满足所有的运送方案中的最长的时间. 对于每一次枚举出的k ...

  2. ES6 HttpApplication Middleware

    const HttpRequest = function() { this.query = '' } function HttpResponse() { this.body = [] this.sta ...

  3. Where do I belong

    先给数组排序,然后找到指定的值在数组的位置,最后返回位置对应的索引. 举例:where([1,2,3,4], 1.5) 应该返回 1.因为1.5插入到数组[1,2,3,4]后变成[1,1.5,2,3, ...

  4. Winform 导航菜单的方法

    http://blog.163.com/kunkun0921@126/blog/static/169204332201171610619611/ 第一种:使用OutlookBar第三方控件 第二种:使 ...

  5. LeetCode OJ:ZigZag Conversion(字符串的Z字型转换)

    The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...

  6. resizable可调整尺寸组件

    Resizable 可调整尺寸不依赖于其他组件 1.用法:通过标记创建可调整尺寸(resizable)对象 <div class="easyui-resizable" sty ...

  7. L151

    In Toothy Prequel, Piranha-Like Fish Menaced Jurassic Seas You can call it a prehistoric prequel.Sci ...

  8. Android 贝塞尔曲线解析

    相信很多同学都知道"贝塞尔曲线"这个词,我们在很多地方都能经常看到.利用"贝塞尔曲线"可以做出很多好看的UI效果,本篇博客就让我们一起学习"贝塞尔曲线 ...

  9. Vim技能修炼教程(11) - 代码折叠

    上一讲我们是程序员篇的第一讲,关于代码跳转.代码跳转是一个付出很少收获很大的功能.这一节我们开始一个收获很多,但是付出也相对多一点功能:代码折叠. 代码折叠 折叠的类型 折叠有下面几种类型: * Ma ...

  10. Android中免root的hook框架Legend原理解析

    一.前言 Android中hook框架已经非常多了,最优秀的当属Xposed和Substrate了,这两个框架我在之前的文章都详细介绍过了,不了解的同学,可以转战这里:http://www.wjdia ...