关于在windows系统中编译ffmpeg并导入到自己项目中这件事

news2025/1/12 19:00:20

关于在windows系统中编译ffmpeg并导入到自己项目中这件事

前因(可跳过不看)

前阵子由于秋招需求,写了一个简易的安卓播放器,最终因为时间问题还有一些功能没有实现着实可惜,如:倍速播放,快进操作,从其它渠道获取音视频流进行播放。由于对安卓开发的不熟悉,在安卓平台上调试问题的手段比较有限,比较疑惑的是有时候打断点可以走到程序中的某一步,有时候走不到。因此现在打算开发一款基于QT的音视频播放器,把遗憾一次性补齐。

编译ffmpeg

先前是在linux服务上使用ndk工具链编译的ffmpeg源代码,而windows操作系统中由于不具备一些必备的环境,网上也搜索了很多文章,最后断定windows中编译ffmpeg极具难度,不好直接编译,因此就需要在windows环境中构建linux环境。这里博主参考了网上用的比较多的方案MSYS.使用windows中的c语言编译器,Mingw64进行编译,那么废话不多说,下面看看需要准备哪些前提:

  • MSYS: 你可以把它理解成,是在windows环境下,模拟了linux操作系统,但是本质还是windows,但是它具备linux中的常用工具,相当于是把linux中的一些常用命令搬到windows上了
  • FFMPEG 4.3.8: ffmpeg的源码,我用的这个版本,可自行选择版本
  • CLION: JetBrain出的一款很好用的c语言IDE,从java转过来的觉得很亲切,可以很方便的在windows环境中使用cmake进行管理项目。

MSYS的准备工作

进入到MSYS的官网进行下载

下载完成之后直接无脑下一步安装就好了,中间有一步需要选择安装根目录,我这里怕出幺蛾子,直接默认路径了。

安装完成之后,可以在所选根路径下看到如下内容(博主这里不是刚下完之后的截图,但是大差也不差)

从开始处可以看到如下内容。

我们这里主要使用MingW64环境对ffmpeg项目进行编译处理。因此打开MSYS2 MINGW64

刚安装完这边应该是没有gcc,cmake,make这些环境的,因此需要进行安装。MSYS2环境中安装使用的是pacman命令,这里默认是请求的外网,没有科技的小伙伴可能访问速度较慢(压根没办法访问)。因此需要先把镜像源换成清华镜像源。执行如下命令即可。

sed -i "s#https\?://mirror.msys2.org/#https://mirrors.tuna.tsinghua.edu.cn/msys2/#g" /etc/pacman.d/mirrorlist*

安装依赖包

pacman -S mingw-w64-ucrt-x86_64-gcc
pacman -S mingw-w64-ucrt-x86_64-gdb
pacman -S mingw-w64-x86_64-toolchain git make automake autoconf perl libtool mingw-w64-x86_64-cmake pkg-config yasm diffutils nasm

安装完成之后,可以输入命令尝试一下。像下面这样子基本就ok了

至此MSYS的前置工作就ok了。

FFMPEG的准备工作

进入到ffmpeg的官网下载ffmpeg源码,此处需要一点魔法,没有魔法的可以下载我上传至网盘中的源码。

通过网盘分享的文件:ffmpeg-4.3.8.tar.bz2
链接: https://pan.baidu.com/s/18ldKGCp0-O1D2WezloY-vQ?pwd=tq29 提取码: tq29 
--来自百度网盘超级会员v6的分享

下载完成后解压到MSYS安装的路径中,如下:

编写脚本编译ffmpeg。(这里编译过程是不带H264库的,需要h264的可自行先在msys中编译安装h264,再在ffmpeg的configure阶段选择h264)

basepath=$(cd `dirname $0`; pwd)

build_ffmpeg() {
    cd $basepath/ffmpeg-4.3.8
    pwd
    ./configure --prefix=${basepath}/ffmpeg_install \
                --enable-static \
                --enable-shared \
                --enable-gpl
    make
    make install
}
build_ffmpeg

运行脚本即可完成ffmpeg安装,安装目录内容如下:

主要使用bin目录下的dll动态库和include目录下的头文件。

创建项目导入ffmpeg

使用CLION创建项目,将ffmpeg编译好的四个文件夹,放到项目根目录下。

编辑CMakeLists.txt配置文件,内容如下:

cmake_minimum_required(VERSION 3.22)

project(THIRDPART_TEST)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(FFMPEG_DIR ${CMAKE_SOURCE_DIR}/ffmpeg)
add_definitions(-D__STDC_CONSTANT_MACROS=1)

# 相当于-I
include_directories(${FFMPEG_DIR}/include)
# 相当于-L
link_directories(${FFMPEG_DIR}/bin)
add_executable(test main.cpp)


# 添加ffmpeg的动态库
target_link_libraries(test avcodec-58 avdevice-58 avfilter-7 avformat-58 avutil-56 postproc-55 swresample-3 swscale-5)
# 配置运行时链接地址rpath,没有这个的话,运行的时候链接不到动态库
set_target_properties(test PROPERTIES
    LINK_FLAGS "${LINK_FLAGS} -Wl,--enable-auto-import,-rpath,${FFMPEG_DIR}/bin"
)

至此ffmpeg就导入到项目中了,运行效果如下:

由于ffmpeg是一个纯C的库,因此当在c++项目中使用的时候导入头文件时,需要加入extern "C",否则会报链接不到的错误如下,我之前还一直以为是我库导入失败了,浪费了不少时间,罪过罪过,以后得注意了。

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

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

相关文章

word中电流符号i或者j,这两个字母的头上的点会消失---完美解决办法

上图中,是我已经改好的格式。 具体解决办法是将公式转成LATEX格式,然后在字母i或者j前加上//,再转换会unicode,专业形式即可解决。更快的解决办法就是复制我在word文档里面写的。 word文档放在资源里面了,有需要自取即…

【C++】std::string和size()函数进阶解析

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯基础知识:C 中的std::string字符串的基础概念size() 函数基础使用size()实例:计算字符串长度 💯基于size()的字符串解析和访问方式代码实…

《OpenCV计算机视觉实战项目》——银行卡号识别

文章目录 项目任务及要求项目实现思路项目实现及代码导入模块设置参数对模版图像中数字的定位处理银行卡的图像处理读取输入图像,预处理找到数字边框使用模版匹配,计算匹配得分 画出并打印结果 项目任务及要求 任务书: 要为某家银行设计一套…

【开发环境搭建篇】Visual Studio 2022 安装和使用

本文收录于 《C编程入门》专栏,从零基础开始,介绍C编程入门相关的内容,欢迎关注,谢谢! 文章目录 一、前言二、下载三、安装四、使用五、总结 一、前言 本文介绍如何在Windows环境下安装Visual Studio 2022。 什么是Vi…

【面试题】技术场景 5、日志采集ELK

日志采集的重要性与采集方式 重要性:在项目开发、测试及生产环境中,日志是定位系统问题的关键手段,对系统维护与问题排查至关重要。采集方式 常规采集:按天保存日志文件至专门目录,文件名包含项目名、端口及日期&…

matlab的绘图的标题中(title)添加标量以及格式化输出

有时候我们需要在matlab绘制的图像的标题中添加一些变量,这样在修改某些参数后,标题会跟着一块儿变。可以采用如下的方法: x -10:0.1:10; %x轴的范围 mu 0; %均值 sigma 1; %标准差 y normpdf(x,mu,sigma); %使用normpdf函数生成高斯函数…

element plus 使用 upload 组件达到上传数量限制时隐藏上传按钮

最近在重构项目,使用了 element plus UI框架,有个功能是实现图片上传,且限制只能上传一张图片,结果,发现,可以限制只上传一张图片,但是上传按钮还在,如图: 解决办法&…

简单说一下 类

类的定义 类是用来对一个实体(对象)进行描述,类就是用来描述这个对象具有一些什么属性。 类的定义格式 //创建类 class ClassName{ field; //简单概述为字段(属性)或者成员变量 method; //简单概述为行为或者是成员方法 } cl…

HOW - Form 表单 label 和 wrapper 对齐场景

一、背景 在日常使用 表单 时&#xff0c;我们一般有如下布局&#xff1a; 可以通过 Form 表单提供的配置直接设置&#xff1a; <Formform{form}labelCol{{ span: 4 }}wrapperCol{{ span: 20 }}onFinish{handleSubmit}><Form.Itemlabel"输入框"name"…

01 Oracle自学环境搭建(Windows系统)

1 Oracle12C安装 1.1 下载 官网地址&#xff1a;https://www.oracle.com/ 进入官网→Resource→Customer Downloads 如果没有登录&#xff0c;会提示登录后后才能下载 选择适合自己的版本&#xff08;我电脑是Windows系统 64位&#xff09; 选择需要的安装包进行下载 双击下载…

vue el-table 数据变化后,高度渲染问题

场景&#xff1a;el-table设置了height属性&#xff0c;但是切换查询条件后再次点击查询重新获取data时&#xff0c;el-table渲染的高度会有问题&#xff0c;滚动区域变矮了。 解决办法&#xff1a;使用doLayout方法‌&#xff0c;在表格数据渲染后调用doLayout方法可以重新布局…

vue3+ts+element-plus 输入框el-input设置背景颜色

普通情况&#xff1a; 组件内容&#xff1a; <el-input v-model"applyBasicInfo.outerApplyId"/> 样式设置&#xff1a; ::v-deep .el-input__wrapper {background-color: pink; }// 也可以这样设置 ::v-deep(.el-input__wrapper) {background-color: pink…

【漫话机器学习系列】044.热点对特性的影响(Effect Of One Hot On Feature Importance)

热点对特性的重要性影响&#xff08;Effect of One-Hot Encoding on Feature Importance&#xff09; 一热编码&#xff08;One-Hot Encoding&#xff09; 是处理类别型数据的常用方法&#xff0c;将每个类别特征转换为一组独立的二进制特征。这种方法在提高模型处理非数值数据…

使用MATLAB正则表达式从文本文件中提取数据

使用MATLAB正则表达式从文本文件中提取数据 使用Python正则表达式从文本文件中提取数据的代码请看这篇文章使用正则表达式读取文本数据【Python】-CSDN博客 文本数据格式 需要提取 V 后面的数据, 并绘制出曲线. index 1V 0.000000W 0.000000E_theta 0.000000UINV 0.0…

JAVA:Spring Boot 集成 JWT 实现身份验证的技术指南

1、简述 在现代Web开发中&#xff0c;安全性尤为重要。为了确保用户的身份&#xff0c;JSON Web Token&#xff08;JWT&#xff09;作为一种轻量级且无状态的身份验证方案&#xff0c;广泛应用于微服务和分布式系统中。本篇博客将讲解如何在Spring Boot 中集成JWT实现身份验证…

PHP进阶-在Ubuntu上搭建LAMP环境教程

本文将为您提供一个在Ubuntu服务器上搭建LAMP&#xff08;Linux, Apache, MySQL, PHP&#xff09;环境的完整指南。通过本文&#xff0c;您将学习如何安装和配置Apache、MySQL、PHP&#xff0c;并将您的PHP项目部署到服务器上。本文适用于Ubuntu 20.04及更高版本。 一、系统更新…

【算法】一阶低通滤波

目录 1.背景 2.推导 2.1基础知识 2.2 公式推导 3.截止频率 3.怎么做 4.效果 1.背景 在电机的闭环过程中&#xff0c;无法避开的一点就是电流环&#xff0c;电流环需要采集电流数据&#xff0c;然后闭环输出。在电流环采集的过程中&#xff0c;数据会有很多高频噪声&#xf…

excel VBA 基础教程

这里写目录标题 快捷键选择所有有内容的地方 调试VBA录制宏&#xff0c;打开VBA开发工具录制宏,相当于excel自动写代码&#xff08;两个表格内容完全一致才可以&#xff09; 查看宏代码保持含有宏程序的文件xlsm后缀&#xff08;注意很容易有病毒&#xff09;宏文件安全设置 使…

获取IP地区

包 https://packagist.org/packages/geoip2/geoip2#v3.1.0 用composer加载包 composer require geoip2/geoip2 mmdb下载 https://github.com/P3TERX/GeoLite.mmdb?tabreadme-ov-file

嵌入式系统Linux实时化(二)Xenomai技术框架分析

Xenomai 是 Linux 内核的一个实时开发框架。它希望通过无缝地集成到Linux 环境中来给用户空间应用程序提供全面的、与接口无关的硬实时性能。Xenomai 项目始于2001年8月&#xff0c;作为一个自由软件项目&#xff0c;完全遵守GNU/Linux自由软件协议。2003 年它和RTAI项目合并推…