ffmpeg学习之-初步认识及windows环境搭建

感兴趣可以加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_MACROSPRId64时就报错了。
这里由于问题出现在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不支持这样写,只能在外面重新定义一个缓存区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值