1:配置ffmpeg,使window是终端可以识别到ffplay, ffmpeg工具 使用ffplay xxx.mp4 -x 800 -y 400 进行测试
2:把需要的dll文件拷贝到qt的项目库下,编译调试qt可以成功。 可以用ldd命令查看依赖的dll
3:如何配置ffmpeg的dll路径,使qt可以新建项目自动识别到?
4:用动态库的时候,需要相关的dll进行链接才能debug,静态库好像也有个dll?
1:windows下命令行环境搭建
获取对应的ffmpeg并安装
1:获取ffmpeg需要的包:
从ffmpeg官网进行下载:http://ffmpeg.org/
选择windows,这里选择第一个:
这里我选择zip进行下载,好像下载的是static的库,可以试试其他的:
2:配置环境变量。
**方案1: **
===》建议采用这种方案,后面qt调试不会有问题
解压shared.zip,把bin目录对应的可执⾏⽂件拷贝到C:\Windows (ffmpeg.exe ffplay.exe ffprobe.exe)
动态链接库拷贝到C:\Windows\SysWOW64 (avcodec-58.dll avdevice-58.dll avfilter-7.dll avformat-58.dll
avutil-56.dll postproc-55.dll swresample-3.dll swscale-5.dll)
描述:WoW64 (Windows On Windows64 )是⼀个Windows操作系统的⼦系统,被设计⽤来处理许多在32-bit Windows和64-bit Windows之间的不同的问题,使得可以在64-bit Windows中运⾏32-bit程序。)
方案2:
==》ERROR :这种方案虽然能识别到ffmpeg,但是在qt调试时,会发现无法运行,因为可执行文件依赖的一些dll会报找不到!!!
直接把对应的bin目录增加到环境变量中,shared或者static都行:
如,我的bin目录:
添加到环境变量中:
进行测试,在cmd终端下执行ffmpeg -version验证:
2:安装必要的工具(vs2015和qt)
1: 安装vs2015
1:下载
从第三方下载:http://www.xz7.com/downinfo/202013.html
获取到的文件:vs2015.ent_chs
2:安装
直接双击打开进行安装:
选择需要的一些必备组件,这个可能需要一定的耗时:
注意选择Visual C++相关组件和通用windows相关组件
安装完成后进行简单的测试,可以加断点进行调试。
3:设置环境变量
vs安装目录下的\VC\bin
2:安装qt
1: 下载:
这里使用5.12.0版本
http://download.qt.io/official_releases/qt/5.10/5.12.0/
2:下载的程序直接进行双击安装(exe为windows上的,run为linux中对应的)
3:选择必要的组件,这里
可能需要注册一个账号,注册一个就好。
选择必要的组件:(我这里环境装的是vs2015的)
在安装过程中有报错或者使用过程中有报错,可以百度自行解决,这里遇到过的报错解决方案是
需要自行安装strawberry-perl
4:用qt新建项目进行测试(断点调试查看信息)
参考下一步。
这里发现,使用MinGw 是没有问题的,但是MSVC2015 32/64都是有问题的,需要安装cdb。
注意:这里遇到一个问题: 无法运行“rc.exe“
==》这应该是最近对vs进行修改或者环境变量变了导致的,修改环境变量或者把该文件拷贝到
在sdk包目录下,sdk 10/8.1找到rc.exe 和 rcdll.dll ,拷贝到自己的vs2015安装目录下对应的/vc/bin
如,我刚装的路径 :C:\Program Files (x86)\Windows Kits\8.1\bin\x86下找到rc.exe 和 rcdll.dll,拷贝到如下:
3:安装cdb调试工具(qt调试用)
CDB(command line debugger)是给控制台调试代码用的,CDB是WinDbg的小兄弟。
因为MSVC用的调试器是C:\Windows\System32\vsjitdebugger.exe,所以安装Visual Studio是没有cdb的。
必须从WDK里面安装Debugging Tools for Windows。
可以参考链接:https://www.cnblogs.com/lixuejian/p/12915174.html
安装完成后,在C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x86路径下可以找到cdb.exe和gdb.exe。
1:获取cdb安装包:
这里的安装包是从sdk中进行提取,只安装Debugging Tools for Windows选项!
这里用的vs2015, 调试的时候发现有问题,选择了SDK 8.1的包进行安装
https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugger-download-tools
2:单击下载下来的exe进行安装,只安装“Debugging Tools for Windows”选项
3:在qt环境中进行查看测试:
在工具==》选项目录下查看,发现没有异常的提示,然后断点debug也能看到相关调试信息:
4:其他:
为什么安装CDB编调试器?
(1)Kits页面显示QtCreator可用的编译工具,在图中可以看到有3个编译工具可用。
(2)Qt Versions页面显示安装的Qt版本,有Qt 5.9.1MinGW 32bit、Qt 5.9.1MSVC201532bit和Qt 5.9.1MSVC201564bit3个可用的版本。
(3)Compliers页面显示系统里可用的C和C++编译器,由于安装了MinGW和Visual Studio2015,Qt Creator会自动检测出这些编译器。
(4)Debuggers页面显示Qt Creator自动检测到的调试器,有GNU gdb for MinGW调试器和Windows的CDB调试器。
注意: 如果只是在计算机上安装了Visual Studio2015,显示的界面上MSVC2015的两个编译器的图标会变为带有感叹号的一个黄色图标。Debuggers页面没有Windows的CDB调试器,可以用MSVC编译器对Qt Creator编写的程序进行编译,但是不能调试,这是因为缺少了Windows Software Development Kit(SDK)。这个SDK不会随Visual Studio一同安装, 需要从Microsoft网站上下载。可以下载Windows SoftwareDevelopment Kit(SDK)for Windows8.1,安装后重启计算机即可。
4:qt进行ffmpeg测试
1:新建qt项目。
2:将相关的依赖库拷贝到qt项目目录下,如图:
3:修改pro配置文件,添加测试需要的依赖相关lib和头文件。
TEMPLATE = app CONFIG += console CONFIG -= app_bundle CONFIG -= qt SOURCES += main.c win32 { INCLUDEPATH += $$PWD/ffmpeg-4.2.1-win32-dev/include LIBS += $$PWD/ffmpeg-4.2.1-win32-dev/lib/avformat.lib \ $$PWD/ffmpeg-4.2.1-win32-dev/lib/avcodec.lib \ $$PWD/ffmpeg-4.2.1-win32-dev/lib/avdevice.lib \ $$PWD/ffmpeg-4.2.1-win32-dev/lib/avfilter.lib \ $$PWD/ffmpeg-4.2.1-win32-dev/lib/avutil.lib \ $$PWD/ffmpeg-4.2.1-win32-dev/lib/postproc.lib \ $$PWD/ffmpeg-4.2.1-win32-dev/lib/swresample.lib \ $$PWD/ffmpeg-4.2.1-win32-dev/lib/swscale.lib }
4: 修改测试代码,对ffmpeg的接口进行测试。
5:调试查看结果,如果有问题,请排查pro文件,如果不能debug,请参考上文,或者需要的ffmpeg相关库没有拷全。
#include <stdio.h> #include "libavutil/avutil.h" int main() { printf("Hello World!\n"); printf("Hello FFMPEG, version is %s\n", av_version_info()); return 0; }
6:查看运行结果
5:MSYS2安装及换源(shell命令行开发环境)
1:MSYS2提供了bash shell等linux环境、版本控制软件(git/hg)和MinGW-w64 ⼯具链.
==》这里我们用来编译ffmpeg,可以编译出适合自己的功能。
2:下载MSY2:
3:安装msys2,直接傻瓜式安装,我的安装目录E:\audioplaytools\msys2。(注意:安装完先不要点击运行)。
4:修改配置,把vs的环境继承给msys2
修改配置文件 msys2_shell.cmd,把rem set MSYS2_PATH_TYPE=inherit 修改为 set MSYS2_PATH_TYPE=inherit
5:描述: 一般选择MinGW-w64进行编译
MSYS2可以选择msys或者MinGW-w64环境来编译,不过在msys下使⽤gcc编译出来的exe和dll依赖msys-2.0.dll,⽽MinGW-w64下编译出来的⽂件不需要依赖这个dll,从程序的运⾏效率来看,不依赖这个dll的程序的效率应该更⾼。所以选择MinGW-w64来编译更佳。
6:更改pacman的源==》(MSYS2中的软件包管理工具,更行国内源)
编辑 /etc/pacman.d/mirrorlist.mingw32 ,在⽂件开头添加:
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686/ Server = http://mirrors.ustc.edu.cn/msys2/mingw/i686/
编辑 /etc/pacman.d/mirrorlist.mingw64 ,在⽂件开头添加:
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64/ Server = http://mirrors.ustc.edu.cn/msys2/mingw/x86_64/
编辑 /etc/pacman.d/mirrorlist.msys ,在⽂件开头添加:
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch/ Server = http://mirrors.ustc.edu.cn/msys2/msys/$arch/
7: 启动命令行对应的命令,在对应的目录打开cmd
msys2_shell.cmd -mingw64 #打开64位的窗口 msys2_shell.cmd #打开32位的窗口
8: pacman更新源
pacman -Sy
9:如果配置环境变量? ==》暂时没有测试
6:MSYS2安装必要的工具
1: gcc编译器等的安装:
1:MSYS2 自带的开发环境(安装包msys2-devel) 或者MinGW-w64
MSYS2 自带的开发环境 :可执行文件要依赖于 msys-2.0.dll(提供了 Linux 下编程的函数和接口,例如 fork 函数) ==》适用于编译linux下的软件
MinGW-w64: 不再依赖于 msys-2.0.dll,适用于源代码基于 windows 开发,前提是不使用linux POSIX的接口。
2:安装MinGW-w64
暂时用msys2_shell.cmd -mingw64打开64位终端,执行安装命令:
pacman -S mingw-w64-x86_64-toolchain
3:暂时不安装msys2自带的编译器:
pacman -S msys2-devel pacman -S make gcc diffutils pkg-config
4:安装git,make等工具
pacman -S git pacman -S make pacman -S automake pacman -S autoconf pacman -S perl pacman -S libtool pacman -S mingw-w64-i686-cmake pacman -S pkg-config #如果需要编译出ffplayer的话,还需要安装SDL pacman -S mingw-w64-x86_64-SDL2
2: 防止与MVSC冲突,重命名link.exe
重命名 msys64/usr/bin/link.exe 为 msys64/usr/bin/link.bak
3:查看当前已经安装的软件
XA-146@DESKTOP-4RQJ6M3 MINGW64 /usr/bin $ which cl cpp /e/audioplaytools/vs2015/VC/bin/cl /mingw64/bin/cpp
7:用MSYS2编译第三方库及ffmpeg
1:安装yasm(汇编用)
pacman -S yasm
2:安装nasm(最新x264用,也是汇编相关)
pacman -S nasm
3:下载和编译x264,
准备相关目录,将源码放在/home/XA-146/code 编译生成的文件放在/home/XA-146/code/build中。
git clone http://git.videolan.org/git/x264.git 或者码云下载 git clone https://gitee.com/mirrors_addons/x264.git ./configure --prefix=/home/XA-146/code/build/libx264 --host=x86_64-w64-mingw32 --enable-static --extra-ldflags=-Wl,--output-def=libx264.def make make install
生成libx264.lib
没有包含lib⽂件,需要⾃⼰⼿⼯⽣成。 需要用的时候要用到lib和对应的dll文件。
#需要在编译的时候加上: --enable-shared 注意一定要修改到自己编译路径 ./configure --prefix=/home/XA-146/code/build/libx264 --host=x86_64-w64-mingw32 --enable-shared --enable-static --extra-ldflags=-Wl,--output-def=libx264.def make make install cp ./libx264.def /home/XA-146/code/build/libx264/lib/ cd /home/XA-146/code/build/libx264/lib #若要生成64位lib文件则输⼊如下命令: lib /machine:X64 /def:libx264.def #若要生成32位lib文件则输⼊如下命令: lib /machine:i386 /def:libx264.def
这里生成的是64位的lib,查看并介绍使用方法: ==>这里待验证,因为没有配置–enable-shared
查看相关信息及lib命令:
XA-146@DESKTOP-4RQJ6M3 MINGW64 ~/code/build/libx264/lib $ ls libx264.a libx264.def libx264.dll.a libx264.exp libx264.lib pkgconfig XA-146@DESKTOP-4RQJ6M3 MINGW64 ~/code/build/libx264/bin $ ls libx264-163.dll x264.exe
即得到libx264.lib,然后将/home/XA-146/code/build/libx264/bin/libx264-161.dll (具体名字和x264版本有关)改名或者复制⼀份为libx264.dll
使用: 将include中的.h头⽂件、libx264.lib和libx264.dll复制到项⽬中对应位置。
附下载地址:https://www.videolan.org/developers/x264.html
4:下载和编译fdk-aac
git clone --depth 1 https://gitee.com/mirrors/fdk-aac.git cd fdk-aac ./autogen.sh ./configure --prefix=/home/XA-146/code/build/libfdk-aac --enable-static --enable-shared make -j4 make install
附下载地址:https://sourceforge.net/projects/opencore-amr/files/fdk-aac/
5:下载编译mp3:
git clone --depth 1 https://gitee.com/hqiu/lame.git cd lame ./configure --prefix=/home/XA-146/code/build/libmp3lame --disable-shared --disable-frontend --enable-static make make install
有时候ffmpeg会编译报错,需要下载版本>= 3.98.3
libmp3lame下载: https://sourceforge.net/projects/lame/files/lame/
6:下载编译libvpx
git clone --depth 1 https://github.com/webmproject/libvpx.git cd libvpx ./configure --prefix=/home/XA-146/code/build/libvpx --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm make -j4 make install
7:下载和安装ffmepg
git clone git://source.ffmpeg.org/ffmpeg.git #或者: git clone https://gitee.com/mirrors/ffmpeg.git cd ffmpeg #查看选择版本 git branch -a git checkout remotes/origin/release/4.2 #配置命令 注意路径的正确性 注意\后好像不能有空格 ./configure --prefix=/home/XA-146/code/build/ffmepg-4.2 \ --arch=x86_64 \ --enable-shared \ --enable-gpl \ --enable-libfdk-aac \ --enable-nonfree \ --enable-libvpx \ --enable-libx264 \ --enable-libmp3lame \ --extra-cflags="-I/home/XA-146/code/build/libfdk-aac/include" \ --extra-ldflags="-L/home/XA-146/code/build/libfdk-aac/lib" \ --extra-cflags="-I/home/XA-146/code/build/libvpx/include" \ --extra-ldflags="-L/home/XA-146/code/build/libvpx/lib" \ --extra-cflags="-I/home/XA-146/code/build/libx264/include" \ --extra-ldflags="-L/home/XA-146/code/build/libx264/lib" \ --extra-cflags="-I/home/XA-146/code/build/libmp3lame/include" \ --extra-ldflags="-L/home/XA-146/code/build/libmp3lame/lib" make -j8 make install
8:qt使用MSVC2015 64bit调用测试我们的ffmpeg库
1: 新建qt项目文件
2:拷贝生成的ffmpeg文件夹到项目文件下
3:修改qt配置文件以及测试代码:
修改项目pro文件:
TEMPLATE = app CONFIG += console CONFIG -= app_bundle CONFIG -= qt SOURCES += main.c INCLUDEPATH += \ $$PWD/ffmepg-4.2/include LIBS += $$PWD/ffmepg-4.2/bin/avformat.lib \ $$PWD/ffmepg-4.2/bin/avcodec.lib \ $$PWD/ffmepg-4.2/bin/avdevice.lib \ $$PWD/ffmepg-4.2/bin/avfilter.lib \ $$PWD/ffmepg-4.2/bin/avutil.lib \ $$PWD/ffmepg-4.2/bin/swresample.lib \ $$PWD/ffmepg-4.2/bin/swscale.lib
修改main.c文件
#include <stdio.h> #include "libavutil/avutil.h" int main() { printf("Hello World!\n"); printf("Hello FFMPEG, version is %s\n", av_version_info()); return 0; }
4:测试运行,因为我们生成的ffmpeg是64位,这一用msvc 64进行测试,同时遇到问题:无法运行rc.exe
qt安装目录: E:\audioplaytools\Qt\Qt5.10.1\5.10.1 下对应32和64的版本bin中,
vs2015的安装目录下: E:\audioplaytools\vs2015\VC\bin
从计算机c盘C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64找到rc.exe和rxdll.dll拷贝到上面的目录中测试。
5:报错:The CDB process terminated. ==>这是因为ffmpeg缺内容导致。
解决方案,可以在windows环境下双机ffplay.exe 或者ffmpeg.exe查看启动情况,用everything把需要的dll进行拷贝。
也可以用ldd,或者dumpbin的方式进行查看exe,然后获取对应的dll进行拷贝。
6:在双击ffplay.exe时遇到“应用程序无法正常启动(0x000007b)”
===》网上搜索方法都没有解决,是不是与ffmpeg的32位和64位有关。
据说是Visual C++
运行库没有安装或者不是最新版本。
==》确定问题是依赖的dll不存在或者依赖的错误。
转换问题: 确定exe执行时需要依赖的dll有哪些。
可以在windows cmd下用dumpbin ffmpeg.exe查看ffmpeg对应的版本。
直接在msys2环境下测试ffplay,发现可以使用~
可以在msys2通过ldd命令查看exe依赖的链接,然后把非环境变量下的dll拷贝到当前的目录,下面是我拷贝后的查看:
7:终于解决了,qt测试成功。
1:把编译后生成的ffmepg-4.2,拷贝到项目目录下,给头文件和lib做依赖用。
2:编译依然会报错, “The CDB process terminated”,把上面拷贝的dll,放在qt对应项目生成的debug目录下,进行debug测试。
3:注意如果不成功,清除一下debug目录下除拷贝dll的其他文件。
8:MinGW与MSVC编译的区别
MSVC是指微软的VC编译器,需要安装微软的VS软件,若是感觉软件⽐较庞⼤,可以安装visualcppbuildtools_full,不过也很⼤哈
MinGW是指是Minimalist GNU on Windows的缩写。它是⼀个可⾃由使⽤和⾃由发布的Windows特定头⽂件和使⽤GNU⼯具集导⼊库的集合,允许你在GNU/Linux和Windows平台⽣成本地的Windows程序⽽不需要第三⽅C运⾏时库。感觉跨平台型更好呢。
设置环境变量继承⾃Windows:找到msys2_shell.cmd中的rem set MSYS2_PATH_TYPE=inherit去掉rem,取消这⼀句的注释,使MSYS2的环境变量继承⾃系统
9:注意.
qt项目一定不要有中文路径。
在进行测试的时候发现,用MSVC32进行编译项目的时候,报错一些linux上的头文件找不到,比如:
用everything进行全局搜索,查看相关文件:
发现已有环境中,msys2和mingw中才会有该头文件,我就在犹豫和纠结如何通过链接头文件以及动态库的方式使用时,通过百度,咨询,最终可行性处理方案和自己的理解:
qt使用MSVC 或者mingw进行编译,
msvc,适用于只开发windows环境上的软件使用,要处理上述问题:
1:使用pthread-win32,自行链接头文件和lib
2:修改代码,使用windows thread 相关api
mingw,主要用于跨平台开发,需要的一些第三方库也必须时mingw编译生成的。
1: 主要适用于跨平台应用程序开发
pthread.h实际上时linux环境上的相关头文件,可以直接使用mingw cygwin wsl等进行编译
思考总结
使用msvc32,可以在windows环境上使用qt进行调试。
使用mingw,涉及跨平台相关的软件开发时,可以进行调试。