本系列的博文会简单介绍一下图像视频编码和FFmpeg这个库的一些简单使用。本文将介绍一下怎么下载和使用FFmpeg和它的一些资料。
FFmpeg是一个开源视音频编码和解码库,具体的介绍可以看维基百科的介绍。它的源码可以在这里下载。
做开发的话,只需FFmpeg的头文件和库文件即可。这些文件可以到http://ffmpeg.zeranoe.com/builds/下载(下载那个Dev版本)最新版的SDK。那个Shared版本也下载吧,后面会用到的。记得要配置编译器的头文件查找路径和库文件查找路径。
因为FFmpeg用C语言写的,并且在FFmpeg的头文件里面,并没有加入和C++兼容使用的extern “C”,所以在用C++写FFmpeg程序,编译的时候会碰到很多坑爹的错误提示。解决的方法也很简单,在C++的源文件加入extern “C”即可。即使加入了,还会出现#error missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS 和 'UINT64_C' was not declared in this scope 之类的错误。可以加入一些宏定义来解决。如下面代码:
#ifdef __cplusplus
#define __STDC_CONSTANT_MACROS
#ifdef _STDINT_H
#undef _STDINT_H
#endif
# include <stdint.h>
#endif
extern "C"
{
#include<libavcodec/avcodec.h>
#include<libavformat/avformat.h>
#include<libswscale/swscale.h>
}
我已经用静态库进行编译了(我是在Windows环境下用Qt Creator,其他环境我没有测试过是不是有这个问题),但不知道为什么其在运行其还是需要动态库,弹出的错误提示如下图。对应的解决的方法也非常简单,把刚才下载到的动态库放到一个文件夹里面,然后把动态库所在的目录路径添加到Windows系统的环境变量里面即可。
FFmpeg有一个很烦人的地方:很多旧版本的接口,在新版本中会废弃,在编译的时候会提示,某某函数或者宏定义没有定义。解决这个问题有两个方法,一是使用旧版本的FFmpeg,这里可以下载到旧版本的FFmpeg SDK。第二个方法是,查看FFmpeg源代码里面的一个APIchanges文件(在doc目录),这个文件会说明API函数从哪个变成哪个了。当然有些函数直接丢弃,并且没有对应的替代函数。比如av_set_parameters。
学开源库少不了帮助文档,可以在这里找到各个版本的帮助文档。我用的2.2版本,可以点击这里,直接到2.2版本的帮助文档。
有个老外专门为FFmpeg写了一个教程。在一开始,老外就说了这个教程有点老了。不过这并不妨碍我们通过这个教程学习FFmpeg。老外写的例子里面,很多API函数都已经被新版本的FFmpeg废弃了。不过可以在这里下载到最新的代码。
学习图像视频编码,有个很郁闷的问题,就是找不到合适的文件,比如YUV文件。这里可以下载到一些YUV文件,是YUV420格式的。可能会用到YUYV422格式的文件,我上传了一些YUYV422格式的文件。http://download.csdn.net/detail/luotuo44/7377249、http://download.csdn.net/detail/luotuo44/7377341
学习FFmpeg,大家可以去逛一下FFmpeg工程组。也可以到这里下载一些帮助文档。