当前位置: 首页 > news >正文

Window 下 FFmpeg 和 LibX264 的编译和配置

博客原文地址:https://glumes.com

周末在家折腾 Windows 平台下 FFmepg 和 LibX264 库的编译,长期以来都是在 Mac 平台下做开发,切换到 Windows 平台下还是踩了不少坑。

参考了网上很多编译文章,质量也是参差不齐,版本也是五花八门,但归根到底还是 Window 下编译环境太坑爹了。

由于 Windows 上的命令行工具不好用,所以需要安装 MSYS 或者 Cygwin 这样的软件,它们的作用就是模拟 Linux 环境,其中 MSYS 还分 1.0 和 2.0 版本,有的博客文章比较久远,还使用的 1.0 版本了。

机智地没有选择走 Cygwin 这条路线,节省了不少时间,但还是踩了 MSYS 1.0 版本的坑。

如果你看到的文章是安装  MSYS 1.0 版本,并且还需要额外安装 MinGW 软件,那么请退出来,重新找个 MSYS 2.0 版本的文章吧,这样还能绕过 MinGW 单独下载太慢的问题(别问为什么我知道,你懂的)。

使用 MSYS 2.0 版本,就不需要额外安装 MinGW 软件了,它提供了 pacman 软件管理器,通过它来安装依赖的软件。

官网地址:https://www.msys2.org/

MSYS 2.0 安装软件的时候,如果网速很慢,可以考虑更新镜像源,使用国内的源。

搞定软件之后,先编译 libx264 ,在编译 FFmpeg 。

MinGW 和 MSVC 的作用

在实际编译的时候,我们也是用不上 MinGW 的,看了一些文章用 MinGW 来编译,最后编译出来的静态库是个 .a 的形式。

一开始还没反应过来,Windows 下的静态库不是 .lib 嘛,直接用 CMake 去链接 .a 库肯定不行啊。

还看到一些文章说先把 .a 库转成 .def 文件,然后再把 .def 文件转成 .lib 文件,甚至再把 .lib 文件转成 .dll 的动态库,这么来回折腾一下又是大坑,还好没跳进去。

转念一想,我要用 CLion 开发工程,编辑器直接用 MSVC 就好了,也用不上 gcc 来编译代码,干嘛用 MinGW 去编译个 .a 库呢,直接编译出 .lib 不好嘛。

瞬间思路就打开了,调整方向,谷歌直接搜索 compile ffmpeg with msvc ,很快就找到了答案(谷歌搜英文会过滤掉很多网上各种抄袭复制的无效文章)。

LibX264 编译

首先下载好 LibX264 源码。

然后在开始菜单中找到并打开 x64 Native Tools Command Prompt for VS 2019 :

76af5fa361a00f59a3face7d4861322f.png

在打开的命令行终端中,进入到 MSYS 安装目录,打开 msys2_shell.cmd ,如下命令:

78e8b7074416bdfac7579efcdab1e8e8.png

注意后缀有个 -use-full-path 。

这时会打开 MSYS 的新窗口,先把一些汇编依赖安装好:

pacman -Syu
pacman -S make
pacman -S diffutils
pacman -S yasm
pacman -S nasm

然后,在该窗口中进入到 LibX264 的源码目录下,把如下代码保存成 .sh 文件并执行:

OPTIONS="--enable-shared"

CC=cl ./configure $OPTIONS --enable-shared --prefix=$BUILD_DIR/

make -j 16
make install
make clean

执行后就开始编译了,注意 configure 命令前缀有个 CC=cl ,代表使用 MSVC 来编译了。

编译后内容如下:

e6d472d4af5aea46060592fc490a2784.png

将编译后的 libx264.dll.lib 改成 libx264.lib,这就是静态库了。

FFmpeg 编译

继续在 MSYS 2.0 窗口中进入到下载好 FFmpeg 的源码目录,将如下代码保存成 .sh 文件并执行:

OPTIONS="--toolchain=msvc \
         --arch=x86_64 \
         --enable-yasm  \
         --enable-asm \
         --enable-shared \
         --disable-static \
         --disable-programs \
         --enable-swresample \
         --enable-swscale \
         --enable-libx264 \
         --enable-gpl \
         "
X264_INCLUDE=$libx264_path/include
X264_LIB=$libx264_path/lib

CC=cl ./configure $OPTIONS --extra-cflags="-I$X264_INCLUDE" --extra-ldflags="-LIBPATH:$X264_LIB" --prefix=$BUILD_DIR/
make -j 16
make install
make clean

要将代码中的 libx264_path 路径改成上面编译的 libx264 路径,FFmpeg 的编译需要依赖 libx264 的库。

一番等待后,就编译出了动态库:

3409f3a00f19b1272ac9387d87241111.png

CMake 依赖 FFmpeg 和 LibX264

最后就是在 Clion 中使用 CMake 去依赖 FFmpeg 和 LibX264 了。

定义了两个宏函数去链接头文件和库的目录:

macro(link_ffmpeg)
    include_directories(${ffmpeg}/${platform}/${arch}/include)
    link_directories(${ffmpeg}/${platform}/${arch}/bin)
endmacro()

macro(link_libx264)
    include_directories(${libx264}/${platform}/${arch}/include)
    link_directories(${libx264}/${platform}/${arch}/lib)
endmacro()

注意,FFmpeg 链接库用的是 bin 目录下的,libx264 用的是 lib 目录下的。

在最后这一步反而卡主了:

target_link_libraries(demo libx264 avcodec avformat)

要么提示找不到 libx264,要么找不到 avcodec-59,这个时候还需把 ffmpeg 编译结果的 bin 目录添加到系统环境变量中,为了保险起见,把 libx264 的 bin 目录也添加了。

加完之后,跑一段代码测试一下:

#include <iostream>

extern "C"{
#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"
#include "x264.h"
}

int main() {
    x264_param_t param;
    x264_param_default(&param);
    auto codec = avcodec_find_encoder(AV_CODEC_ID_H264);
    if (codec){
        std::cout << "success!!!" << std::endl;
    }
    return 0;
}

果然就成功了,这下可以在 Windows 上开发学习 FFmpeg 了。

参考

  1. https://www.cnblogs.com/wswind/p/10650126.html

  2. https://blog.csdn.net/qq_18453581/article/details/120005712

  3. https://www.roxlu.com/2016/057/compiling-x264-on-windows-with-msvc

  4. https://www.roxlu.com/2019/062/compiling-ffmpeg-with-x264-on-windows-10-using-msvc

c0ecf1c9ebd079127289770da476cec7.png

技术交流,欢迎加我微信:ezglumes ,拉你入技术交流群。

aaccbf82acf648182a8f506a5430a76e.png

私信领取相关资料

推荐阅读:

音视频开发工作经验分享 || 视频版

OpenGL ES 学习资源分享

开通专辑 | 细数那些年写过的技术文章专辑

Android NDK 免费视频在线学习!!!

你想要的音视频开发资料库来了

推荐几个堪称教科书级别的 Android 音视频入门项目

觉得不错,点个在看呗~

c9162b57752ad465cad148307bb31365.gif

相关文章:

  • 智能语音技术新进展与发展趋势
  • Android 系统中的文字渲染~
  • 微博HDR视频的落地实践
  • 年末总结 | 音视频开发进阶 2021 干货合集
  • Shadertoy 详解
  • Shadertoy 进阶 01
  • 拍乐云首发音视频「分组讨论」开放能力,开启线上群聊互动新玩法
  • 浅入浅出WebGPU
  • Vulkan 在 FFmpeg 中的支持
  • 音视频中的语音信号处理技术
  • 声网3D空间音频技术解析:3D空间音效+空气衰减模拟+人声模糊
  • 音视频春节假期内卷指南(实操)
  • HDR技术趋势浅析
  • 干货收藏 || Vulkan Game Engine 视频教程
  • 详解低延时高音质:丢包、抖动与 last mile 优化那些事儿
  • 【译】JS基础算法脚本:字符串结尾
  • 【391天】每日项目总结系列128(2018.03.03)
  • DataBase in Android
  • Fastjson的基本使用方法大全
  • IDEA常用插件整理
  • JavaScript设计模式之工厂模式
  • JS+CSS实现数字滚动
  • js算法-归并排序(merge_sort)
  • Linux gpio口使用方法
  • Python利用正则抓取网页内容保存到本地
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Vue 动态创建 component
  • Vue实战(四)登录/注册页的实现
  • 给新手的新浪微博 SDK 集成教程【一】
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 基于webpack 的 vue 多页架构
  • 将 Measurements 和 Units 应用到物理学
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 聊一聊前端的监控
  • 你不可错过的前端面试题(一)
  • 前端面试之闭包
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 为什么要用IPython/Jupyter?
  • 问题之ssh中Host key verification failed的解决
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 【干货分享】dos命令大全
  • 如何用纯 CSS 创作一个货车 loader
  • 如何在招聘中考核.NET架构师
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #数学建模# 线性规划问题的Matlab求解
  • $.each()与$(selector).each()
  • (7)STL算法之交换赋值
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • ******之网络***——物理***
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?