Windows环境下编译ffmpeg 6.1源码--Virtual Studio + Msys2方式

环境准备

约定:源码全部放到sources下,目录结构说明

/d/java/ffmpeg    #工程工目录
├── build                #存放编译文件的目录,子目录为具体模块的构建目录
│   ├── fdk-aac
│   ├── ffmpeg
│   └── x264
├── installed         #模块的安装目录,各模块的安装文件(如:dll、so等)会存到此处
│   ├── bin
│   ├── include
│   ├── lib
│   └── share
└── sources           #源码目录,存放各模块源码├── fdk-aac├── ffmpeg└── x264

依赖工具安装

2.1 安装vs 2022

略过...

2.2 安装msys2

下载地址:MSYS2

安装:

选择好安装目录,默认是:C:\msys64

2.2.1 修改mysys配置
  1. 编辑msys2_shell.cmd脚本

找到 rem set MSYS2_PATH_TYPE=inherit所在的行,并将rem移除,最终如下

含义:msys使用windows的环境变量。

启动msys的命令:msys2_shell.cmd -use-full-path

2.2.2 更换msys为国内源

修改C:\msys64\etc\pacman.d中mirrorlist.mingwmirrorlist.mingw32mirrorlist.mingw64mirrorlist.msys四个文件中的源,在## Primary下面添加清华大学的源

  • mirrorlist.mingw上面添加
## Primary
Server = https://mirrors.tuna.tsinghua.edu.cn/mingw/$repo/
  • mirrorlist.mingw32上面添加
## Primary
Server = https://mirrors.tuna.tsinghua.edu.cn/mingw/i686/
  • mirrorlist.mingw64上面添加
## Primary
Server = https://mirrors.tuna.tsinghua.edu.cn/mingw/x86_64/
  • mirrorlist.msys上面添加
## Primary
Server = https://mirrors.tuna.tsinghua.edu.cn/msys/$arch/

保存后启动msys。

2.2.3 安装msys中的依赖库
#pacman -Syu 一键安装和升级所有的库
pacman -Syu
#安装编译ffmpeg所需的包
pacman -S gcc
pacman -S make
pacman -S pkg-config
pacman -S diffutils
pacman -S yasm
pacman -S nasm
#//用于编码fda-aac时运行。/autogen.sh生成configure文件
pacman -S autoconf 
pacman -S automake
pacman -S libtool#避免与msvc的link冲突
mv /usr/bin/link.exe /usr/bin/link.exe.bak

2.3 编译fdk-aac编码器

在msys环境下运行

  1. 下载源码
cd /d/java/ffmpeg/sources
git clone --depth 1 https://gitee.com/mirrors/fdk-aac.git
  1. 切换到编译目录

目录结构:

/d/java/ffmpeg
├── build
│   ├── fdk-aac
│   ├── ffmpeg
│   └── x264
├── installed
│   ├── bin
│   ├── include
│   ├── lib
│   └── share
└── sources├── fdk-aac├── ffmpeg└── x264

开始编译

cd ../build/fdk-aac
#此时所在目录:/d/java/ffmpeg/build/fdk-aac#执行如下命令
#1. config
cmake ./../../sources/fdk-aac/ -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=./../../installed# 2. build
cmake --build . --config Release# 3. install
cmake --install . --config Release

编译成功,如下图所示:

参考文档

  1. cmake编译不同的版本
cd debug
cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake --build .
cd ../release
cmake -DCMAKE_BUILD_TYPE=Release ..
cmake --build .

Step 12: Packaging Debug and Release — CMake 3.29.0-rc4 Documentation

  1. cmake指定安装目录
cmake --install . --config Release --prefix "/home/myuser/installdir"

Step 5: Installing and Testing — CMake 3.29.0-rc4 Documentation

2.4 编译x264源码

  1. 打开x64 Native Tools Command Prompt for VS 2022的命令行工具

  1. 进入msys64的安装目录
cd C:\msys64
  1. 执行msys2_shell.cmd脚本
.\msys2_shell.cmd -use-full-path
  1. 下载源码
#1. 进入到源码目录
cd sources    #执行后当前目录: /d/java/ffmpeg/sources
#2. clone代码
git clone --depth 1 https://code.videolan.org/videolan/x264.git
  1. 修改编译脚本内容
cd sources/x264
curl "http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD" > config.guess
sed -i 's/host_os = mingw/host_os = msys/' configure
  1. 配置与编译
cd build
mkdir x264
cd x264    #执行后当前目录: /d/java/ffmpeg/build/x264CC=cl ./../../sources/x264/configure \--prefix=./../../installed \--enable-shared
make -j 8
make install
mv ./../../installed/lib/libx264.dll.lib ./../../installed/lib/libx264.lib

2.5 编译安装sdl2(ffplay需要)

  1. 下载源码
cd sources    #执行后当前目录: /d/java/ffmpeg/sources
git clone --depth 1 https://github.com/libsdl-org/SDL.git -b SDL2
  1. 编译&安装
mkdir -p build/SDL
cd build/SDL #执行后,当前目录:/d/java/ffmpeg/build/SDL
#1.config
cmake ./../../sources/SDL/ \-DCMAKE_BUILD_TYPE=Release \-DBUILD_SHARED_LIBS=ON \-DCMAKE_INSTALL_PREFIX=./../../installed
#2. build
cmake --build . --config Release --parallel
# 3. install
cmake --install . --config Release
  1. 安装完成

参考文档:

  1. SDL2/Installation - SDL Wiki

编译ffmpeg(msvc方式)

源码下载

  • 方式1(推荐):
#从仓库充clone代码
cd /d/java/ffmpeg/sources
git clone --depth 1 https://github.com/FFmpeg/FFmpeg.git -b release/6.1
  • 方式2: github仓库:GitHub - FFmpeg/FFmpeg: Mirror of https://git.ffmpeg.org/ffmpeg.git

  • 方式3:官网:Download FFmpeg

安装与配置

  1. 打开x64 Native Tools Command Prompt for VS 2022的命令行工具
  2. 进入msys64的安装目录
cd C:\msys64
  1. 执行msys2_shell.cmd脚本
.\msys2_shell.cmd -use-full-path

执行后,会打开msys菜单命令行窗口

  1. 在msys中切换到ffmpeg存放编译产物的目录
#切换到ffmpeg存放编译产物的目录
cd /d/java/ffmpeg/build/ffmpeg

:路径需要按Linux方式来设置

  1. 配置pkg-config

将x164、fdk-acc加到环境变量中,ffmpeg编译需要

export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/d/java/ffmpeg/installed/lib/pkgconfig
export CC=cl

注:/d/java/ffmpeg/installed是第三方库的安装目录。

  1. 配置

配置用来设置编译器的类型以及参与编译的模块等

#此时所在目录:/d/java/ffmpeg/build/ffmpegexport CC=cl
./../../sources/ffmpeg/configure \--prefix=./../../installed \--toolchain=msvc \--enable-cross-compile \--target-os=win64 \--arch=x86_64 \--enable-debug=3 \--enable-yasm \--enable-asm  \--enable-shared  \--enable-gpl \--enable-version3 \--enable-nonfree \--enable-libfdk-aac \--enable-libx264 \--enable-sdl2 \--extra-ldflags="-LIBPATH:./../../installed/lib/" \--extra-cflags="-I./../../installed/include/"
  1. 编译
make -j 8
  1. 安装
make install

:可能出现以下错误:

  1. 错误1:
fftools/opt_common.c(206): error C2065: “slib”: 未声明的标识符
fftools/opt_common.c(206): error C2296: “%”: 非法,左操作数包含“char [138]”类型
fftools/opt_common.c(206): error C2059: 语法错误:“数字上的错误后缀”
fftools/opt_common.c(206): error C2059: 语法错误:“%”
fftools/opt_common.c(206): error C2017: 非法的转义序列
fftools/opt_common.c(206): error C2015: 常量中的字符太多
fftools/opt_common.c(206): error C2001: 常量中有换行符
fftools/opt_common.c(237): error C2143: 语法错误: 缺少“)”(在“*”的前面)
fftools/opt_common.c(237): error C2143: 语法错误: 缺少“{”(在“*”的前面)
fftools/opt_common.c(237): error C2059: 语法错误:“)”
fftools/opt_common.c(238): error C2054: 在“options”之后应输入“(”
fftools/opt_common.c(278): error C2143: 语法错误: 缺少“)”(在“*”的前面)
fftools/opt_common.c(278): error C2143: 语法错误: 缺少“{”(在“*”的前面)

解决方案:

修改fftools/opt_common.c 源码文件, 将第 206 行注释掉,原因是 CC_IDENT 标识未定义引起的,如下所示:

static void print_program_info(int flags, int level)
{const char *indent = flags & INDENT? "  " : "";av_log(NULL, level, "%s version " FFMPEG_VERSION, program_name);if (flags & SHOW_COPYRIGHT)av_log(NULL, level, " Copyright (c) %d-%d the FFmpeg developers",program_birth_year, CONFIG_THIS_YEAR);av_log(NULL, level, "\n");//av_log(NULL, level, "%sbuilt with %s\n", indent, CC_IDENT);av_log(NULL, level, "%sconfiguration: " FFMPEG_CONFIGURATION "\n", indent);
}
  1. 错误2:
fftools/ffprobe.c(378): warning C4267: “=”: 从“size_t”转换到“int”,可能丢失数据
fftools/ffprobe.c(597): warning C4267: “函数”: 从“size_t”转换到“int”,可能丢失数据
fftools/ffprobe.c(2423): warning C4267: “函数”: 从“size_t”转换到“int”,可能丢失数据
fftools/ffprobe.c(2424): warning C4267: “函数”: 从“size_t”转换到“int”,可能丢失数据
fftools/ffprobe.c(3624): error C2001: 常量中有换行符
fftools/ffprobe.c(3625): error C2146: 语法错误: 缺少“)”(在标识符“writer_print_string”的前面)
fftools/ffprobe.c(3624): error C2198: “writer_print_string”: 用于调用的参数太少
make: *** [ffbuild/common.mak:81: fftools/ffprobe.o] Error 2

解决方案:

注释CC_IDENT所在的行,如下所示:

static void ffprobe_show_program_version(WriterContext *w)
{AVBPrint pbuf;av_bprint_init(&pbuf, 1, AV_BPRINT_SIZE_UNLIMITED);writer_print_section_header(w, NULL, SECTION_ID_PROGRAM_VERSION);print_str("version", FFMPEG_VERSION);print_fmt("copyright", "Copyright (c) %d-%d the FFmpeg developers",program_birth_year, CONFIG_THIS_YEAR);//print_str("compiler_ident", CC_IDENT);print_str("configuration", FFMPEG_CONFIGURATION);writer_print_section_footer(w);av_bprint_finalize(&pbuf, NULL);
}

修改后重新install即可。

configure 详细使用方式如下:

./configure --help

测试&运行

执行如下命令:

ffmpeg --help

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/761855.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习流程—AutoML

文章目录 机器学习流程—AutoMLAutoML工具Auto-SKLearnMLBoxTPOTRapidMinerPyCaretAuto-KerasH2OAutoML谷歌AutoML云Uber LudwigTransmogrifAIAutoGluonAutoWekaDataRobot

稀碎从零算法笔记Day24-LeetCode:存在重复元素

前言:本打算练习下机写快排,但是快排超时了(为什么sort没超时啊。。) 题型:排序、哈希表 链接:存在重复元素 - 提交记录 - 力扣(LeetCode) 来源:LeetCode 题目描述 题目样例 题目思路 C代…

提升水库大坝安全与效率:现代技术云平台的应用

在我国,水库大坝的数量居世界之首,它们在推动国民经济发展中扮演着不可或缺的角色。然而,要想让这些水利工程充分发挥其价值,不仅需要精准的调度与高效的管理,更重要的是要确保其安全无虞。一旦发生事故,后…

linux 使用 go 连接 etcd 集群时报错

问题分析 在 ubuntu 中使用 github.com/coreos/etcd/clientv3 第三方库报错,报错信息如下: # github.com/coreos/etcd/clientv3/balancer/resolver/endpoint /root/go/pkg/mod/github.com/coreos/etcdv3.3.27incompatible/clientv3/balancer/resolver/…

鸿蒙Harmony应用开发—ArkTS-全局UI方法(列表选择弹窗)

列表弹窗。 说明: 从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 本模块功能依赖UI的执行上下文,不可在UI上下文不明确的地方使用,参见UIContext说明。 从API version 10开始&#xff0…

HTML世界之标签Ⅵ

目录 一、progress 标签 二、q 标签 三、rp 标签 rt 标签 ruby 标签 四、s 标签 五、samp 标签 六、script 标签 七、section 标签 八、select 标签 九、small 标签 一、progress 标签 <progress> 标签定义运行中的任务进度&#xff08;进程&#xff09;。 …

数据结构——循环队列的实现

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

【回顾练习】静态路由配置综合实验报告

一、分析要求 为R6设备配置公有IP地址&#xff0c;并确保只能进行IP地址配置&#xff0c;无法进行其他配置。为R1-R5设备分配私有IP地址。为R1、R2、R4配置两个环回地址&#xff0c;为R5、R6配置一个环回地址。在R3上配置DHCP服务&#xff0c;以供两台PC自动获取IP地址。使用动…

数字电源浅析

电力电子技术是关于能量转换、调节、控制和管理等方面的学科,而数字电源则是电力电子技术的一种应用,是利用数字电路技术实现电源控制和管理的新型电源。 一、什么是数字电源 数字电源是一种数字控制的电源设备,可以通过数字控制芯片(DSP、MCU等)实现输出电压、电流、功…

向上生长

&#xff08;1&#xff09; 我记得2010年&#xff0c;在中国的苹果应用商店里&#xff0c;充斥的App还有很多&#xff1a;日历App、天气App、电池省电App、记事本App…。但这已经过去了2007-2008-2009三年&#xff0c;这些应用仍然很欢。 我有一个朋友算是中国最早一批开发iOS …

Transformer 论文阅读笔记

文章目录 前言论文阅读研究现状工作内容模型架构训练过程实验结果模型代码 其他评价 前言 Transformer可以说是深度学习领域最重要的&#xff0c;里程碑式的工作之一&#xff0c;发表于2017年的NIPS。该模型开创了自MLP&#xff08;多层感知机&#xff09;、CNN&#xff08;卷…

U盘插入电脑没有显示怎么办?

U盘可以备份/转移数据&#xff0c;还可以作为启动盘重装系统&#xff0c;但很多用户在使用u盘的时候&#xff0c;都遇到过这样的问题&#xff0c;就是u盘插入电脑没有反应&#xff0c;在电脑上找不到u盘设备。那么今天就跟大家等下U盘插入电脑没有显示怎么办。 原因/解决方法一…

html5cssjs代码 036 CSS默认值

html5&css&js代码 036 CSS默认值 一、代码二、解释 CSS默认值&#xff08;也称为浏览器默认样式&#xff09;是指当HTML元素没有应用任何外部CSS样式时&#xff0c;浏览器自动为这些元素赋予的一组基本样式。这些样式是由浏览器的默认样式表&#xff08;User Agent sty…

【最新测试函数】智能优化算法的CEC2022测试函数

(多种智能优化算法跑多次运行结果的最优值,平均值,标准差,最差值以及箱型图) 智能优化算法测试函数简介 智能优化算法测试函数是为了在优化算法研究和开发中测试算法性能的规范问题集合。这些测试函数模拟了真实世界优化问题的不同方面,包括局部最小值、最大值、全局最…

几种常用的用于视频读取、写入和处理的库和函数

在Python中&#xff0c;有几种常用的用于视频读取、写入和处理的库和函数。其中最流行的包括OpenCV、MoviePy和imageio。以下是这些包的简要介绍和示例用法&#xff1a; opencv OpenCV是一个广泛用于计算机视觉任务的开源库&#xff0c;它也可以用来处理视频。你可以使用cv2.…

关系型数据库mysql(3)索引

目录 一.索引的概念 二.索引的作用 三.创建索引的原则依据 四.索引的分类 五.索引的创建 5.1 普通索引 5.1.1 直接创建索引 5.1.2 修改表方式创建 5.1.3 创建表的时候指定索引 5.2 唯一索引 5.2.1 直接创建唯一索引 5.2.2 修改表方式创建 5.2.3 创建表的时候指…

机器学习——决策树(三)预剪枝

观前提示&#xff1a;这是本人机器学习决策树内容的第三篇博客&#xff0c;沿用了之前相关的代码&#xff0c;包括信息增益计算函数、结点类、预测函数和分类精度计算函数 完整代码指路 DrawPixel/decisionTree.ipynb at main ndsoi/DrawPixel (github.com) 前两篇博客详见…

【项目实践day08】Mybatis向数据库中插入数据的时候返回主键值id

应用场景 创建一个实体类&#xff08;订单&#xff09;&#xff0c;现在需要将这个订单插入进数据库。但是在后续的业务逻辑中&#xff0c;需要用到这个订单的id&#xff08;主键值&#xff09; 由于订单id一般都是自增的&#xff0c;且是插入数据库的时候才会给到的值所以需要…

Linux学习-进程

目录 进程基本概念 进程相关命令 进程的创建 进程的调度 进程相关函数接口 进程的消亡 实例&#xff1a;创建九个子进程 目录 进程基本概念 进程相关命令 进程的创建 进程的调度 进程相关函数接口 进程的消亡 实例&#xff1a;创建九个子进程 exec函数…

Java设计模式之单例设计模式

单例设计模式就是保证整个软件系统中&#xff0c;某个类只能存在一个对象实例&#xff0c;并且该类只提供一个取得该对象的方法。 单例设计模式包括两种&#xff1a;饿汉式和懒汉式。 饿汉式&#xff1a; 含义&#xff1a; 在类加载时就创建并初始化单例对象。这种方式确保了…