《window10_ffmpeg调试环境搭建-极速版》已经介绍了在qt creator里面 调试ffmpeg.c 工程。但是极速版的dll是现成的。所以本文来讲解如何自己编译出ffmpeg的dll。
window10 环境下 ffmpeg的编译方式主要有以下2种:
1,MSYS2 + MinGW
2,MSYS2 + MSVC
由于 window 的原生 CMD 命令行无法执行shell脚本,也没有 make 之类的命令,所以需要装 MSYS2 软件。
MSYS2 是什么?MSYS2 实际上就是一个linux 仿真环境,装了 MSYS2 就可以运行 ffmpeg 的configure 编译脚本了。
MinGW 跟 MSVC 是两个不同的编译器,MinGW 编译器有什么优势?请看下面代码
/*linux api pthread_create()*/
#include <stdio.h>
#include <pthread.h>
void* PrintHello(void* data)
{
printf("Hello from new thread\n");
pthread_exit(NULL);
}
int main(int argc, char* argv[])
{
pthread_t thread_id;
pthread_create(&thread_id, NULL, PrintHello, NULL);
pthread_exit(NULL);
}
上面的代码使用了一个 linux 里面 pthread_create() 线程函数,在window 环境是没有这个线程函数的,如果用 MSVC 编译器编译,会报错。
但是如果用 MinGW 编译器 就可以在window环境 编译 pthread_create() 的代码。
fmpeg 的源代码是 linux ,window 等多平台通用的,ffmpeg 里面并没有直接使用 pthread_create() 之类的linux专属的api函数,所以 用MinGW 还是MSVC 都可以编译ffmpeg 的源码,ffmpeg 的configure 编译脚本根据不同的编译方式执行不同的编译逻辑,例如如果用MinGW的编译器,configure 里面会走 MinGW的那块编译逻辑,如果指定用 MSVC 编译,configure会走另一块逻辑。
通过在configure前面加 --toolchain=xxx 可以指定不同的编译工具链,例如 --toolchain=msvc 是指定msvc 编译工具链, 如果没指定 --toolchain ,在mingw32环境下,configure会自动选择 MinGW 的方式编译,我们本文的示例就没指定 --toolchain。
所以,与其说ffmpeg 的代码是跨平台的,不如说是 configure 这个shell脚本实现了不同平台的编译规则。因为 window 原生 CMD 命令行没法运行shell脚本,所以就需要 MSYS2。
本文主要讲解 MSYS2 + MinGW 的编译方法,MSYS2 + MSVC 后续再会出一篇文章详细讲解。
MSYS2 官网下载地址:MSYS2
MSYS2 安装完成之后,CMD 进入安装目录 C:\msys64 目录,执行 .\msys2_shell.cmd -mingw32,打开32位的环境。不要直接点击 mingw32.exe 进入32位环境。尽量用 .\msys2_shell.cmd -mingw32。因为后面会改动一下 msys2_shell.cmd 文件。

运行之后就会进入 linux 的仿真环境,ls,ps,等linux命令都可以使用。
.\msys2_shell.cmd -mingw32 是 64位的环境,用这个入口编译出来的 ffmpeg.exe 跟 DLL 默认是 64位的。本文先编译 32 位的程序,64位后续出一篇文章讲解。

MSYS2 Linux仿真环境中包管理命令是 pacman,类似 apt-get,yum。下面用 pacman 安装一些用来编译 FFmpeg 的软件。(pacman 下载速度慢需要切换源)
# 刷新软件包数据
pacman -Sy
# 安装mingw-w64 ,如果报错 signature not trust,请看下面解决。
pacman -S mingw-w64-i686-toolchain
pacman -S git
pacman -S make
pacman -S automake
pacman -S autoconf
pacman -S perl
pacman -S mingw-w64-i686-SDL2
pacman -S libtool
pacman -S mingw-w64-i686-cmake
pacman -S pkg-config
pacman -S yasm
# 编译x264 需要 nasm
pacman -S nasm
常见错误:
mingw-w64-i686-toolchain 如果按照报 "signature not trust "错,是证书过期了,直接禁用检测,请参考此文章解决。 csdn文章 
准备工作已经完毕了。
FFmpeg 这个工程编解码等功能,是需要依赖一些外部库的,例如 x264库,aac库等等。所以编译FFmpeg之前,需要把 x264 ,acc 等项目编译出静态库,然后再把x264静态库,acc静态库等 Link 进去 FFmpeg 的DLL里面。
x264 项目编译:
下面的命令请把 /home/loken 改成自己的目录。
编译过程中如果报 final link failed: No space left on device 错误,尝试重启window10。
# 回到用户目录
cd /home/loken
# 创建ffmpeg目录,build目录,统一管理
mkdir -p ffmpeg/build32
# 进入ffmpeg目录
cd ffmpeg
#下载x264项目代码
git clone https://gitee.com/mirrors_addons/x264
# 进入x264项目目录
cd x264
# 执行configure
./configure --prefix=/home/loken/ffmpeg/build32/libx264 \
--host=i686-w64-mingw32 --enable-static \
--extra-ldflags=-Wl,--output-def=libx264.def
make -j8
make install
如果上面的命令没出错,在 ~/ffmpeg/build32/libx264/lib 目录下会编译出 x264 的静态库 libx264.a。
fdk-aac项目编译:
# 回到ffmpeg目录
cd /home/loken/ffmpeg
git clone --depth 1 https://gitee.com/mirrors/fdk-aac.git
cd fdk-aac
./autogen.sh
./configure --prefix=/home/loken/ffmpeg/build32/libfdk-aac --disable-shared \
--enable-static
make -j8
make install
如果上面的命令没出错,在 ~/ffmpeg/build32/libfdk-aac/lib 目录下会编译出 aac 的静态库 libfdk-aac.a。
mp3项目编译:
下面的命令如果报错,请把 "~" 相对目录 改成绝对目录
cd /home/loken/ffmpeg
git clone --depth 1 https://gitee.com/hqiu/lame.git
cd lame
./configure --prefix=/home/loken/ffmpeg/build32/libmp3lame --disable-frontend \
--disable-shared --enable-static
make -j8
make install
如果上面的命令没出错,在 ~/ffmpeg/build32/libmp3lame/lib 目录下会编译出 mp3 的静态库 libmp3lame.a。
libvpx项目编译:
cd /home/loken/ffmpeg
git clone --depth 1 https://github.com/webmproject/libvpx.git
cd libvpx
./configure --prefix=/home/loken/ffmpeg/build32/libvpx --disable-examples \
--disable-unit-tests --enable-vp9-highbitdepth --as=yasm
make -j8
make install
如果上面的命令没出错,在 ~/ffmpeg/build32/libvpx/lib 目录下会编译出 vpx的静态库 libvpx.a。
FFmpeg 工程依赖的外部静态库都已经编译出来,下面可以开始编译 FFmpeg 工程了。
FFmpeg项目编译:
下载 ffmpeg 4.2 源码,链接:百度网盘 请输入提取码 提取码:g3k8
把文件 FFmpeg-4.2.zip 解压到 /home/loken/ffmpeg/ffmpeg
cd /home/loken/ffmpeg/ffmpeg-4.2
./configure \
--prefix=/home/loken/ffmpeg/build32/ffmepg-4.2 \
--enable-gpl \
--enable-sdl2 \
--enable-zlib \
--enable-shared \
--enable-nonfree \
--enable-libx264 \
--enable-libfdk-aac \
--enable-libmp3lame \
--enable-libvpx \
--extra-cflags="-I/home/loken/ffmpeg/build32/libfdk-aac/include" \
--extra-ldflags="-L/home/loken/ffmpeg/build32/libfdk-aac/lib" \
--extra-cflags="-I/home/loken/ffmpeg/build32/libvpx/include" \
--extra-ldflags="-L/home/loken/ffmpeg/build32/libvpx/lib" \
--extra-cflags="-I/home/loken/ffmpeg/build32/libx264/include" \
--extra-ldflags="-L/home/loken/ffmpeg/build32/libx264/lib" \
--extra-cflags="-I/home/loken/ffmpeg/build32/libmp3lame/include" \
--extra-ldflags="-L/home/loken/ffmpeg/build32/libmp3lame/lib"
make -j8
make install
编译完成之后,build32/ffmpeg-4.2 目录如下:


可以看到 ffmpeg.exe 已经编译出来了。这个时候 在MSYS2 仿真linux命令行里,ffmpeg.exe 是可以运行的。如图。

但是如果在window CMD 命令行运行 ffmpeg.exe ,会报错,提示缺少 libwinpthread-1.dll 等库。

把 C:\msys64\mingw32\bin\libwinpthread-1.dll 复制到 \home\loken\ffmpeg\build32\ffmepg-4.2\bin 。其他缺少的 dll 文件也是如此操作。
拷贝完缺少的dll文件后,再运行 ffmpeg.exe 就不会报错了。
重要知识点:
MSYS2 环境下 ffmpeg 的编译已经讲完了,下面介绍QT 如何调用 FFmpeg 的 api 函数。
之前编译ffmpeg 的时候,configure 指定了 --enable-shared,所以项目生成了几个DLL动态库。
下面介绍 QT 项目如何加入这些dll。如果之前没装过 qt 跟 Visual Studio 2015 请看第一篇文章。
1,打开Qt creator,点击New File Or Project,选择 Non-Qt Project ,选择 Plain C Application。

2,勾选编译环境 kit ,MinGW 32 跟 MSVC 2015 32bit。

3,把 \home\loken\ffmpeg\build32 整个目录拷贝到 ffmpeg-qt-version 项目目录下。

4,修改 ffmpeg-qt-version.pro 文件:
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
SOURCES += main.c
contains(QT_ARCH, i386) {
message("32-bit")
INCLUDEPATH += $$PWD/build32/ffmepg-4.2/include
LIBS += $$PWD/build32/ffmepg-4.2/bin/avformat.lib \
$$PWD/build32/ffmepg-4.2/bin/avcodec.lib \
$$PWD/build32/ffmepg-4.2/bin/avdevice.lib \
$$PWD/build32/ffmepg-4.2/bin/avfilter.lib \
$$PWD/build32/ffmepg-4.2/bin/avutil.lib \
$$PWD/build32/ffmepg-4.2/bin/postproc.lib \
$$PWD/build32/ffmepg-4.2/bin/swresample.lib \
$$PWD/build32/ffmepg-4.2/bin/swscale.lib
} else {
message("64-bit")
}
5,修改 main.c 文件:
#include <stdio.h>
#include "libavutil/avutil.h"
int main(){
printf("Hello FFMPEG, version is %s\n", av_version_info());
return 0;
}
6,编译运行 ffmpeg-qt-version 项目。会提示确实缺少dll。
由于 ffmpeg-qt-version 项目并没有用到pthread_create() 之类的 linux api 函数,所以 用MinGW 32bit 还是 MSVC2015 32bit 编译都没问题。

7,把 build32/ffmpeg-4.2/bin/*.dll 所有DLL都复制到 build-ffmpeg-qt-version-Desktop_xxxx-Debug\debug 目录。然后再次编译运行 ffmpeg-qt-version 项目,就会正常打印出 version。

注意事项:
常见错误:
build-ffmpeg-qt-version-Desktop_xxx-Debug 目录删掉,因为可能有缓存,再重新执行上面步奏。重要知识点:
av_version_info() 打印版本号,由于 ffmpeg-qt-version 项目并没有用到pthread_create() 之类的 linux api 函数,所以 用MinGW 32bit 还是 MSVC2015 32bit 编译都没问题。ffmpeg 官方发布的window dll 下载:
百度网盘:百度网盘 请输入提取码 提取码:n7dx
官方发布的 ffmpeg-4.2.1-win32-shared.zip 里面的README 记录了官方编译ffmpeg的configure选项。里面有 -enable-lzma --enable-zlib,网上某些ffmpeg 编译教程,没有加这两个选项,每次都要复制 zlib-1.dll 过去。可以参考官方的configure选项,直接把zlib等库以静态库的方式编译进去ffmpeg dll 更方便。

相关技术文章:
©版权所属:弦外之音。 由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
GivenIamadumbprogrammerandIamusingrspecandIamusingsporkandIwanttodebug...mmm...let'ssaaay,aspecforPhone.那么,我应该把“require'ruby-debug'”行放在哪里,以便在phone_spec.rb的特定点停止处理?(我所要求的只是一个大而粗的箭头,即使是一个有挑战性的程序员也能看到:-3)我已经尝试了很多位置,除非我没有正确测试它们,否则会发生一些奇怪的事情:在spec_helper.rb中的以下位置:require'rubygems'require'spork'
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
使用Ruby1.9.2运行IDE提示说需要gemruby-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall
我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.
我有:When/^(?:|I)follow"([^"]*)"(?:within"([^"]*)")?$/do|link,selector|with_scope(selector)doclick_link(link)endend我打电话的地方:Background:GivenIamanexistingadminuserWhenIfollow"CLIENTS"我的HTML是这样的:CLIENTS我一直收到这个错误:.F-.F--U-----U(::)failedsteps(::)nolinkwithtitle,idortext'CLIENTS'found(Capybara::Element
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p