FFmpeg编译安装(windows环境)以及在vs2022中调用

news2025/1/12 6:18:51

文章目录

  • 下载源码
  • 环境准备
    • 下载msys
    • 换源
    • 下载依赖
    • 源码位置
  • 开始编译
    • 编译x264
    • 编译ffmpeg
  • 在VS2022写cpp调用ffmpeg

下载源码

直接在官网下载压缩包
这个应该是目前(2023/10/24)最新的一个版本。下载之后是这个样子:
在这里插入图片描述
我打算添加外部依赖x264,也直接去官网下载一个压缩包来。

环境准备

下载msys

我这里选择用msys2+mingw的方式来编译源码。首先去msys官网下载一下exe文件。可以傻瓜式安装。默认是装到c盘目录下,可以直接修改c为D等。避免后续出现问题。我装到了E盘下
在这里插入图片描述

换源

因为需要下载东西,所以换一下源。在这里:
在这里插入图片描述=
用记事本软件(比如vscode之类)打开这几个 .xxx32/64的文件,找到清华和中科大的源,移动到最上方即可
在这里插入图片描述
以某一个为例,大概就是在圈的地方找到这两个移动到箭头的位置。

下载依赖

接着就可以下载一些待会用到的依赖。打开msys中的这个终端,可以在开始菜单找到
在这里插入图片描述
先更新一下包

pacman -Syu # 更新所有库

然后好像是会重启一下(忘了),再来一下这个

pacman -Sy

接着就可以下载依赖

pacman -S mingw-w64-x86_64-toolchain  # mingw64编译工具链,win下的gcc
pacman -S base-devel    # 一些基本的编译工具
pacman -S yasm nasm     # 汇编器
pacman -S mingw-w64-x86_64-SDL2 # SDL2 是ffmpeg依赖的,因为没有它ffpaly不能用

补充一下,更新库时候直接enter全部更新,一路YYY同意。pacman的使用可自行查询,这里不再赘述。

mingw下载成功之后终端输入命令查看验证一下:
在这里插入图片描述
接下来可以把mingw的bin目录配置到环境变量(自行操作),注意是msys文件夹里面的mingw,一开始应该是空的,在我们下载好上面的工具之后就会看到有东西。
在这里插入图片描述

源码位置

搜寻n多个网上的教程之后,我选择这样安排
在这里插入图片描述
把ffmpeg和x264的源码解压到msys路径下的home路径下的名字为你的电脑用户名的看路径下,再新建俩空文件夹,用来安装ffmpeg和x264。如图所示,source文件夹是源码,install是准备安装的文件夹。

开始编译

编译x264

可以看到上面图中有两个sh脚本文件,

#!/bin/sh
basepath=$(cd `dirname $0`;pwd)
echo ${basepath}

cd ${basepath}/x264-master-source   # 根据路径名称自行修改
pwd

./configure --prefix=${basepath}/x264-master-install --enable-shared
make -j10  这个数字是线程数,根据自己电脑自行选择
make install

./configure命令,它的参数会指导编译器应该如何编译代码。这里 --prefix 参数指定了编译好的库文件的安装路径,可以自己任意指定。 --enable-shared 代表编译动态库。如果你需要静态库,那么需要加入 -enable-static 参数。
编写好脚本之后,用mingw64终端进入到这个目录下,可以通过以下命令执行

./build-x264.sh

成功之后便可以在我们设置的安装目录下看到编译好的文件
在这里插入图片描述

编译ffmpeg

同样的,搞一个脚本文件

#!/bin/sh
basepath=$(cd `dirname $0`;pwd)
echo ${basepath}

cd ${basepath}/ffmpeg-6.0-source
pwd

export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:/E/msys64/home/luv_x/x264-master-install/lib/pkgconfig
echo ${PKG_CONFIG_PATH}

./configure --prefix=${basepath}/ffmpeg-6.0-install \
--enable-sdl2 --enable-nonfree --enable-muxer=mp4 --enable-debug \
--enable-gpl --enable-libx264 \
--disable-static --enable-shared \
--extra-cflags=-I${basepath}/x264-master-install/include --extra-ldflags=-L${basepath}/x264-master-install/lib

make -j16
make install

因为要把x264搞进去,所以最后一行的的功能就事找到它。

但不要急着执行脚本,6.0版本似乎有点小bug,需要替换掉一个源代码文件
路径大概是这:

msys64\home\luv_x\ffmpeg-6.0-source\libavcodec\x86\mathops.h

就是这个.h文件,打开之后替换为下代码。如下:

/*
 * simple math operations
 * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> et al
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#ifndef AVCODEC_X86_MATHOPS_H
#define AVCODEC_X86_MATHOPS_H

#include "config.h"

#include "libavutil/common.h"
#include "libavutil/x86/asm.h"

#if HAVE_INLINE_ASM

#if ARCH_X86_32

#define MULL MULL
static av_always_inline av_const int MULL(int a, int b, unsigned shift)
{
    int rt, dummy;
    if (__builtin_constant_p(shift))
    __asm__ (
        "imull %3               \n\t"
        "shrdl %4, %%edx, %%eax \n\t"
        :"=a"(rt), "=d"(dummy)
        :"a"(a), "rm"(b), "i"(shift & 0x1F)
    );
    else
        __asm__ (
            "imull %3               \n\t"
            "shrdl %4, %%edx, %%eax \n\t"
            :"=a"(rt), "=d"(dummy)
            :"a"(a), "rm"(b), "c"((uint8_t)shift)
        );
    return rt;
}

#define MULH MULH
static av_always_inline av_const int MULH(int a, int b)
{
    int rt, dummy;
    __asm__ (
        "imull %3"
        :"=d"(rt), "=a"(dummy)
        :"a"(a), "rm"(b)
    );
    return rt;
}

#define MUL64 MUL64
static av_always_inline av_const int64_t MUL64(int a, int b)
{
    int64_t rt;
    __asm__ (
        "imull %2"
        :"=A"(rt)
        :"a"(a), "rm"(b)
    );
    return rt;
}

#endif /* ARCH_X86_32 */

#if HAVE_I686
/* median of 3 */
#define mid_pred mid_pred
static inline av_const int mid_pred(int a, int b, int c)
{
    int i=b;
    __asm__ (
        "cmp    %2, %1 \n\t"
        "cmovg  %1, %0 \n\t"
        "cmovg  %2, %1 \n\t"
        "cmp    %3, %1 \n\t"
        "cmovl  %3, %1 \n\t"
        "cmp    %1, %0 \n\t"
        "cmovg  %1, %0 \n\t"
        :"+&r"(i), "+&r"(a)
        :"r"(b), "r"(c)
    );
    return i;
}

#if HAVE_6REGS
#define COPY3_IF_LT(x, y, a, b, c, d)\
__asm__ volatile(\
    "cmpl  %0, %3       \n\t"\
    "cmovl %3, %0       \n\t"\
    "cmovl %4, %1       \n\t"\
    "cmovl %5, %2       \n\t"\
    : "+&r" (x), "+&r" (a), "+r" (c)\
    : "r" (y), "r" (b), "r" (d)\
);
#endif /* HAVE_6REGS */

#endif /* HAVE_I686 */

#define MASK_ABS(mask, level)                   \
    __asm__ ("cdq                    \n\t"      \
             "xorl %1, %0            \n\t"      \
             "subl %1, %0            \n\t"      \
             : "+a"(level), "=&d"(mask))

// avoid +32 for shift optimization (gcc should do that ...)
#define NEG_SSR32 NEG_SSR32
static inline  int32_t NEG_SSR32( int32_t a, int8_t s){
    if (__builtin_constant_p(s))
    __asm__ ("sarl %1, %0\n\t"
         : "+r" (a)
         : "i" (-s & 0x1F)
    );
    else
        __asm__ ("sarl %1, %0\n\t"
               : "+r" (a)
               : "c" ((uint8_t)(-s))
        );
    return a;
}

#define NEG_USR32 NEG_USR32
static inline uint32_t NEG_USR32(uint32_t a, int8_t s){
    if (__builtin_constant_p(s))
    __asm__ ("shrl %1, %0\n\t"
         : "+r" (a)
         : "i" (-s & 0x1F)
    );
    else
        __asm__ ("shrl %1, %0\n\t"
               : "+r" (a)
               : "c" ((uint8_t)(-s))
        );
    return a;
}

#endif /* HAVE_INLINE_ASM */
#endif /* AVCODEC_X86_MATHOPS_H */

这是从官网的github源码里嫖的,大致三个月前更新的,换成这个之后就可以安心编译了。可能编译时间比较久一些,也可以裁剪一些功能,小白就不多赘述了,可以自行查阅资料了解。
成功后安装目录应该是这样的:
在这里插入图片描述
bin目录下有dll,lib,exe文件,include里是头文件,不知为什么lib里面没有库文件,我选择从bin目录下粘贴过去。
还要从x264的bin目录粘到这边bin目录一个在这里插入图片描述
,然后在终端验证一下:
在这里插入图片描述
至此,编译安装工作就完成了,后续如果需要安装别的扩展格式,再配置编译就可以了。

在VS2022写cpp调用ffmpeg

新建一个空项目后,
在这里插入图片描述

点击上方菜单中的项目,然后属性
在这里插入图片描述
在这里插入图片描述
然后在包含目录中添加ffmpeg安装目录下的include文件夹,库目录添加lib文件夹,接着添加依赖项
在这里插入图片描述
其实就是生成的lib文件名字,都加进去

avcodec.lib
avdevice.lib
avfilter.lib
avformat.lib
avutil.lib
postproc.lib
swscale.lib
swresample.lib

然后点击确定,因为我新建的是cpp文件,所以要用extern添加头文件

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

然后用这两行代码测试一下

cout << avcodec_configuration() << endl;
cout << "FFmpeg 版本 " << av_version_info() << endl;

在这里插入图片描述
运行结果出现我们的配置情况和版本信息,大功告成!

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

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

相关文章

应用系统集成-概述

应用系统集成-概述 随着网络技术的发展和日益增长的软件复杂度&#xff0c;几乎已经不存在一个完全孤立的应用系统了&#xff0c;万物互联在应用层面就是系统互联&#xff0c;应用系统集成成为软件系统架构是需要考虑的核心问题之一。 基本介绍 应用系统集成面临的挑战 所有的…

【网络编程】一文带你搞懂HTTPS协议

文章目录 一、什么是HTTPS协议二、关于加密三、数据摘要 | 数据指纹 | 数字签名四、HTTPS的工作过程探究方案1&#xff1a;只使用对称加密方案2&#xff1a;只使用非对称加密方案3&#xff1a;双方都使用非对称加密方案4&#xff1a;非对称加密 对称加密中间人攻击 五、引入证…

重要功能更新:妙手正式接入SHEIN供货模式(OBM)店铺,赋能卖家把握出海新机遇!

继接入SHEIN平台模式店铺之后&#xff0c;妙手ERP积极响应卖家需求&#xff0c;正式接入SHEIN供货模式&#xff08;OBM&#xff09;店铺&#xff0c;并支持产品采集、批量刊登、产品管理等功能&#xff0c;帮助跨境卖家快速上品、高效运营&#xff0c;把握出海新机遇。 SHEIN供…

天软特色因子看板(2023.10 第11期)

该因子看板跟踪天软特色因子A05005(近一日单笔流通金额占比(%)&#xff0c;该因子为近一个日单笔流通金额占比因子&#xff0c;用以刻/画股票在收盘时&#xff0c;力资金在总交易金额中所占的比重。 今日为该因子跟踪第11期&#xff0c;跟踪其在SW801130 (申万纺织服装) 中的表…

TwinCAT3 从入门到放弃系列第一篇

TwinCAT3介绍 TwinCAT3是倍福公司基于PC平台和Window操作系统的控制软件。TwinCAT全称是The Windows Control and Automation Technology&#xff0c;基于window的自动化控制技术。 TwinCAT是1995年首次推出市场&#xff0c;现存有TwinCAT2和TwinCAT3两种版本&#xff0c;TC2是…

软件兼容性测试的测试内容有哪些?

软件兼容性测试是软件开发过程中至关重要的一项测试环节。它是指验证软件在不同平台、操作系统、硬件设备或网络环境下的运行情况&#xff0c;以确保软件在各种环境下都能正常工作并与其他软件或系统相互配合。兼容性测试能够帮助开发者发现和修复可能存在的兼容性问题&#xf…

PMP备考|通关宝典

1建立知识全景图 PMBOK 知识框架&#xff1a;五大过程组、十大知识领域、49个过程、132个工具和技术&#xff08;PMBOK6 P686&#xff09;。 2项目 项目具有独特性、临时性、渐进明细的特点 组织类型&#xff1a; ▶ 职能型组织&#xff1a;项目联络员&#xff0c;PM职权小…

SSL证书品牌参差不齐?品牌太多不知道怎么选择?

很多采购人认为SSL证书品牌太多&#xff0c;差异很大&#xff0c;安全性能以保证&#xff1f; 错错误&#xff0c;大错特错&#xff0c;其实整个互联网SSL证书绕来绕去就三家&#xff01;而且是无法替代的&#xff01; 举列&#xff1a;360搜索表面上起来用的是沃通证书&…

深入理解Java IO流:概念、类型、缓冲与性能

文章目录 什么是I/O流&#xff1f;I/O流的类型字节流&#xff08;Byte Streams&#xff09;字符流&#xff08;Character Streams&#xff09; 节点流与处理流节点流&#xff08;Node Streams&#xff09;处理流&#xff08;Processing Streams&#xff09; 带缓冲的I/O流I/O性…

CSS笔记-狂神

1、什么是CSS 如何学习 CSS是什么CSS怎么用&#xff08;快速入门&#xff09;CSS选择器&#xff08;重点难点&#xff09;美化网页&#xff08;文字&#xff0c;阴影&#xff0c;超链接&#xff0c;列表&#xff0c;渐变…&#xff09;盒子模型浮动定位网页动画&#xff08;特…

PAM从入门到精通(二十二)

接前一篇文章&#xff1a;PAM从入门到精通&#xff08;二十一&#xff09; 本文参考&#xff1a; 《The Linux-PAM Application Developers Guide》 先再来重温一下PAM系统架构&#xff1a; 更加形象的形式&#xff1a; 七、PAM-API各函数源码详解 前边的文章讲解了各PAM-API…

如何复制禁止复制的内容

今天找到一段代码&#xff0c;但是复制时页面提示“这个是VIP会员才有的权限”。我该怎么复制呢。 现在的平台大都是用钱说话&#xff0c;以便响应知识付费的主张。对错我就不说了&#xff0c;我认为既然我有权利看到代码&#xff0c;当然也有权把他复制下来。这并不涉及侵权。…

DNS、ICMP和NAT

DNS、ICMP和NAT 文章目录 DNS、ICMP和NATDNS是什么域名系统的名字空间域名空间的层次结构域名的分配和管理顶级类别域名 DNS域名解析过程递归查询迭代查询 高速缓存 ICMPICMP的定位ICMP协议的功能 ICMP的报文格式ping命令traceroute命令 NATNAT技术背景NAT IP转换过程NAPTNAT的…

autohotkey v1

autohotkey v1 文档 https://www.autohotkey.com/docs/v1/ 编辑器 https://www.autohotkey.com/scite4ahk/ https://www.autohotkey.com/

基于Python实现手写文字识别

基于Python实现手写文字识别&#xff0c;对学生日常作业及考试试卷中的手写内容进行自动识别&#xff0c;实现学生作业、考卷的线上批阅及教学数据的自动分析&#xff0c;提升教职人员工作效率&#xff0c;促进教学管理的数字化和智能化。 目录 引言背景介绍目标和意义 手写文字…

解决chrome浏览器netWork响应数据中文乱码的问题

项目中遇到返回值出现如下图所示情况&#xff1a; 开发起来很麻烦&#xff0c;可以通过添加Source code扩展程序解决。 具体操作&#xff1a; 1、下载 地址&#xff1a; https://github.com/jinliming2/Chrome-Charset/releases 或者&#xff1a;https://download.csdn.net/do…

循环队列c语言版

一、循环队列结构体 typedef int QueueDataType; #define CQ_MAX_SIZE 10typedef struct CircularQueue {QueueDataType data[CQ_MAX_SIZE];/**标记队列首*/QueueDataType head;/**标记队列尾部*/QueueDataType rear;} CircularQueue; 二、循环队列操作函数声明 /**创建队…

项目部署Linux一般步骤

1、最小化安装centos7-环境准备 安装epel-release 安装epel-release&#xff0c;因为有些rpm包在官方库中找不到。前提是保证可以联网 yum install -y epel-release 修改IP net-tools net-tool&#xff1a;工具包集合&#xff0c;包含ifconfig等命令 yum install -y net-…

【技能树笔记】网络篇——练习题解析(九)

目录 前言 一、OSPF双栈 1.1 OSPFv3 LSA 1.2 OSPFv3 二、ISIS双栈 2.1 ISISv6 2.2 ISIS高级特性 三、BGP双栈 四、PIM双栈 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filot…

SpringDoc API文档工具集成SpringBoot - Swagger3

1、引言 之前在Spring Boot项目中一直使用的是SpringFox提供的Swagger库&#xff0c;发现已经超过3年没出新版本了&#xff01;SpringDoc是一款可以结合Spring Boot使用的API文档生成工具&#xff0c;基于OpenAPI 3&#xff0c;是一款更好用的Swagger库&#xff01;值得一提的是…