Qt中使用ffmpeg--直接调用动态库 or 手动编译相关
介绍下在Qt下直接调用官方下载的动态库以及自己编译成静态库等,另外关于ffmpeg怎么用算LGPL谁知道的话求告知
直接使用动态库
官网下载
如果没有特殊要求,可以直接在ffmpeg官网下载编译好的库文件直接使用,自己编译还是相当麻烦的QAQ。选择自己操作系统相关的版本,下载shared和dev两个压缩包:
Static包含的是静态编译的ffmpeg.exe,Shared包含的是ffmpeg的动态库及ffmpeg.exe,Dev中包含的是加入到工程中的lib(使用的时候还是要添加动态库才能运行)。
添加到工程
在pro文件中加上对应的libs,添加lib的时候不用写后缀名字:
-L$$SDKs/ffmpeg/lib -L$$SDKs/ffmpeg/bin -lavutil -lavformat -lavcodec -lswscale -lavdevice -lswresample
在要使用的文件中引用ffmpeg相关的头文件:
引用头文件
可能的问题
- 最新的ffmpeg有把libfmx (使用intel的qsv硬编硬解,下面有说明) 编译进去,但是好像没有fmx的头文件,会报错。可以去这里下下来,放到ffmpeg的include目录下。
- 编译没问题记得要把dev中的dll拷贝到生成的exe目录下,否则运行不起来。
- 相关工程可以参考gayhub的demo。
自定义编译
官网下载的ffmpeg动态库编译的configure里有一条是--enable gpl
,我们用的时候是直接用的动态库,我也不确定这算不算LGPL,实在没辙的话只能自己编译了。
IDE安装
本人安装的是Qt5.7.0的mingw32bit,下载地址戳我
msys2安装
因为要编译32bit的,下载选择msys2的32位版本,下载地址戳我
安装完成后找到msys2安装目录下的msys2_shell.cmd,将其中一行的注释去掉:
打开Qt的命令行工具,将目录切换到msys2的安装目录下,输入:msys2_shell.cmd -mingw32
msys2就打开了,下一步是安装相关的软件包。
软件包安装
在msys2中的包管理工具是pacman,安装命令如下:
pacman -S make
pacman -S pkg-config
pacman -S nasm
pacman -S git
pacman -S automake autoconf perl libtool
软编(编译libx264,这货是GPL的哈)
先下载源码,git clone http://git.videolan.org/git/x264.git
,切换到x264仓库目录下:
./configure \
--prefix=/usr/local \
--enable-shared \
--disable-cli
(loading...)
./make -j$(nproc)
(loading...)
make install
(loading...)
硬编intel qsv准备
需要libmfx库 ,下载源码,git clone https://github.com/lu-zero/mfx_dispatch.git
,切换到对应目录下:
autoreconf -i
(loading...)
./configure --prefix=/usr/local
(loading...)
make -j$(nproc)
(loading...)
make install
(loading...)
硬编Nvidia nvenc准备
添加nvidia codec头文件,git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
,切换到目录下:
make
make install
NVidia Video Codec SDK下载,下载地址戳我, 解压后把里面的NvCodec下的库文件拷贝到/usr/local/lib、头文件拷贝到/usr/local/include下
编译ffmpeg
下载ffmpeg源码,git clone https://git.ffmpeg.org/ffmpeg.git
,切换到对应目录下:
PKG_CONFIG_PATH="/usr/local/lib/pkgconfig"
./configure \
--prefix=/usr/local/ffmpeg \
--disable-static \
--enable-shared \
--enable-gpl \
--target-os=mingw32 \
--enable-libx264 \
--enable-libmfx \
--enable-encoder=h264_qsv \
--enable-decoder=h264_qsv \
--enable-nvenc \
--enable-cuda \
--enable-cuvid \
--enable-nonfree \
--extra-cflags=-I/usr/local/include \
--extra-ldflags=-L/usr/local/lib
(loading...)
make -j$(nproc)
(loading...)
make install
(loading...)
编译好后的ffmpeg在/usr/local/ffmpeg,就是configure第一行指定的位置。
最后贴下各种文件的目录:
源码下载路径 ffmpeg添加的lib路径 ffmpeg 添加的include路径
可能的问题
- 测试编译,没有把--enable gpl去掉,不确定去掉能不能编译哈,毕竟....x264是GPL的。
- 编译好后的ffmpeg可以在Qt下正常使用qsv、nvenc编码,解码暂时没用到不确定。
- 编译出来的ffmpeg.exe没法双击运行,提示无法定位程序输入点__gxx_personality_v0于动态链接库avcodec-58.dll上。
- Nvidia的cuda硬解在mingw下貌似搞不了......相关问题