感兴趣可以加QQ群85486140,大家一起交流相互学习下!
备注:本人用的4.1的版本
1.ffmpeg模块
ffmpeg:FFmpeg全名是Fast Forward MPEG(Moving Picture Experts Group) 快速动态图像专家组.
- avcodec:最重要的编解码库
- avformat:封装格式处理
- avfilter:滤镜效果处理库,想象一下手机上的滤镜模式
- avdevice: 管理输入输出的通用框架(v4l2)
- avutil:这个里面包含的常用的公共的库,可以对比Android中的libutil.so。
- swresample:(software resample)音频重采样库,用于音频的格式转换
- swscale: 处理图像缩放,颜色空间和图像格式的转换操作。
2.windows环境搭建(VS2010)
2.1 开发包下载
- 下载开发包
这里点击下面链接即可跳到windowns下的库的下载 https://ffmpeg.zeranoe.com/builds/ ,注意操作系统的格式。这里我的机器是win64,则选择win64挡。如果是其他操作系统可以在http://www.ffmpeg.org/download.html 中找到其它操作系统对应的开发包。
紧接着跳转到下面的网页 (https://ffmpeg.zeranoe.com/builds/win64/),下图可以直接点击下载的(v4.1),这里最好把上面三个库都下载下来。
Index of /builds/win64/
File Name ↓ | File Size ↓ | Date ↓ |
---|---|---|
Parent directory/ | - | - |
dev/ | - | 2019-Feb-24 09:33 |
shared/ | - | 2019-Feb-24 09:32 |
static/ | - | 2019-Feb-24 09:16 |
- dev:开发者需要的头文件以及编译链接的库都在这里面,同时要注意这里包含了一些ffmpeg的例子。
- shared:动态库下载,编译出来的可执行程序(非static),运行时需要动态加载dll库,要不然是运行不起来的。
- static:编译出来的包含静态库的可执行文件(ffmpeg,ffplay,ffprobe,ffserver),初学者可以根据可执行文件命令行体验一些ffmpeg的功能。(包含了doc文档)。
2.2 vs2010工程创建
在进入vs2010后可以使用(ctrl+shfit+n)快捷键,也可以操作如下:
点击属性后就不会弹出创建项目的类型,这里新手一般选择win32控制台应用程序。到后面需要图像界面的话可以选择MFC。
- 添加include
这里的需要将刚才下载dev目录下包含的include目录拷贝到工程目录(cpp文件所在的目录),然后手动输入include即可,当然也可以通过点击下标手动选择目录(这个目录就是觉得路径了,工程更换目录就编译不过,一般使用相对路径)
- 添加lib
通添加头文件一样,这里添加lib库的目录,这里lib的名字就是lib,手动输入lib。以及在链接器->输入tab项。将编译链接需要的库的名称都输入进来。
3. hello world
// ffmpeg_test_pro.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
extern "C"
{
#include "libavcodec/avcodec.h"
#include "include\libavcodec\version.h"
}
int _tmain(int argc, _TCHAR* argv[])
{
printf("device_version:%d",LIBAVCODEC_VERSION_INT);
getchar();
return 0;
}
- 编译报错1:
编译后报错了:提示找不到inttypes.h
,搜索是由于C99标准支持这个文件,但是一些编译器中不支持,需要手动把文件下载下来才行。
f:\ffmpeg\demo\ffmpeg_test_pro\ffmpeg_test_pro\include\libavutil\common.h(34): fatal error C1083: 无法打开包括文件:“inttypes.h”: No such file or directory
下载inttypes.h
,stdint.h
头文件即可,下载地址 https://download.csdn.net/download/armwind/10973359
1>f:\ffmpeg\demo\ffmpeg_test_pro\ffmpeg_test_pro\include\libavutil\common.h(30): fatal error C1189: #error : missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS
- 编译错误2:
上面的变异解决后,就报了一个宏没有定义的问题,google了一下,发现了答案。在vs中定义即可。
解决办法:(https://stackoverflow.com/questions/986426/what-do-stdc-limit-macros-and-stdc-constant-macros-mean)
__STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS are a workaround to allow C++ programs to use stdint.h macros specified in the C99 standard that aren’t in the C++ standard. The macros, such as UINT8_MAX, INT64_MIN, and INT32_C() may be defined already in C++ applications in other ways. To allow the user to decide if they want the macros defined as C99 does, many implementations require that __STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS be defined before stdint.h is included.
从上面可以发现,C++编译器如果想使用stdint.h,必须定义该宏。定义的地方在
- 运行结果
由此可以将(https://ffmpeg.zeranoe.com/builds/win64/dev/) 下载下来的demo运行一下了。^___^
- 编译错误3-拓展例程编译报错
在使用 https://ffmpeg.zeranoe.com/builds/win64/dev/ 例程中的muxing.c
(http://ffmpeg.org/doxygen/3.0/muxing_8c_source.html)进行编译时报了下面的错误:
1>f:\ffmpeg\demo\ffmpeg_muxter\ffmpeg_test_pro\include\libavutil\rational.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
1>f:\ffmpeg\demo\ffmpeg_muxter\ffmpeg_test_pro\include\libavutil\rational.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
1>f:\ffmpeg\demo\ffmpeg_muxter\ffmpeg_test_pro\include\libavutil\rational.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
1>f:\ffmpeg\demo\ffmpeg_muxter\ffmpeg_test_pro\include\libavutil\timestamp.h(30): fatal error C1189: #error : missing -D__STDC_FORMAT_MACROS / #define __STDC_FORMAT_MACROS
对应的代码:
#if defined(__cplusplus) && !defined(__STDC_FORMAT_MACROS) && !defined(PRId64)
#error missing -D__STDC_FORMAT_MACROS / #define __STDC_FORMAT_MACROS
#endif
由上面的定义可以看出,当定义了__cpluspus
时,且没有定义__STDC_FORMAT_MACROS
及PRId64
时就报错了。
这里由于问题出现在timestamp.h和判断是否定义PRId64
,可以想象的出根时间长度有关。
- 编译错误4-拓展例程编译报错
1>f:\ffmpeg\demo\ffmpeg_muxter\ffmpeg_test_pro\ffmpeg_test_pro.cpp(81): error C2143: 语法错误 : 缺少“)”(在“{”的前面)
1>f:\ffmpeg\demo\ffmpeg_muxter\ffmpeg_test_pro\ffmpeg_test_pro.cpp(81): error C2059: 语法错误:“)”
1>f:\ffmpeg\demo\ffmpeg_muxter\ffmpeg_test_pro\ffmpeg_test_pro.cpp(81): error C2143: 语法错误 : 缺少“)”(在“{”的前面)
1>f:\ffmpeg\demo\ffmpeg_muxter\ffmpeg_test_pro\ffmpeg_test_pro.cpp(81): error C2143: 语法错误 : 缺少“;”(在“{”的前面)
1>f:\ffmpeg\demo\ffmpeg_muxter\ffmpeg_test_pro\ffmpeg_test_pro.cpp(81): error C2143: 语法错误 : 缺少“;”(在“}”的前面)
1>f:\ffmpeg\demo\ffmpeg_muxter\ffmpeg_test_pro\ffmpeg_test_pro.cpp(81): error C2143: 语法错误 : 缺少“;”(在“,”的前面)
查看代码在这里
#define av_ts2timestr(ts, tb) av_ts_make_time_string((char[AV_TS_MAX_STRING_SIZE]){0}, ts, tb)
改成
char ts_buf[AV_TS_MAX_STRING_SIZE] = {0};
#define av_ts2timestr(ts, tb) av_ts_make_time_string(ts_buf, ts, tb)
VS2010中的C99不支持这样写,只能在外面重新定义一个缓存区。