博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Windows下编译可调试的ffmpeg, 包含ffplay
阅读量:4071 次
发布时间:2019-05-25

本文共 5269 字,大约阅读时间需要 17 分钟。

Windows下编译可调试的ffmpeg, 包含ffplay

作者:史正邮箱:shizheng163@126.com如有错误还请及时指正如果有错误的描述给您带来不便还请见谅如需交流请发送邮件,欢迎联系
  • 我的csdn :
  • 我的github :

文章目录

简述

操作系统: Windows10 64

编译工具: MinGW+MSYS+yasm + SDL2.0

  • MinGW是Windows下模拟linux运行的库、头文件等的集合。
  • msys是Windows下模拟linux运行的最新系统, 可以通过类似于linux bash的命令行窗口进行代码编译。
  • yasm是ffmpeg编译时用到的汇编工具。
  • SDL2.0, ffmpeg编译ffplay时需要的SDL2源代码, 编译时要生成ffpaly, 执行configure脚本时比较加入--enable-sdl2

FFMPEG版本:ffmpeg-4.1, 可从FFMPEG官方网址进行下载最新代码.

作者这里使用的编译器是QTCreator5.7.1 + MinGW, 同时有GitBash也可以模拟linux环境运行,但是执行完configure脚本后发现make命令找不到, 所以干脆按照其他教程使用MinGW+MSYS+yasm进行编译。

本文的编译环境安装目录为:D:\FFMPEGDir\MinGW

编译环境搭建

Mingw+msys+yasm下载与安装

MinGW+Msys+Yasm的下载与安装可以参考以下博客:

下载完成后配置信息请切回本文继续, 本文所述与以上博客有轻微不同。

下载安装完成后MinGW目录结构如下(图中的SDL目录是后来放进去的):
在这里插入图片描述

将下载完成后的yasm-1.3.0-win64.exe改名为yasm.exe放置到D:\FFMPEGDir\MinGW\bin下面。

进入D:\FFMPEGDir\MinGW\msys\1.0执行msys.bat
输入df -h

$ df -hFilesystem            Size  Used Avail Use% Mounted onC:\Users\shizh\AppData\Local\Temp                      119G   82G   37G  69% /tmpD:\FFMPEGDir\MinGW\msys\1.0                      184G   33G  152G  18% /usrD:\FFMPEGDir\MinGW\msys\1.0                      184G   33G  152G  18% /D:\FFMPEGDir\MinGW    184G   33G  152G  18% /mingwc:                    119G   82G   37G  69% /cd:                    184G   33G  152G  18% /de:                    151G   74G   77G  49% /ef:                    301G  213G   88G  71% /fg:                    150G   14G  137G   9% /gh:                    148G  4.7G  144G   4% /h

可以看到将D:\FFMPEGDir\MinGW是挂载到了/mingw下面.

输入gcc -v验证gcc环境是否准备好。

$ gcc -vUsing built-in specs.COLLECT_GCC=D:\FFMPEGDir\MinGW\bin\gcc.exeCOLLECT_LTO_WRAPPER=d:/ffmpegdir/mingw/bin/../libexec/gcc/mingw32/6.3.0/lto-wrapper.exeTarget: mingw32Configured with: ../src/gcc-6.3.0/configure --build=x86_64-pc-linux-gnu --host=mingw32 --target=mingw32 --with-gmp=/mingw --with-mpfr --with-mpc=/mingw --with-isl=/mingw --prefix=/mingw --disable-win32-registry --with-arch=i586 --with-tune=generic --enable-languages=c,c++,objc,obj-c++,fortran,ada --with-pkgversion='MinGW.org GCC-6.3.0-1' --enable-static --enable-shared --enable-threads --with-dwarf2 --disable-sjlj-exceptions --enable-version-specific-runtime-libs --with-libiconv-prefix=/mingw --with-libintl-prefix=/mingw --enable-libstdcxx-debug --enable-libgomp --disable-libvtv --enable-nlsThread model: win32gcc version 6.3.0 (MinGW.org GCC-6.3.0-1)

如果提示gcc环境找不到, 手动设置下环境变量:export PATH="/mingw/bin:$PATH"

编译SDL2.0

作者这里是自己根据源码编译的, 使用dev版本的SDL2.0执行ffmpeg的configure总是提示sdl2支持找不到.

下载SDL2.0源码:

解压后进入相关文件夹

./configure --prefix=/d/FFMPEGDir/MingGW/SDL2/make -j4 && make install

注意, 这里的d/FFMPEGDir/MingGW/SDL2/一定要先创建好

make -j4是启动多线程编译, 4是线程数量, 但线程数量不一定越高越好, 作者使用make -j使用最高的线程数进行编译(8个线程), 导致CPU占用率过高, 电脑蓝屏!!!

编译ffmpeg

本文ffmpeg源码路径位于:D:/FFMPEGDir/ffmpeg-4.1/ffmpeg-4.1

关闭杀毒软件, 作者在编译执行configure脚本时时没有关闭360安全卫士, 一直提示出几个编译出的文件是木马软件。网上有一些教程时不关杀毒软件会导致执行脚本失败, 这里倒是没有注意。

进入D:\FFMPEGDir\MinGW\msys\1.0, 执行msys.bat。

cd D:/FFMPEGDir/ffmpeg-4.1/ffmpeg-4.1export PATH="/mingw/SDL2/bin/:$PATH" ./configure --enable-shared --disable-static --enable-debug --enable-sdl2 --extra-cflags='-I/mingw/SDL2/include/SDL2/' --extra-ldflags='-L/mingw/SDL2/lib/' --prefix=D:/FFMPEGDir/ffmpegExport

ubuntu下执行配置脚本命令:

./configure --enable-shared --disable-static --enable-sdl2  --enable-debug=3 --disable-optimizations --disable-asm --disable-stripping --prefix=/home/shizheng/Workspace/ffmpegSrc/export
  • --enable-debug是启动调试, 若不加此命令编译出的ffmpeg是无法进行调试的, 就不会生成ffmpeg_g的这些文件
  • --enable-sdl2启动SDL环境, 只有启用了sdl环境, 且配置脚本检测无误才会编译出ffplay
  • --disable-optimizations 禁用编译器优化
  • --disable-asm 不适用汇编语言:ffmpeg有部分代码是使用汇编语言写的, 加此选项后不进行汇编代码的编译。
  • --disable-stripping 禁用剥离可执行程序和共享库:这个不明白是什么意思, 但是加上此选项后make install安装的库文件会保留调试信息, 否则, make install安装后的lib中的库是没法进行调试的。
  • --extra-cflags, 额外的指定C编译器寻找的Inlcude路径, 这里是指定SDL2的头文件路径
  • --extra-ldflags, 额外指定链接器寻找链接库的路径,这里是指定SDL2的链接库路径
  • --prefix=D:/FFMPEGDir/ffmpegExport, 指定编译出的ffmpeg可执行程序以及相关头文件, 动态库的存放位置

执行脚本, 等待脚本退出, 也可在ffmpeg源码的ffbuild路径下执行跟踪追踪进度tail -100f ffbuild/config.log

若执行完后, 提示sdl2支持找不到, 那就是SDL库的路径不对, 或者是因为SDL2的dev版本无法使用。

正确执行完后, 在输出的内容中寻找program, 看看有没有ffplay, 正常的情况应该是ffmpeg ffprobe ffplay.

如果执行完后提示WARNING: pkg-config not found, library detection may fail.这个无需理会,这里不会对编译产生影响。

开始编译ffmpeg.

make -j4 && make install

若编译过程中出现如下错误, 打开libavformat/os_support.h, 添加#include <winerror.h>

CC      libavformat/paf.oIn file included from libavformat/os_support.h:112:0,                 from libavformat/os_support.c:29:libavformat/os_support.c: In function 'ff_gai_strerror':libavformat/os_support.c:194:10: error: 'ERROR_NOT_ENOUGH_MEMORY' undeclared (first use in this function)     case EAI_MEMORY:          ^libavformat/os_suppCCort.clibavformat/pcm.o:1:10: note: each undeclared identifier is reported only once for each function it appears inmake: *** [libavformat/os_support.o] Error 1make: *** Waiting for unfinished jobs....

这里作者不确定会不会出现这个问题, 因为第一天晚上编译时就没有报错, 第二天就出现了这个问题。

编译完成后需要将MinGWSDL2/bin/SDL2.dll放置D:/FFMPEGDir/ffmpegExport/bin/下, 否则运行ffplay会报

SDL2.dll找不到。

同时, 在cmd中使用ffmpeg与ffplay, ffprobe会报libiconv-2.dll找不到, 这时可以从以下网址进行下载, 放入D:/FFMPEGDir/ffmpegExport/bin/下。

ffplay问题

编译后的ffplay执行时会提示如下警告

Warning: not compiled with thread support, using thread emulation

这是因为gcc版本导致的, 作者将gcc版本降级为5.3, 重新编译ffmpeg就没有出现这个警告了。

注意:

作者这里编出的ffpaly播放任何视频都会卡顿在第一帧, 音频会连续播放, 同时移动播放窗口以及在画面内连续点击会进行视频帧的切换, 这里怀疑是SDL的版本不适配导致的问题。

参考文章

转载地址:http://irhji.baihongyu.com/

你可能感兴趣的文章
解决ScrollView嵌套ListView后,进入页面不从顶部开始
查看>>
基于Rxjava2的事件总线:Rxbus
查看>>
Android6.0动态权限获取框架:RxPermission(基于RxJava2)
查看>>
Android中解决华为手机设置PopupWindow半透明背景无效果问题
查看>>
解决三星note3调用系统拍照后程序崩溃或无法获取图片
查看>>
序列化Serializable和Parcelable的区别
查看>>
Android自定义View绘制真正的居中文本
查看>>
Android贝塞尔曲线实现加入购物车抛物线动画
查看>>
Android自定义View实现商品评价星星评分控件
查看>>
postgresql监控工具pgstatspack的安装及使用
查看>>
postgresql查看表的和索引的情况,判断是否膨胀
查看>>
postgresql中根据oid和filenode去找表的物理文件的位置
查看>>
postgresql中wal日志什么时候会触发归档
查看>>
Centos 6.8 上 DRBD安装和使用
查看>>
history查看历史操作记录,并显示操作时间
查看>>
postgresql修改完端口后直接psql连接数据库报错
查看>>
pl/proxy-2.5安装在postgresql9.6上无法编译
查看>>
postgresql遇到“Connection refused”和“No route to host”大概的解决方法
查看>>
postgresql上安装sysbench-0.5
查看>>
pgpool3.2.9中编译 pgpool-walrecrunning函数出错
查看>>