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/x264
 
CC=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/ffmpeg

export 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

O2OA(翱途)开发平台前端安全配置建议(一)

O2OA开发平台是一个集成了多种功能的开发环境,前端安全在其中显得尤为重要。前端是用户与平台交互的直接界面,任何安全漏洞都可能被恶意用户利用,导致用户数据泄露、非法操作或系统被攻击。因此,前端安全是确保整个系统安全的第一…

B011-springcloud alibaba rpc通信 Dubbo

目录 介绍实现提供统一业务api服务提供者1.导入依赖2添加dubbo配置3编写并暴露服务 服务消费者1.导入依赖2添加dubbo配置3引用服务 测试 介绍 Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC分布式服务框架,致力于提供高性能和透明化的 RPC远程服务调用方案&#xf…

数学建模(Topsis python代码 案例)

目录 介绍: 模板: 案例: 极小型指标转化为极大型(正向化): 中间型指标转为极大型(正向化): 区间型指标转为极大型(正向化): 标…

【图像分类】基于深度学习的人脸表情识别(8种表情,ResNet网络)

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。(专栏订阅用户订阅专栏后免费提供数据集和源码一份,超级VIP用户不在服务范围之内,不想订阅专栏的兄弟们可以私信…

“洞见·智领未来——2024行业开局暨成渝(内江)服务外包产业发展大会”共商服务外包新未来新业态

3月19日-20日,由中国信息协会、中共内江市委、内江市人民政府指导,中国信息协会数字经济专委会、中共内江市东兴区委、内江市东兴区人民政府共同主办,鸿联九五集团、首席客户官百人会(CCO100)承办的“洞见 智领未来—…

【Git】第一课:Git的介绍

简介 什么是Git? Git是一个开源的分布式版本控制系统,用于跟踪代码的改变和协同开发。它最初由Linus Torvalds为了管理Linux内核开发而创建,现已成为开源软件开发中最流行的版本控制系统,没有之一。Git允许多人同时在不同的分支上工作&…

opencv各个模块介绍(1)

Core 模块:核心模块,提供了基本的数据结构和功能。 常用的核心函数: cv::Mat:表示多维数组的数据结构,是OpenCV中最常用的类之一,用于存储图像数据和进行矩阵运算。 cv::Scalar:用于表示多通道…

mac下Appuim环境安装-持续更新中

参考资料 Mac安装Appium_mac电脑安装appium-CSDN博客 安卓测试工具:Appium 环境安装(mac版本)_安卓自动化测试mac环境搭建-CSDN博客 1. 基本环境依赖 1 node.js 2 JDK(Java JDK) 3 Android SDK 4 Appium&#x…

51单片机学习9 串口通讯

51单片机学习9 串口通讯 一、串口通讯简介UARTSTC89C51RC/RD的串口资源 二、51单片机串口介绍1. 内部结构2. 寄存器(1)串口控制寄存器SCON(2)电源控制寄存器PCON 3. 计算波特率4. 串口配置步骤 三、 开发示例1. 硬件电路2. 代码实…

好用的GPTs:指定主题搜索、爬虫、数据清洗、数据分析自动化

好用的GPTs:指定主题搜索、爬虫、数据清洗、数据分析自动化 Scholar:搜索 YOLO小目标医学方面最新论文Scraper:爬虫自动化数据清洗数据分析 点击 Explore GPTs: Scholar:搜索 YOLO小目标医学方面最新论文 搜索 Scho…

超过 1200 个能够拦截在野外检测到的 2FA 的网络钓鱼工具包

超过 1200 个能够拦截在野外检测到的 2FA 的网络钓鱼工具包。 #################### 免责声明:工具本身并无好坏,希望大家以遵守《网络安全法》相关法律为前提来使用该工具,支持研究学习,切勿用于非法犯罪活动,对于恶…

【计算机】——51单片机

单片机是一种内部包含CPU、存储器和输入/输出接口等电路的集成电路(IC芯片) 单片机是单片微型计算机(Single Chip Microcomputer)的简称,用于控制领域,所以又称为微型控制器(Microcontroller U…

Eureka的介绍和作用,以及搭建

一、Eureka的介绍和作用 Eureka是Netflix开源的一种服务发现和注册工具,它为分布式系统中的服务提供了可靠的服务发现和故障转移能力。Eureka是Netflix的微服务架构的关键组件之一,它能够实时地监测和管理服务实例的状态和可用性。 在Eureka架构中&…

学成在线_视频处理_视频转码不成功

问题 当我们用xxljob进行视频处理中的转码操作时会发现视频转码不成功。即程序会进入下图所示的if语句内。 问题原因 在进行视频转码时程序会调用Mp4VideoUtil类下的 generateMp4方法,而result接收的正是该方法的返回值。那么什么时候generateMp4方法的返回值会…

SQLiteC/C++接口详细介绍sqlite3_stmt类(七)

返回:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(六) 下一篇: 无 22、sqlite3_column_database_name 用于返回结果集中指定列的数据库名称。如果结果集是由多个Join操作产生的,…

抖音视频关键词爬虫批量采集软件|视频提取下载工具

视频关键词批量采集软件 — 助力您快速获取所需视频 主要功能: 关键词批量提取视频和单独视频提取,提取后下载功能。 功能解析: 1. 关键词批量提取视频的解析 通过输入关键词进行视频搜索和提取。例如,输入“汽车配件”&#x…

四种最新算法(冠豪猪优化算法CPO、鳑鲏鱼优化算法BFO、河马优化算法HO、新雀优化算法NOA)求解机器人路径规划(提供MATLAB代码)

一、机器人路径规划介绍 移动机器人(Mobile robot,MR)的路径规划是 移动机器人研究的重要分支之,是对其进行控制的基础。根据环境信息的已知程度不同,路径规划分为基于环境信息已知的全局路径规划和基于环境信息未知或…

npm ERR! code ELIFECYCLE 解决办法

npm ERR! code ELIFECYCLE 解决办法 问题分析可能原因解决方法 问题 使用Vue脚手架构建项目的时候出现npm ERR! code ELIFECYCLE 分析可能原因 vue-cli-service 并没有加入到环境变量里 解决方法 ./node_modules/.bin/vue-cli-service serve

【Linux】多线程编程基础

💻文章目录 📄前言🌺linux线程基础线程的概念线程的优缺点线程与进程的区别 线程的创建 🌻linux线程冲突概念互斥锁函数介绍加锁的缺点 📓总结 📄前言 无论你是否为程序员,相信多线程这个词汇应…

MySQL之体系结构和基础管理

前言 本文以linux系统的MySQL为例详细介绍MySQL的体系结构,因为在实际生产环境中MySQL的运行环境都是linux系统。同时介绍MySQL的基础管理,包括用户管理和权限管理等。 MySQL体系结构 MySQL客户端/服务器工作模型 MySQL是C/S架构,工作模型…