ffmpeg学习笔记

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

准备工作:

1.登录/builds/下载对应的开发版本

如xp32位系统下载FFmpeg 32-bit Dev Versions与FFmpeg 32-bit Shared Versions

中dev版本里有头文件与静态lib库,在开发的时候包含进工程,share版本里有程序运行发布时候需要的dll动态库。

2.在vs2010中配置inclue与lib

工程→属性→配置属性→c/c++→常规→附加包含目录→添加dev版本中的include路径

工程→属性→配置属性→链接器→常规→附加库目录→添加dev版本中的lib 路径

工程→属性→配置属性→链接器→输入→附加依赖项→添加dev版本中的lib

文件,具体包括:avcodec.lib,avformat.lib,avdevice.lib,avfilter.lib,avutil.lib,postproc.lib,swresample.lib,swscale.lib

3.在工程中引用ffmpeg头文件,因为ffmepeg是纯C程序,因此,在C++中包含其头文件需要加上extern “C”标识符,如:

extern"C"

{

#include"libavformat/avformat.h"

#include"libavcodec/avcodec.h"

}

4.工程调试运行时需要将dll添加至工程目录,具体包括:avcodec-5

5.dll,

avdevice-55.dll,avfilter-3.dll,avformat-55.dll,avutil-52.dll,

postproc-52.dll,swresample-0.dll,swscale-2.dll

5.程序编译会报无法打开包括文件:“inttypes.h”: No such file or directory

原因是因为VS2010不支持inttypes.h。

解决方法删除,并在之前添加如下代码

#if defined(WIN32)&&!defined(__MINGW32__)&&!defined(__CYGWIN__)

# define CONFIG_WIN32

#endif

#if defined(WIN32)&&!defined(__MINGW32__)&&!defined(__CYGWIN__)

&&!defined(EMULATE_INTTYPES)

#define EMULATE_INTTYPES

#endif

#ifndef EMULATE_INTTYPES

#include

#else

typedef signed char int8_t;

typedef signed short int16_t;

typedef signed int int32_t;

typedef unsigned char uint8_t;

typedef unsigned short uint16_t;

typedef unsigned int uint32_t;

#ifdef CONFIG_WIN32

typedef signed__int64int64_t;

typedef unsigned__int64uint64_t;

#else

typedef signed long long int64_t;

typedef unsigned long long uint64_t;

#endif

#endif

6.打开一个视频文件:

首先调用av_register_all()初始化并注册视频文件格式与编解码库,注意只需要初始化一次。

然后调用avformat_open_input()打开具体的视频文件

如:

AVFormatContext*pFormatCtx=NULL;

const char*filename="a.avi";

int ret;

if((ret=avformat_open_input(&pFormatCtx,filename,NULL,NULL))<0) {

abort();

}

其中avformat_open_input具体实现与参数含义

avformat_open_input

[cpp]view plaincopy

1.//参数ps包含一切媒体相关的上下文结构,有它就有了一切,本函数如果打开媒体成功,

2.//会返回一个AVFormatContext的实例.

3.//参数filename是媒体文件名或URL.

4.//参数fmt是要打开的媒体格式的操作结构,因为是读,所以是inputFormat.此处可以

5.//传入一个调用者定义的inputFormat,对应命令行中的 -f xxx段,如果指定了它,

6.//在打开文件中就不会探测文件的实际格式了,以它为准了.

7.//参数options是对某种格式的一些操作,是为了在命令行中可以对不同的格式传入

8.//特殊的操作参数而建的,为了了解流程,完全可以无视它.

9.int avformat_open_input(AVFormatContext **ps,

10.const char *filename,

11. AVInputFormat *fmt,

12. AVDictionary **options)

13.{

14. AVFormatContext *s = *ps;

15.int ret = 0;

16. AVFormatParameters ap = { { 0 } };

17. AVDictionary *tmp = NULL;

18.

19.//创建上下文结构

20.if (!s && !(s = avformat_alloc_context()))

21.return AVERROR(ENOMEM);

22.//如果用户指定了输入格式,直接使用它

23.if (fmt)

24. s->iformat = fmt;

25.

26.//忽略

27.if (options)

28. av_dict_copy(&tmp, *options, 0);

29.

30.if ((ret = av_opt_set_dict(s, &tmp)) < 0)

31.goto fail;

32.

33.//打开输入媒体(如果需要的话),初始化所有与媒体读写有关的结构们,比如

34.//AVIOContext,AVInputFormat等等

35.if ((ret = init_input(s, filename)) < 0)

36.goto fail;

37.//执行完此函数后,s->pb和s->iformat都已经指向了有效实例.pb是用于读写数据的,

38.//把媒体数据当做流来读写,不管是什么媒体格式,而iformat把pb读出来的流按某种媒

体格

39.//式进行分析,也就是说pb在底层,iformat在上层.

40.

41.//很多静态图像文件格式,都被当作一个格式处理,比如要打开.jpeg文件,需要的格式

42.//名为image2.此处还不是很了解具体细节,作不得准哦.

相关文档
最新文档