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,一经查实,立即删除!

相关文章

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

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

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

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

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

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

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

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

数字电源浅析

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

向上生长

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

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

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

html5cssjs代码 036 CSS默认值

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

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

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

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

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

Linux学习-进程

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

人脸表情识别系统项目完整实现详解——(三)训练MobileNet深度神经网络识别表情

摘要:之前的表情识别系统升级到v3.0版本,本篇博客详细介绍使用PyTorch框架来构建并训练MobileNet V3模型以进行实现表情识别,给出了完整实现代码和数据集可供下载。从构建数据集、搭建深度学习模型、数据增强、早停等多种技术,到模…

计算联合体union的大小

一:联合类型的定义 联合也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体) 比如:共用了 i 这个较大的空间 二: 联合的特点 …

MySQL--Buffer Pool

虽然说 MySQL 的数据是存储在磁盘里的,但是也不能每次都从磁盘里面读取数据,这样性能是极差的。为此,Innodb 存储引擎设计了一个缓冲池(Buffer Pool),来提高数据库的读写性能。 有了缓冲池后: …

Eclipse For ABAP:安装依赖报错

1.安装好Eclipse后需要添加依赖,这里的地址: https://tools.hana.ondemand.com/latest 全部勾选等待安装结束; 重启后报错:ABAP communication layer is not configured properly. This might be caused by missing Microsoft Visual C++ 2013 (x64) Runtime DLLs. Consu…

小程序云开发实战:通用企业产品信息展示小程序

之前做小程序都是自己搭建数据管理后台,比如我之前做的小程序:一搜就学,就是使用java来做管理后台,小程序做前端展示。但是对于简单的小程序来说,做一套管理后台有点拿大炮打蚊子,所以使用云开发就是不错的…

【开源】SpringBoot框架开发知识图谱构建系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 知识图谱模块2.2 知识点模块2.3 学生测评模块2.4 学生成绩模块 三、系统展示四、核心代码4.1 查询知识点4.2 新增知识点4.3 查询知识图谱4.4 查询学生成绩4.5 查询学生成绩 五、免责说明 一、摘要 1.1 项目介绍 基于J…

论文阅读:Forget-Me-Not: Learning to Forget in Text-to-Image Diffusion Models

Forget-Me-Not: Learning to Forget in Text-to-Image Diffusion Models 论文链接 代码链接 这篇文章提出了Forget-Me-Not (FMN),用来消除文生图扩散模型中的特定内容。FMN的流程图如下: 可以看到,FMN的损失函数是最小化要消除的概念对应的…

一文了解AI长文本工具:Kimi Chat;与ChatGPT比较对比

一文了解AI长文本工具:Kimi Chat;与ChatGPT比较对比 在人工智能领域,ChatGPT、Claude2.1和Kimi Chat都是备受关注的大型模型。它们在文本生成、理解和处理方面展现了强大的能力。本文将深入探讨这三个工具的核心功能、优劣势以及适用场景&am…

Markdown快速入门(常用技巧)

目录 说明常用书写技巧1.标题分级2.代码块3.字体4.引用语法5.分割线6.图片插入(本地/网络)7.超链接8.列表9.表格10.换行(两个空格)11.插入公式12.脚注 说明 markdown实际上类似于网页,可以根据喜欢设置其样式变化,创建…