当前位置: 首页 > news >正文

VS2022配置FFMPEG库基础教程

1 简介

在这里插入图片描述

1.1 起源与发展历程

FFmpeg诞生于2000年,由法国工程师Fabrice Bellard主导开发,其名称源自"Fast Forward MPEG",初期定位为多媒体编解码工具。2004年后由Michael Niedermayer接任维护,逐步发展成为包含音视频采集、格式转换、流媒体处理等完整功能的开源项目。经过25年迭代,当前最新7.x版本已支持H.266/VVC、AV1等新一代编码标准,在全球开发者社区贡献下形成包含7大核心库的生态系统。

1.2 核心功能与架构组成

该工具链以libavcodec编解码库为核心,涵盖libavformat(封装格式处理)、libswscale(图像缩放、颜色空间转化等)、libavfilter(滤镜系统)等模块,支持200+种媒体格式的相互转化。其命令行工具集可执行视频剪辑、帧率调整、硬件加速转码等操作,广泛应用于直播推流、视频会议、智能安防等领域。通过LGPL/GPL协议保障开源生态,已成为VLC、Blender等知名软件的基础依赖组件。

2 下载

为了避免复杂的编译过程,达到快速上手使用的目的,我们推荐使用官方预编译包。下载地址:官网
在这里插入图片描述
在这里插入图片描述

注意,一定选择含share字符的编译包。

3 VS2022开发FFMPEG的环境配置

FFMPEG作为一个标准的第三方库,其配置思路是与OpenCV、OpenVINO等是一样的。在工程里面,配置好头文件路径、库文件路径和名称以及二进制文件的路径。下面,我实际演示下如何一步步进行配置。

3.1 解压安装包

将下载的压缩包,解压至无中文路径的目录中,我把它解压在D:/Tool目录下。
在这里插入图片描述
可以大致看下,FFMPEG的目录结构:

  • bin:二进制文件目录。
  • doc:使用帮助文档。
  • include:头文件。
  • lib:库文件。
  • presets:一些标准分辨率的vpx的预设文件。

3.2 新建工程

使用VS2022新建控制台工程,空项目即可。
在这里插入图片描述

3.3 配置头文件

右键项目 →属性→VC++ 目录,包含目录增加D:\Tool\ffmpeg-7.1-full_build-shared\include
在这里插入图片描述

3.4 配置库文件

右键项目 →属性→VC++ 目录,库目录增加D:\Tool\ffmpeg-7.1-full_build-shared\lib
在这里插入图片描述
配置库名称:
在这里插入图片描述

3.5 配置二进制文件

建议直接使用环境变量进行配置,方便省事。
在这里插入图片描述

3.6 环境测试

#include <iostream>
extern "C" {
#include <libavcodec/avcodec.h>
}int main() {std::cout << "FFmpeg版本: " << avcodec_version() << std::endl;return 0;
}

4、读取mp4文件,opencv显示。

为验证FFMPEG的环境是否彻底安装完成,我们采用一个小的例子程序,进行验证。读取一个mp4文件,使用FFMPEG进行格式解析,并转为RGB格式,使用opencv进行显示。

#include <iostream>
#include <opencv2/opencv.hpp>extern "C" {
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
}int main() {// FFmpeg初始化avformat_network_init();AVFormatContext* fmt_ctx = nullptr;// 打开媒体文件(替换为你的MP4路径)const char* filename = "input.mp4";if(avformat_open_input(&fmt_ctx, filename, nullptr, nullptr) != 0) {std::cerr << "无法打开文件" << std::endl;return -1;}// 查找视频流信息if(avformat_find_stream_info(fmt_ctx, nullptr) < 0) {std::cerr << "无法获取流信息" << std::endl;avformat_close_input(&fmt_ctx);return -1;}// 定位视频流int video_stream = -1;AVCodecParameters* codec_par = nullptr;for(int i = 0; i < fmt_ctx->nb_streams; i++) {if(fmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {video_stream = i;codec_par = fmt_ctx->streams[i]->codecpar;break;}}if(video_stream == -1) {std::cerr << "未找到视频流" << std::endl;avformat_close_input(&fmt_ctx);return -1;}// 获取解码器const AVCodec* codec = avcodec_find_decoder(codec_par->codec_id);if(!codec) {std::cerr << "不支持的解码器" << std::endl;avformat_close_input(&fmt_ctx);return -1;}// 创建解码上下文AVCodecContext* codec_ctx = avcodec_alloc_context3(codec);avcodec_parameters_to_context(codec_ctx, codec_par);if(avcodec_open2(codec_ctx, codec, nullptr) < 0) {std::cerr << "无法打开解码器" << std::endl;avcodec_free_context(&codec_ctx);avformat_close_input(&fmt_ctx);return -1;}// 初始化SWS转换上下文SwsContext* sws_ctx = sws_getContext(codec_ctx->width, codec_ctx->height, codec_ctx->pix_fmt,codec_ctx->width, codec_ctx->height, AV_PIX_FMT_RGB24,SWS_BILINEAR, nullptr, nullptr, nullptr);// 分配帧内存AVFrame* frame = av_frame_alloc();AVFrame* rgb_frame = av_frame_alloc();int buffer_size = av_image_get_buffer_size(AV_PIX_FMT_RGB24, codec_ctx->width, codec_ctx->height, 1);uint8_t* buffer = (uint8_t*)av_malloc(buffer_size);av_image_fill_arrays(rgb_frame->data, rgb_frame->linesize, buffer,AV_PIX_FMT_RGB24, codec_ctx->width, codec_ctx->height, 1);AVPacket* pkt = av_packet_alloc();cv::namedWindow("Video", cv::WINDOW_AUTOSIZE);// 主解码循环while(av_read_frame(fmt_ctx, pkt) >= 0) {if(pkt->stream_index == video_stream) {int ret = avcodec_send_packet(codec_ctx, pkt);if(ret < 0) continue;while(ret >= 0) {ret = avcodec_receive_frame(codec_ctx, frame);if(ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) break;if(ret < 0) {std::cerr << "解码错误" << std::endl;break;}// 转换颜色空间sws_scale(sws_ctx, frame->data, frame->linesize, 0, codec_ctx->height,rgb_frame->data, rgb_frame->linesize);// 创建OpenCV Mat并显示cv::Mat img(codec_ctx->height, codec_ctx->width,CV_8UC3, rgb_frame->data);cv::imshow("Video", img);if(cv::waitKey(25) == 27) break; // ESC退出}}av_packet_unref(pkt);}// 清理资源av_free(buffer);av_frame_free(&frame);av_frame_free(&rgb_frame);av_packet_free(&pkt);sws_freeContext(sws_ctx);avcodec_free_context(&codec_ctx);avformat_close_input(&fmt_ctx);cv::destroyAllWindows();return 0;
}

程序说明

  • ‌FFmpeg初始化‌

    使用avformat_open_input打开媒体文件
    通过avformat_find_stream_info获取流信息

  • ‌视频流处理‌

    定位视频流索引
    创建解码器上下文并打开

  • ‌颜色空间转换‌
    使用sws_getContext初始化转换上下文
    将原始帧转换为RGB24格式

  • ‌OpenCV显示‌
    将转换后的RGB数据包装为cv::Mat
    使用imshow显示视频帧

5 小结

VS2022配置FFMPEG库,在使用预编译包的情况下,没有特殊需要注意的,按照常规的第三方库配置思路进行配置即可。

相关文章:

VS2022配置FFMPEG库基础教程

1 简介 1.1 起源与发展历程 FFmpeg诞生于2000年&#xff0c;由法国工程师Fabrice Bellard主导开发&#xff0c;其名称源自"Fast Forward MPEG"&#xff0c;初期定位为多媒体编解码工具。2004年后由Michael Niedermayer接任维护&#xff0c;逐步发展成为包含音视频采…...

three.js之特殊材质效果

*案例42 创建一个透明的立方体 <template><div ref"container" className"container"></div> </template><script setup> import * as THREE from three; import WebGL from three/examples/jsm/capabilities/WebGL.js // 引…...

Qt常用控件之日历QCalendarWidget

日历QCalendarWidget QCalendarWidget 是一个日历控件。 QCalendarWidget属性 属性说明selectDate当前选中日期。minimumDate最小日期。maximumDate最大日期。firstDayOfWeek设置每周的第一天是周几&#xff08;影响日历的第一列是周几&#xff09;。gridVisible是否显示日历…...

vxe-table 如何实现跟 Excel 一样的数值或金额的负数自动显示红色字体

vxe-table 如何实现跟 Excel 一样的数值或金额的负数自动显示红色字体&#xff0c;当输入的值为负数时&#xff0c;会自动显示红色字体&#xff0c;对于数值或者金额输入时该功能就非常有用了。 查看官网&#xff1a;https://vxetable.cn gitbub&#xff1a;https://github.co…...

DINOv2 + yolov8 + opencv 检测卡车的可拉拽雨覆是否完全覆盖

最近是接了一个需求咨询图像处理类的&#xff0c;甲方要在卡车过磅的地方装一个摄像头用检测卡车的车斗雨覆是否完全&#xff0c; 让我大致理了下需求并对技术核心做下预研究 开发一套图像处理软件&#xff0c;能够实时监控经过的卡车并判断其车斗的雨覆状态。 系统需具备以下…...

算法日记27:完全背包(DFS->记忆化搜索->倒叙DP->顺序DP->空间优化)

一、暴力搜索&#xff08;DFS&#xff09; O ( n 2 ) O(n^2) O(n2) 1.1&#xff09;思路解析 1、注意和01背包的区别在于每个物品可以无限次选择 注意在完全背包中&#xff0c;当一个物品被选择过一次&#xff0c;我们仍然需要考虑是否继续选择这个物品 01背包&#xff1a; …...

Linux 命令大全完整版(14)

5. 文件管理命令 chgrp(change group) 功能说明&#xff1a;变更文件或目录的所属群组。语  法&#xff1a;chgrp [-cfhRv][–help][–version][所属群组][文件或目录…] 或 chgrp [-cfhRv][–help][–version][–reference<参考文件或目录>][文件或目录…]补充说明&…...

基于 DeepSeek LLM 本地知识库搭建开源方案(AnythingLLM、Cherry、Ragflow、Dify)认知

写在前面 博文内容涉及 基于 Deepseek LLM 的本地知识库搭建使用 ollama 部署 Deepseek-R1 LLM知识库能力通过 Ragflow、Dify 、AnythingLLM、Cherry 提供理解不足小伙伴帮忙指正 &#x1f603;,生活加油 我站在人潮中央&#xff0c;思考这日日重复的生活。我突然想&#xff0c…...

Could not initialize class io.netty.util.internal.Platfor...

异常信息&#xff1a; Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class io.netty.util.internal.PlatformDependent0 Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.reflect.InaccessibleObjec…...

【书生大模型实战营】玩转HF/魔搭/魔乐社区-L0G4000

本文是书生大模型实战营系列的第4篇&#xff0c;本文的主题是&#xff1a;玩转HF/魔搭/魔乐社区。 1.开源大模型社区总览 开源不仅仅是一种技术模式&#xff0c;更是一种精神的体现。它打破了知识的壁垒&#xff0c;让技术平权成为可能。近年来&#xff0c;开源大模型社区蓬勃…...

2025年华为手机解锁BL的方法

注&#xff1a;本文是我用老机型测试的&#xff0c;新机型可能不适用 背景 华为官方已经在2018年关闭了申请BL解锁码的通道&#xff0c;所以华为手机已经无法通过官方获取解锁码。最近翻出了一部家里的老手机华为畅玩5X&#xff0c;想着能不能刷个系统玩玩&#xff0c;但是卡…...

了解 RAG 第二部分:经典 RAG 的工作原理

在本系列的第一篇文章中&#xff0c;我们介绍了检索增强生成 (RAG) &#xff0c;解释了扩展传统大型语言模型 (LLM)功能的必要性。我们还简要概述了 RAG 的核心思想&#xff1a;从外部知识库检索上下文相关的信息&#xff0c;以确保 LLM 生成准确且最新的信息&#xff0c;而不会…...

50周学习go语言:第四周 函数与错误处理深度解析

第四周 函数与错误处理深度解析 以下是第4周函数基础的深度教程&#xff0c;包含两个完整案例和详细实现细节&#xff1a; 第四周&#xff1a;函数与错误处理深度解析 一、函数定义与参数传递 1. 基础函数结构 // 基本语法 func 函数名(参数列表) 返回值类型 {// 函数体 }// …...

debian 12安装 postgresql 17

按照官方文档安装&#xff0c;即可安装成功 https://www.postgresql.org/download/linux/debian/ 添加存储库 #添加存储库 sudo apt install -y postgresql-common#执行 存储库内 命令&#xff0c;自动处理某些东西 sudo /usr/share/postgresql-common/pgdg/apt.postgresql.o…...

C++....................4

1. using namespace std; class mystring { private:char* p;int len;// 辅助函数&#xff1a;复制字符串void copy(const char* source) {len strlen(source);p new char[len 1];strcpy(p, source);}// 辅助函数&#xff1a;释放内存void release() {if (…...

图书馆系统源码详解

本项目是一个基于Scala语言开发的图书馆管理系统。系统主要由以下几个部分组成&#xff1a;数据访问层&#xff08;DAO&#xff09;、数据模型层&#xff08;Models&#xff09;、服务层&#xff08;Service&#xff09;以及用户界面层&#xff08;UI&#xff09;。以下是对项目…...

Node.js中如何修改全局变量的几种方式

Node.js中如何修改全局变量。我需要先理解他们的需求。可能他们是在开发过程中遇到了需要跨模块共享数据的情况&#xff0c;或者想要配置一些全局可访问的设置。不过&#xff0c;使用全局变量可能存在一些问题&#xff0c;比如命名冲突、难以维护和测试困难&#xff0c;所以我得…...

基于javaweb的SpringBoot个人博客系统设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...

厦大团队:DeepSeek大模型概念、技术与应用实践 140页PDF完整版下载

DeepSeek使用教程系列&#xff1a; 厦门大学&#xff1a; DeepSeek大模型概念、技术与应用实践 140页PDF完整版文件 厦大团队&#xff1a;DeepSeek大模型概念、技术与应用实践&#xff08;140页PPT读懂大模型&#xff09;.pdf https://pan.baidu.com/s/1de4UIxqPsvMBIYcpen_M-…...

【Blender】二、建模篇--05,阵列修改器与晶格形变

阵列修改器是bender里面一个比较常用的修改器,所以我们单独开口来讲,我们会先从几片树叶出发,然后我们用阵列修改器把这几片树叶变成这样的造型和这样的造型。这两个造型分别就代表着阵列修改器最常用的两种偏移方法,我们现在就开始我们先来做几个树叶。 1.树叶建模 首先…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...