近期由于工作任务,需要开发一个跨平台视频聊天系统,其中就用到了ffmpeg进行采集与编码,网上找了一大堆的资料,虽然都有一些有用的东西,但实在太碎片化了,这几天一直在整理和实验这些资料,边整理,边做一个总结,今天先总结一下采集的步骤,我是在linux平台下进行试验的,操作系统是ubuntu13.04 64bit,ffmpeg的版本是2.0.1,采用C语言开发,我的目标是从摄像头采集到1帧视频,然后用容器输出这帧的图像并把图像保存为bmp文件。整个采集的步骤是:连接视频源->获取视频流->demux(解复用)视频格式->匹配解码器->解码->转换->输出,这个是步骤的概述,下面针对ffmpeg的具体操作逐一进行一个讲解:

连接视频源

使用av_find_input_format函数连接v4l2(video4linux2)摄像头设备,大部分的摄像头设备在Linux下都是v4l2类型的,这个函数返回AVInputFromat*类型的数据。

我的代码:AVInputFormat *inputFmt=av_find_input_format("video4linux2");

获取视频流

使用avformat_open_input函数打开上一步骤的摄像头设备获取视频流.

我的代码:avformat_open_input(&fmtCtx,"/dev/video0",inputFmt,NULL);

代码备注:fmtCtx是一个AVFormatContext*对象,是一个视频格式处理的上下文对象,很重要,里面有这个采集的视频的元数据,"/dev/video0"是摄像头的映射路径,这部分是Linux基础,不是本文的重点,inputFmt就是第一步得到的AVInputFormat*对象,inputFmt不是必须的参数,NULL也可以,如果是NULL,则会自动检测。

demux(解复用)视频格式

fmtCtx里面包含了采集到的视频流的视频格式,如果是摄像头的话,应该是RAWVIDEO类型的数据,codec_id=14。

我的代码:fmtCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO

代码备注:fmtCtx->streams实际上是一个二维数组或数组指针,因为fmtCtx->streams数组内每一个元素都指向一个一维数组,每一个一维数组都有可能有数据,比如音频、视频、字幕等,因此这里的理想处理方式应该是用一个循环匹配每一个的fmtCtx->streams,因为我们这里只关心视频,因此我们只需要匹配codec_type==AVMEDIA_TYPE_VIDEO的数据就可以了。

匹配解码器

既然上一步已经经过解复用知道了视频流的格式是RAWVIDEO类型了,接下来要做的就是找到对应的解码器进行解码了,这里用到了函数avcodec_find_decoder,返回AVCodec*类型数据,就是一个解码器对象。

我的代码:avcodec_find_decoder(fmtCtx->streams[i]->codec->codec_id)

以下部分开始暂时我自己代码还没完成,完成后会贴上来,所以我只是会说明以下采用哪些函数,至于函数怎么用我暂时不提供,大家可以等待我近期更新或自行去ffmpeg官网开api documentation

解码

所谓解码,就是用上一步得到的解码器打开视频流帧(帧是视频的最小单位),这里用到函数是av_read_frame与avcodec_decode_video2,av_read_frame从视频流中读取一帧,但这个函数返回的不是帧对象AVFrame*,而是Packet对象AVPacket,要经过avcodec_decode_video2这个解码函数才能得到AVFrame*对象,这里说明一下,AVPacket最多可能包含一个帧,而一个AVFrame可能会包含很多个AVPacket,二者的区别请读者请自行Google,以后我也许会专门开篇说明。

我的代码:有点复杂,稍后我整理好贴上来

转换

经过解码后得到的是YUYV422格式的视频帧,这种格式如果要进行网络传输比如视频聊天,要进行H264编码,而H264编码目前输入源必须是YUV420格式的,YUYV422与YUV420格式间的转换我后面会补上,我自己的代码也刚写到这个位置,我稍后确认代码没问题后会贴上来,这里暂且不讨论网络传输和H264部分,这里就讨论怎么把YUYV422输出到容器或者保存成图片文件呢,要进行一次YUV格式到RGB24格式的转换,采用函数sws_scale进行转换。

输出

到这步前,实际上我们已经得到了RGB24格式的数据了,接下来输出分2种情况,一种是采用容器的方式输出,这种方式的话可以直接把RGB24格式的数据源作为容器的输入源即可了,比如IOS下可以采用UIIMAGEVIEW作为容器,还有一种是保存成bmp图,以图片的形式输出,如果保存成bmp图片的话,在C语言下不用任何第三方库的前提下,需要自己建立bmp数据结构来生成bmp文件。

转自:http://www.cnblogs.com/babystudio/archive/2013/09/08/3308965.html

[转载] ffmpeg摄像头视频采集-采集步骤概述并采集一帧视频的更多相关文章

  1. ffmpeg摄像头采集h264编码RTP发送

    一. 相关API说明 1. av_register_all 2. avformat_network_init 不管是流媒体发送还是流媒体接收, 需要先执行该函数. 3. avformat_alloc_ ...

  2. 3D图片采集与展示(SurfaceView 自适应 Camera, 录制视频, 抽取帧)

    最近在做一个3D图片采集与展示. 主要功能为:自定义Camera(google 已经摈弃了Camera, 推荐使用Camera2,后续篇幅,我将会用Camera2取代Camera),围绕一个物体360 ...

  3. FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑

    FFmpeg_Tutorial FFmpeg工具和sdk库的使用demo 一.使用FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑 1.基本介绍 对于每一个从事音视频技术开发的工程师,想必没 ...

  4. [转载]FFmpeg完美入门[3] - FFmpeg功能及使用说明

    1 ffplay对多媒体的支持能力验证 一.视频3gp 177X144 支持播放,在windows下播放正常,但是在linux下面偶有BUG 如果发现画面无法显示而声音可以播放的情况下可以试着切换全屏 ...

  5. Android开发:实时处理摄像头预览帧视频------浅析PreviewCallback,onPreviewFrame,AsyncTask的综合应用(转)

    原文地址:http://blog.csdn.net/yanzi1225627/article/details/8605061# 很多时候,android摄像头模块不仅预览,拍照这么简单,而是需要在预览 ...

  6. [转载]FFmpeg完美入门[2] - FFmpeg参数说明

     1 通用选项 -L license -h 帮助 -fromats 显示可用的格式,编解码的,协议的. -f fmt 强迫采用格式fmt -i filename 输入文件 -y 覆盖输出文件 -t d ...

  7. [转载] FFMPEG结构体分析:AVFrame

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrameFFMPEG结构体分析:AVFormatContextFFMPEG结构体分析:AVCodecContext ...

  8. [转载] ffmpeg函数介绍

    本文对在使用ffmpeg进行音视频编解码时使用到的一些函数做一个简单介绍,我当前使用的ffmpeg版本为:0.8.5,因为本人发现在不同的版本中,有些函数名称会有点小改动,所以在此有必要说明下ffmp ...

  9. 短视频技术详解:Android端的短视频开发技术

    在 <如何快速实现移动端短视频功能?>中,我们主要介绍了当前短视频的大热趋势以及开发一个短视频应用所涉及到的功能和业务.在本篇文章中,我们主要谈一谈短视频在Android端上的具体实现技术 ...

随机推荐

  1. IIS下配置PHP

    首先下载Windows的PHP安装包.随后将该包解压至C:\PHP.完成上面的步骤后,将C:\php目录下的php.ini-dist文件改名为php.ini,然后拷到C:\Windows目录下. 用记 ...

  2. 【leetcode】Merge Intervals(hard)

    Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,1 ...

  3. bzoj1032 [JSOI2007]祖码Zuma

    1032: [JSOI2007]祖码Zuma Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 672  Solved: 335[Submit][Stat ...

  4. 5.4.1 termios结构,关闭回显功能,一键入字符fgetc立刻返回,不用按下回车键

    Linux提供了一组编程接口,用来控制终端驱动程序的行为.这样我们可以更精细的来控制终端. 例如: 回显:允许控制字符的回显,例如读取密码时. 使用termios结构的密码程序 #include &l ...

  5. SQL Server分区动态生成脚本(三)(按年份划分)

    --生成分区脚本DECLARE @DataBaseName NVARCHAR(50)--数据库名称DECLARE @TableName NVARCHAR(50)--表名称DECLARE @Column ...

  6. CentOS6.X 系统安装图文教程,超详细

    http://www.myhack58.com/Article/sort099/sort0102/2011/32363_7.htm

  7. TPYBoard开发板ADC数模转换一: 初识ADC使用

    转载请以链接形式注明文章来源,公众号:MicroPython玩家汇 1.前言 ADC,Analog-to-DigitalConverter的缩写,指模/数转换器或者模数转换器[1].是指将连续变化的模 ...

  8. JVM配置参数详解(目前不够完善)

    最近看了有关虚拟机的书籍,发现有很多虚拟机配置参数不知道,特来记录一下, -XX: MaxDirectMemorySize--->设置直接内存,不设置与Java堆内存最大值一致 -XX:Perm ...

  9. python中的replace()方法的使用

    python中的replace()方法的使用 需求是这样的:需要将字符串的某些字符替换成其他字符 str.replace(old,new,max) 第一个参数是要进行更换的旧字符,第二个参数是新的子串 ...

  10. PTA之简单阶乘计算

    本题要求实现一个计算非负整数阶乘的简单函数. 时间限制: 400ms 内存限制: 64MB 代码长度限制: 16KB 函数接口定义: int Factorial( const int N ); 其中N ...