Qt中使用ffmpeg--直接调用动态库 or 手动编译相关

介绍下在Qt下直接调用官方下载的动态库以及自己编译成静态库等,另外关于ffmpeg怎么用算LGPL谁知道的话求告知

直接使用动态库

官网下载

如果没有特殊要求,可以直接在ffmpeg官网下载编译好的库文件直接使用,自己编译还是相当麻烦的QAQ。选择自己操作系统相关的版本,下载shared和dev两个压缩包:

Qt中使用ffmpeg--直接调用动态库 or 手动编译相关_第1张图片
官网下载

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相关的头文件:


Qt中使用ffmpeg--直接调用动态库 or 手动编译相关_第2张图片
引用头文件

可能的问题

  • 最新的ffmpeg有把libfmx (使用intel的qsv硬编硬解,下面有说明) 编译进去,但是好像没有fmx的头文件,会报错。可以去这里下下来,放到ffmpeg的include目录下。
  • 编译没问题记得要把dev中的dll拷贝到生成的exe目录下,否则运行不起来。
  • 相关工程可以参考gayhub的demo。

自定义编译

官网下载的ffmpeg动态库编译的configure里有一条是--enable gpl,我们用的时候是直接用的动态库,我也不确定这算不算LGPL,实在没辙的话只能自己编译了。

Qt中使用ffmpeg--直接调用动态库 or 手动编译相关_第3张图片
license相关

IDE安装

本人安装的是Qt5.7.0的mingw32bit,下载地址戳我

msys2安装

因为要编译32bit的,下载选择msys2的32位版本,下载地址戳我
安装完成后找到msys2安装目录下的msys2_shell.cmd,将其中一行的注释去掉,使 MSYS2 的环境变量继承自系统:

Qt中使用ffmpeg--直接调用动态库 or 手动编译相关_第4张图片
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第一行指定的位置。
最后贴下各种文件的目录:


Qt中使用ffmpeg--直接调用动态库 or 手动编译相关_第5张图片
源码下载路径
Qt中使用ffmpeg--直接调用动态库 or 手动编译相关_第6张图片
ffmpeg添加的lib路径
Qt中使用ffmpeg--直接调用动态库 or 手动编译相关_第7张图片
ffmpeg 添加的include路径

可能的问题

  • 测试编译,没有把--enable gpl去掉,不确定去掉能不能编译哈,毕竟....x264是GPL的。
  • 编译好后的ffmpeg可以在Qt下正常使用qsv、nvenc编码,解码暂时没用到不确定。
  • 编译出来的ffmpeg.exe没法双击运行,提示无法定位程序输入点__gxx_personality_v0于动态链接库avcodec-58.dll上。
  • Nvidia的cuda硬解在mingw下貌似搞不了......相关问题

你可能感兴趣的:(Qt中使用ffmpeg--直接调用动态库 or 手动编译相关)