仅仅时把自己过程中遇到的稍微阻塞疑惑问题做出整理,疑惑的是拿到的ffmpeg包中没有dll文件,导致自己研究了一系列。
使用qt加载音视频ffmpeg对应的相关lib库,进行接口,源码的研究。
1:使用源码安装的方式获取相关的动态库。
2:可以从ffmpeg官网,或者github库中安装对应的release版本(不同的版本之间有差异,只是安装环境/供调试用自己参考取对应的包)。
官网中,选择windows对应的版本:这里调试用,一般选shared. http://ffmpeg.org/ 下载可以参考FFmpeg windows下载安装_luoyayun361的博客-CSDN博客
github中,可以在对应的release构建中看到对应版本,这里可以选择对应版本的shared版本下载:https://github.com/GyanD/codexffmpeg/releases
目标:研究源码前,获取需要的ffmpeg相关依赖库:
1:前面有过文章是在windows上用msys2源码编译ffmpeg,直接使用编译后生成的相关库。
2:这里直接获取ffmpeng相关lib库,直接使用。
(注意,这里qt项目中pro文件中依赖了lib文件,相关的dll文件在运行时也是需要的,不然执行没有啥结果,以及输出窗口:退出,退出代码: -1073741515)
===》bin目录下相关exe文件为ffmpeg,ffplay,ffproble可执行文件,配置环境变量一般为该目录。
===》bin目录下相关dll文件,实际存储相关代码信息,exe文件执行时实际调用该类型文件对应内容。
=======》相关exe的执行,实际还是调用对应dll中的内容。
#如,查看ffmepeg.exe依赖的相关dll
#也能看到dll中相关依赖dll以及对应函数
C:\Users\yun68\Desktop\ffmpeg_build\ffmpeg-5.1.2-full_build-shared\bin>dumpbin -imports avcodec-59.dll
C:\Users\yun68\Desktop\ffmpeg_build\ffmpeg-5.1.2-full_build-shared\bin>dumpbin /dependents ffmpeg.exe
Microsoft (R) COFF/PE Dumper Version 14.29.30148.0
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file ffmpeg.exe
File Type: EXECUTABLE IMAGE
Image has the following dependencies:
KERNEL32.dll
msvcrt.dll
SHELL32.dll
avcodec-59.dll
avdevice-59.dll
avfilter-8.dll
avformat-59.dll
avutil-57.dll
postproc-56.dll
swresample-4.dll
swscale-6.dll
Summary
1000 .CRT
1000 .bss
1000 .data
5000 .idata
2000 .pdata
F000 .rdata
1000 .reloc
1000 .rsrc
3F000 .text
1000 .tls
2000 .xdata
C:\Users\yun68\Desktop\ffmpeg_build\ffmpeg-5.1.2-full_build-shared\bin>
===》相关.lib文件(lib导入库),编译时使用,lib中的代码会被编译到目标exe当中
===》dll是动态库,在运行时使用,dll中的代码不参与编译,而是运行期间,到对应的dll文件当中去查找函数
=======》编译时,使用lib库进行依赖就没有问题了,但是运行时,需要把对应的dll能识别到。
注意:这里在研究好久后才知道,lib库分为一个静态库,包含代码的所有信息;一个lib导入库,只是描述了dll中相关信息,运行时需要依赖dll 参考:lib库知识全面讲解(.lib、.dll)_zxmyoung的博客-CSDN博客
.dll.a类型文件是MinGW下的DLL文件的imp-lib,即与MSVS下DLL文件附带了一个引入库.lib类似。
====》1:qt下编译用MinGW构建,可以依赖.dll.a文件,但是运行时还是得能找到相关dll文件
====》2:qt也支持直接依赖dll,依赖lib,所以,.dll.a类型文件就不关注了,可能用MinGW生成相关动态库时需要关注。
===》新建一个qt项目,关联相关依赖,在.pro文件中如下依赖,使用相关头文件和函数。
=======》(因为遇到代码执行时没反应,退出,退出代码: -1073741515 {1 ?} {2?} 研究环境耗时,所以做笔记)
# $$PWD 代表的是项目的目录 ffmpeg-5.1.2是把上面下载的包拷贝到项目目录下了
# 经过测试,下面这两种依赖方式都可行 我测试了 MinGw 64和msvc-2019 64两种 编译都没问题
#win32 {
#INCLUDEPATH += $$PWD/ffmpeg-5.1.2/include
#LIBS += $$PWD/ffmpeg-5.1.2/lib/avformat.lib \
# $$PWD/ffmpeg-5.1.2/lib/avcodec.lib \
# $$PWD/ffmpeg-5.1.2/lib/avdevice.lib \
# $$PWD/ffmpeg-5.1.2/lib/avfilter.lib \
# $$PWD/ffmpeg-5.1.2/lib/avutil.lib \
# $$PWD/ffmpeg-5.1.2/lib/postproc.lib \
# $$PWD/ffmpeg-5.1.2/lib/swresample.lib \
# $$PWD/ffmpeg-5.1.2/lib/swscale.lib
#}
win32 {
INCLUDEPATH += $$PWD/ffmpeg-5.1.2/include
LIBS += $$PWD/ffmpeg-5.1.2/lib/libavformat.dll.a \
$$PWD/ffmpeg-5.1.2/lib/libavcodec.dll.a \
$$PWD/ffmpeg-5.1.2/lib/libavdevice.dll.a \
$$PWD/ffmpeg-5.1.2/lib/libavfilter.dll.a \
$$PWD/ffmpeg-5.1.2/lib/libavutil.dll.a \
$$PWD/ffmpeg-5.1.2/lib/libpostproc.dll.a \
$$PWD/ffmpeg-5.1.2/lib/libswresample.dll.a \
$$PWD/ffmpeg-5.1.2/lib/libswscale.dll.a
}
该问题就是因为没有导入依赖的dll文件。
把动态库依赖的dll导入到构建后生成的项目文件中。
把动态库依赖的dll导入到构建后生成的项目文件中,可以解决问题。
或者直接构建的release版本,但是没有拷贝依赖的dll文件时。
报错(qt_test.exe 退出,退出代码: -1073741515
{1 ?} {2?})
可以看出编译出来的exe中依赖的dll文件,把相关依赖dll要么放在环境变量下,要么防止exe同一级别目录下。
F:\qt_project_data\build-untitled3-Desktop_Qt_5_15_2_MSVC2019_64bit-Debug\debug>dumpbin /dependents untitled3.exe
Microsoft (R) COFF/PE Dumper Version 14.29.30148.0
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file untitled3.exe
File Type: EXECUTABLE IMAGE
Image has the following dependencies:
avutil-57.dll
KERNEL32.dll
VCRUNTIME140D.dll
ucrtbased.dll
Summary
1000 .00cfg
1000 .data
1000 .idata
1000 .pdata
2000 .rdata
1000 .reloc
1000 .rsrc
7000 .text
对qt相关环境并不熟悉,在进行测试的时候,遇到构建成功,运行没反应的问题,纠结许久有阻塞,所以做了该整理。
探索过程中,以下几个注意点:
1:qt构建时,要注意选择的构建方式,以及依赖动态库要和构建方式的32/64版本对应,pro文件中要配置对应依赖位置。
2:运行时报错”The CDB process terminated.“,或者运行时没有反应,多半是dll依赖没有对,需要拷贝对应依赖dll到构建目录下。
====》这里同时要注意debug版本和release版本构建时,点击直接运行时的报错和debug运行时的报错不一样。(都是确少对应dll文件)
3:在取库进行测试时,发现有.dll.a文件,实际和lib导入库一个概念,实际运行时需要依赖dll文件。
4:另外,直接把相关dll拷贝到win目录也可以,就不用每次拷贝了,不研究了。