本文讲解使用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. pdflush进程介绍与优化【转】

    转载地址: http://blog.ops88.com/2012/07/12/74 一. /proc/sys/vm/dirty_background_ratio   该参数是在尝试一个write ba ...

  2. linux-Centos7安装php

    先安装相关依赖包 yum install pcre pcre-devel zlib zlib-devel openssl openssl-devel gd gd-devel libjpeg libjp ...

  3. garylog学习篇

    官方文档:https://www.graylog.org/ 简介 Graylog 是一个简单易用.功能较全面的日志管理工具,相比 ELK 组合, 优点: 部署维护简单查询语法简单易懂(对比ES的语法… ...

  4. 030——VUE中鼠标语义修饰符

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. hdu 6034 Balala Power!

    Balala Power! Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  6. I/O流+统计文件词频

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  7. Django-自定义分页组件

    1.封装的分页代码: class PageInfo(object): def __init__(self,current_page,all_count,per_page,base_url,show_p ...

  8. 用JAMES实现自己的邮件服务器

    简介 James 是一个企业级的邮件服务器,它完全实现了smtp 和 pops 以及nntp 协议.同时,james服务器又是一个邮件应用程序平台.James的核心是Mailet API,而james ...

  9. 一个浮动 css3效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 老男孩Linux运维期中架构