惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Schneier on Security
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
Threat Research - Cisco Blogs
C
Cyber Attacks, Cyber Crime and Cyber Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
A
Arctic Wolf
Security Latest
Security Latest
Simon Willison's Weblog
Simon Willison's Weblog
I
Intezer
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Troy Hunt's Blog
Latest news
Latest news
Help Net Security
Help Net Security
S
Security Affairs
Webroot Blog
Webroot Blog
The Hacker News
The Hacker News
AI
AI
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Tor Project blog
Forbes - Security
Forbes - Security
Google DeepMind News
Google DeepMind News
AWS News Blog
AWS News Blog
Attack and Defense Labs
Attack and Defense Labs
P
Proofpoint News Feed
www.infosecurity-magazine.com
www.infosecurity-magazine.com
H
Help Net Security
L
Lohrmann on Cybersecurity
S
SegmentFault 最新的问题
Google Online Security Blog
Google Online Security Blog
MongoDB | Blog
MongoDB | Blog
Cyberwarzone
Cyberwarzone
The Last Watchdog
The Last Watchdog
S
Securelist
N
News and Events Feed by Topic
S
Secure Thoughts
F
Fortinet All Blogs
博客园_首页
C
Cybersecurity and Infrastructure Security Agency CISA
量子位
M
MIT News - Artificial intelligence
F
Full Disclosure
T
The Blog of Author Tim Ferriss
T
Tailwind CSS Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Microsoft Security Blog
Microsoft Security Blog
I
InfoQ
P
Privacy International News Feed
L
LangChain Blog
Know Your Adversary
Know Your Adversary
C
CERT Recently Published Vulnerability Notes

音视频开发进阶

音视频教程-第三节 音视频教程-第二节 真的,AI 可能就是新时代的信息差 充值 Cursor 之后,工作有了哪些变化?🤔 个人'蒸馏'大模型能做哪些有意思的事情 DeepSeek 大模型在 Mac 上的部署和运行 音视频教程-第一节 【WebRTC 专栏】-- Android 开发集成 WebRTC 库的几种方式 【WebRTC 专栏】-- 在 Mac M1 等系列芯片编译和开发 WebRTC-Android 库 Meta Llama3 大模型在 Mac 上的部署和运行 iOS VideoToolBox 解码 HEVC Open-GOP 视频的问题排查 Flutter 状态管理之 InheritedWidget 使用和分析 用 ChatGPT 回答技术问题怎么样 ? 音视频开发系统入门大致路线 UE 4.27 添加自定义 ShadingModel 用 UE4 虚幻引擎做个捏脸小功能~~ UE4 材质练习 之 凹凸贴图偏移的使用 UE4 材质练习系列基础 OpenGL上下文创建以及共享机制 007 | 播放器系列专栏-解析 MP4 文件读取信息 006 | 播放器系列专栏-在 Mac 上查看 MP4 格式信息 干货 | 快速抽取缩略图是怎么练成的? 关于直播、WebRTC、FFmpeg 的那些事 005 | 播放器系列专栏-在 Windows 上查看 MP4 格式信息 将音视频中的花屏、绿屏、黑屏问题一网打尽 关于音视频里面的解码帧率和渲染帧率 004 | 播放器系列专栏-认识MP4视频(下) 003 | 播放器系列专栏-认识MP4视频(上) 入门或者转行音视频,应该要怎么做? H264视频文件如何缩放分辨率 002 | 播放器系列专栏-FFmpeg依赖库的配置 001 | 播放器系列专栏-关于播放器项目的一个小实践 Seek策略以及在有B帧情况下的处理 目前流媒体开发工程师工作内容主要是什么? 一个音视频领域专业问答的小圈子 干货收藏 || Vulkan Game Engine 视频教程 音视频春节假期内卷指南(实操) Vulkan 在 FFmpeg 中的支持 Metal 开发 | 使用 C++ 进行接口调用 音视频开发工作经验分享 || 视频版 FFmpeg 调用 MediaCodec 硬解码到 Surface 上 代码吸猫 | 用 OpenGL 图像渲染的养猫计划 百倍变速--解码到底能不能丢 非参考帧 ?FFmpeg 有话说!!! 老生常谈-FFmpeg 的编译问题轻松搞定 FFmpeg 调用 Android MediaCodec 进行硬解码(附源码) 【WebRTC 专栏】--创建相机预览 Unity Shader 光照基础之 Half Lambert 光照模型 Unity Shader 光照基础之Lambert光照模型 Unity Shader 光照基础内容 Unity Shader 显示一张图片纹理 UnityShader 的基本概念 Unity 物体的基本操作 C++ 模板系列小结07-尾置返回类型 C++ 模板系列小结06-可变参数模板特性 C++ 中的多线程的使用和线程池建设 C++ 模板系列小结05-模板类型作为模板参数 C++ 模板系列小结04-类模板中的成员模板 C++ 模板系列小结03-在模板中指定变量类型 C++ 模板系列小结02-非类型模板参数 C++ 模板系列小结01-函数模板和类模板 从零打造渲染引擎系列01-什么是渲染引擎 iOS开发 - 在 Swift 中去调用 C/C++ 代码 2021 技术新番 - 从零打造渲染引擎系列 iOS 音视频开发的一些基础准备工作 音视频交流群又来啦~~~ 【WebRTC 专栏】WebRTC & Android 开发学习环境搭建~ 【喜大普奔】域名终于备案通过啦 Shader 优化 | OpenGL 绘制网格效果 【音视频连载-011】第二季 FFmpeg 一层一层获取文件信息 KodeLife | Shader 实时编辑预览的强大工具使用实践 推荐几个堪称教科书级别的 Android 音视频入门项目 【音视频连载-010】第二季 FFmpeg 日志打印 【音视频连载-008】基础学习篇-SDL 播放 PCM 音频文件(下) 【音视频连载-007】基础学习篇-SDL 播放 PCM 音频文件(上) 【音视频连载-006】基础学习篇-SDL 播放 YUV 视频文件 【音视频连载-005】基础学习篇-SDL 加载 YUV 文件并显示 【音视频连载-004】基础学习篇-SDL 加载图片并显示 【音视频连载-003】基础学习篇-SDL 消息循环和事件响应 【音视频连载-002】基础学习篇-SDL 创建窗口并显示颜色 【音视频连载-001】基础学习篇- SDL 介绍以及工程配置 LearnOpenGL 源码在 MAC 上的编译与调试 2019 年终总结与回顾 Android NDK 开发的免费技术视频来啦~~ OpenGL 实现视频编辑中的转场效果 OpenGL 实践之贝塞尔曲线绘制 图像库 libjpeg-turbo 编译与实践 图像库 libpng 编译与实践 rust 开发编译 Android 动态库实践 Android NDK 开发 —— 从 Assets 文件夹加载图片并上传纹理 简单易用的图像解码库介绍 —— stb_image 博客图床迁移记 进击的 Vulkan 移动开发之 SwapChain 进击的 Vulkan 移动开发之 Command Buffer 进击的 Vulkan 移动开发之 Instance & Device & Queue 进击的 Vulkan 移动开发(一)之今生前世 Java 显式锁 Lock 与条件队列 C++ 标准容器库小结 MediaCodec 硬编码之相机内容编码成 H264 文件 一文读懂 YUV 的采样与格式 《OpenGL ES 3.x 游戏开发》碰撞检测之 AABB 包围盒
Windows 下 FFmpeg 和 LibX264 的编译和配置
音视频开发进阶 · 2021-12-19 · via 音视频开发进阶

一个专注音视频领域的小圈子

周末在家折腾 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 源码。

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

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

注意后缀有个 -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 来编译了。

编译后内容如下:

将编译后的 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 的库。

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

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

原创文章,转载请注明来源:    Windows 下 FFmpeg 和 LibX264 的编译和配置