异想天开

What's the true meaning of light, Could you tell me why

windows环境使用ffmpeg库历经的坑

日期:2019-03-17 20:29:00
  
最后更新日期:2019-06-12 19:39:10
年前的时候,写一个qt程序,当时发现qt上面不支持视频的播放,就先将视频转为gif,然后窗口上面直接输出gif图。这次从ffmpeg官网下载了开发库,测试一把api模式。

1. 下载好ffmpeg开发包

2. 配置vs链接库目录和头文件目录
配置vs头文件目录和库目录
3. 编译过程遇到的问题
ffmpeg是c库,所以引入它的头文件的时候,用extern c包含进来。
[code lang="cpp"]
#define __STDC_CONSTANT_MACROS
extern "C" {
#include "libavutil/avutil.h"
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavformat/avio.h"
#include "libavutil/file.h"
#include "libavutil/imgutils.h"
#include "libswscale/swscale.h"
}
[/code]
编译宏引入库
[code lang="cpp"]
#pragma comment(lib,"avcodec.lib")
#pragma comment(lib,"avdevice.lib")
#pragma comment(lib,"avfilter.lib")
#pragma comment(lib,"avformat.lib")
#pragma comment(lib,"avutil.lib")
#pragma comment(lib,"swscale.lib")
[/code]

问题一:
错误:C1083: 无法打开包括文件:“stdint.h”: No such file or directory
错误:C1083: 无法打开包括文件:“inttypes.h”: No such file or directory
这两个头文件是定义的跨平台的整形定义,可以从网上下载不会影响。
https://code.google.com/archive/p/msinttypes/downloads

问题二:
error LNK2019: 无法解析的外部符号 _av_dict_set,该符号在函数 "int __cdecl test_encode(int,char * * const)" (?test_encode@@YAHHQAPAD@Z) 中被引用
error LNK2019: 无法解析的外部符号 _avformat_new_stream,该符号在函数 "int __cdecl test_encode(int,char * * const)" (?test_encode@@YAHHQAPAD@Z) 中被引用
error LNK2019: 无法解析的外部符号 _avio_open,该符号在函数 "int __cdecl test_encode(int,char * * const)" (?test_encode@@YAHHQAPAD@Z) 中被引用
诸如此类的链接错误,开始还纳闷了,怎么明明链接了库,还会报链接错误。莫非IDE使用不对。 使用vc命令行手动编译和链接了一下也还是一样的报链接错误。于是想到查看库里面的符号,倒要看看这个函数有在库里面没有。方法如下:
[code lang="cpp"]
dumpbin /SYMBOLS ffmpeg\lib\avcodec.lib > .\1.txt
[/code]
通过查看符号,发现有av_dict_set符号,那奇怪了。继续查看header部分
[code lang="cpp"]
dumpbin /HEADERS avcodec.lib
部分显示:
FILE HEADER VALUES
8664 machine (x64)
6 number of sections
0 time date stamp Thu Jan 01 08:00:00 1970
124 file pointer to symbol table
F number of symbols
0 size of optional header
5 characteristics
Relocations stripped
Line numbers stripped

[/code]
看到这里明白了,应该是库不对。32位程序链接64位库。测试发现已经安装的vs2008只支持32位程序,不能编译64位的。 原因找了,第一次下载了64位的库,当时认为是64位系统,解决就自然的事,换成32位的,编译没啥问题了。

问题三:
使用开发库的examples里面的decode_video.c测试,如下问题:
Invalid frame dimensions 0x0
后面近大牛指导,测试demuxing_video.c,简单修改下和注释掉一些接口可以验证编码部分。