Qt 环境中FFmpeg安装
1 前言
最近有项目需求,需要使用FFmpeg,过程中踩了不少坑,分享给有需要的有缘人。
踩坑过程:本人因项目需求,在qt配置ffmpeg使用。因对其ffmpeg暂未涉及,在网上找了个样例,样例版本需求(qt5.12+ffmpeg4.2),配置完成之后,发现缺少ffmpeg,在ffmpeg官网下载了7.1.1(www.gyan.dev/ffmpeg/buil...%255Bhttps%3A%2F%2Fwww.gyan.dev%2Fffmpeg%2Fbuilds%2Fpackages%2Fffmpeg-7.1.1-full_build-shared.7z%255D%25EF%25BC%258C%25E9%2585%258D%25E7%25BD%25AE%25E5%25AE%258C%25E4%25B9%258B%25E5%2590%258E%25EF%25BC%258C%25E6%2589%258D%25E5%258F%2591%25E7%258E%25B0ffmpeg7.1.1%25E7%2589%2588%25E6%259C%25AC%25E4%25B8%258E4.2.2%25E7%2589%2588%25E6%259C%25AC%25E5%25B7%25AE%25E5%25BC%2582%25E5%25B7%25A8%25E5%25A4%25A7%25E3%2580%25824.2.2%25E4%25B8%25AD%25E7%259A%2584%25E4%25B8%2580%25E4%25BA%259B%25E5%2587%25BD%25E6%2595%25B0%25E5%2592%258C%25E5%259C%25A87.1.1%25E7%2589%2588%25E6%259C%25AC%25E4%25B8%25AD%25E5%25B7%25B2%25E8%25A2%25AB%25E5%2588%25A0%25E9%2599%25A4%25EF%25BC%258C%25E4%25B8%258D%25E7%2594%25B1%25E5%25BE%2597%25E9%2587%258D%25E6%2596%25B0%25E6%2589%25BE4.2.2%25E7%2589%2588%25E6%259C%25AC%25E3%2580%2582%25E6%2589%25BE%25E4%25BA%2586%25E5%258D%258A%25E5%25A4%25A9%25EF%25BC%258C%25E5%2585%25B6%25E4%25B8%25AD%25E8%25BF%2598%25E7%25BB%258F%25E5%258E%2586%25E4%25BA%2586%25E4%25BD%25BF%25E7%2594%25A8ubuntu22.04%25E4%25BB%25A5%25E5%258F%258Amsys2%25E7%25BC%2596%25E8%25AF%2591%25E6%25BA%2590%25E7%25A0%2581%25EF%25BC%258C%25E6%259C%2580%25E5%2590%258E%25E6%258A%25A5%25E4%25BA%2586%25E4%25B8%25A4%25E4%25B8%25AA%25E9%2594%2599%25E8%25AF%25AF%25E6%2597%25A0%25E6%25B3%2595%25E8%25A7%25A3%25E5%2586%25B3%25E3%2580%2582%25E4%25B8%25A4%25E4%25B8%25AA%25E9%2594%2599%25E8%25AF%25AF%25E5%25A6%2582%25E4%25B8%258B%25EF%25BC%259A "https://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-7.1.1-full_build-shared.7z)%5Bhttps://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-7.1.1-full_build-shared.7z%5D%EF%BC%8C%E9%85%8D%E7%BD%AE%E5%AE%8C%E4%B9%8B%E5%90%8E%EF%BC%8C%E6%89%8D%E5%8F%91%E7%8E%B0ffmpeg7.1.1%E7%89%88%E6%9C%AC%E4%B8%8E4.2.2%E7%89%88%E6%9C%AC%E5%B7%AE%E5%BC%82%E5%B7%A8%E5%A4%A7%E3%80%824.2.2%E4%B8%AD%E7%9A%84%E4%B8%80%E4%BA%9B%E5%87%BD%E6%95%B0%E5%92%8C%E5%9C%A87.1.1%E7%89%88%E6%9C%AC%E4%B8%AD%E5%B7%B2%E8%A2%AB%E5%88%A0%E9%99%A4%EF%BC%8C%E4%B8%8D%E7%94%B1%E5%BE%97%E9%87%8D%E6%96%B0%E6%89%BE4.2.2%E7%89%88%E6%9C%AC%E3%80%82%E6%89%BE%E4%BA%86%E5%8D%8A%E5%A4%A9%EF%BC%8C%E5%85%B6%E4%B8%AD%E8%BF%98%E7%BB%8F%E5%8E%86%E4%BA%86%E4%BD%BF%E7%94%A8ubuntu22.04%E4%BB%A5%E5%8F%8Amsys2%E7%BC%96%E8%AF%91%E6%BA%90%E7%A0%81%EF%BC%8C%E6%9C%80%E5%90%8E%E6%8A%A5%E4%BA%86%E4%B8%A4%E4%B8%AA%E9%94%99%E8%AF%AF%E6%97%A0%E6%B3%95%E8%A7%A3%E5%86%B3%E3%80%82%E4%B8%A4%E4%B8%AA%E9%94%99%E8%AF%AF%E5%A6%82%E4%B8%8B%EF%BC%9A")
-
问题1
c++xxx\thirdpart\ffmpeg-4.2.2-win64-dev\include\libavutil\timestamp.h:30: error: #error missing -D__STDC_FORMAT_MACROS / #define __STDC_FORMAT_MACROS #error missing -D__STDC_FORMAT_MACROS / #define __STDC_FORMAT_MACROS ^~~~~ -
问题2
c++xxx\thirdpart\ffmpeg-4.2.2-win64-dev\include\libavutil\timestamp.h:46: error: expected ')' before 'PRId64' else snprintf(buf, AV_TS_MAX_STRING_SIZE, "%" PRId64, ts); ^~~~~~
其中FFmpeg的环境目录以及.pro工程如下:
.pro
c++
INCLUDEPATH += $$PWD/thirdpart/ffmpeg-4.2.2-win64-dev/include
DEPENDPATH += $$PWD/thirdpart/ffmpeg-4.2.2-win64-dev/include
LIBS += -L$$PWD/thirdpart/ffmpeg-4.2.2-win64-dev/lib -lavcodec -lavdevice -lavfilter -lavformat -lavutil -lpostproc -lswresample -lswscale
有问题的引用目录:
c++
extern "C"
{
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <inttypes.h>
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavformat/avio.h"
#include "libswscale/swscale.h"
#include "libswresample/swresample.h"
#include "libavutil/avassert.h"
#include "libavutil/channel_layout.h"
#include "libavutil/opt.h"
#include "libavutil/mathematics.h"
#include "libavutil/timestamp.h"
#include "libavutil/common.h"
}
文件架构:
text
project-name/
│
├── App/
│ ├── ....h
│ └── ....c
│
├── thiredpart/ffmpeg-4.2.2-win64-dev/
│ ├── include
│ └── lib
│
├── mianwindow.h
├── mainwindow.c
└── main.c
这两个问题在中网上找了不少答案,做法大致相同。
-
问题1解答
在
timestamp.h文件中增加定义\#define __STDC_FORMAT_MACROS。 -
问题2解答
包含头文件
<inttypes.h>
前期未识别到问题根源来源一直,分开查找的过程中遇到的解答基本是以上两个解答的集合("包含头文件<inttypes.h>、增加定义\#define __STDC_FORMAT_MACROS。")
但是这两个问题均未解决我的问题。
这里也分享各位,各取所需。
- windows下在QT里调用ffmpeg库处理音频视频数据时,出现error missing -D__STDC_FORMAT_MACROS 错误的解决方法(MINGW32编译器)。(https://cloud.tencent.com/developer/article/1932850)
- bug解决: ffmpeg 在window下使用 PRId64 报错(https://blog.csdn.net/p942005405/article/details/124418756)
2 问题解决
再次强调我的版本,FFmpeg版本很重要(不同版本之间存在不兼容情况,尤其是跨版本)
- QT : 5.14.2
- FFmpeg : 4.2.2
解决思路
未便面不必要的问题,处理措施是将所有引用的c标准库文件均替换成cxx,例如将#include <stdlib.c>替换成#include <cstdlib>,核心问题主要是#include <inttypes.h>和#include <cinttypes>存在差异。
正确的引用如下:
c++
extern "C"
{
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cinttypes>
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavformat/avio.h"
#include "libswscale/swscale.h"
#include "libswresample/swresample.h"
#include "libavutil/avassert.h"
#include "libavutil/channel_layout.h"
#include "libavutil/opt.h"
#include "libavutil/mathematics.h"
#include "libavutil/timestamp.h"
#include "libavutil/common.h"
}
3 相关链接
本人在查找FFmpeg的静态库过程中,也是费时费力,甚至动用编译源码的思路。有的库只包含.exe可执行文件,缺少静态、动态库;有的缺少动态库。在查找某些网站的过程中,给了链接,但是链接到非法网站我也是服了。以下是比较齐全的库: