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

Qt6.8.2创建WebAssmebly项目使用FFmpeg资源

Qt6新出了WebAssmebly功能,可以将C++写的软件到浏览器中运行,最近一段时间正在研究这方便内容,普通的控件响应都能实现,今天主要为大家分享如何将FFmpeg中的功能应用到浏览器中。

开发环境:window11,Qt6.8.2

功能介绍

(一)编译FFmpeg

之前使用FFmpeg解码器时没有编译过,想要在WebAssmebly套件环境中使用FFmpeg时,不能使用dll的方式,所以只能手动编译,这个步骤对我来说还是有一定难度的,不是不会编译,而是编译出来的内容,无法在QtCreator中应用。

接下来我来详细讲述下如何编译FFmpeg并使用。

1:下载MSYS2环境

因为FFmpeg不支持在window环境下编译,所以这里借助了MSYS2环境,具体的安装包可以从官网上下载就行。MSYS2官网链接

安装的时候默认是C盘,考虑到后期电脑运行状态,我选择安装到了D盘,不受任何影响的。

 选择MSYS2 MINGW64方式进行编译

2:更新MSYS2和MINGW

控制台输入以下命令

pacman --sync --refresh --refresh
pacman --sync --sysupgrade

3:安装GIT

主要是使用git更新代码的,在这里需要注意的是,即使是在windows环境下已经安装过git了,在MSYS2中也是无法同步的。我之前就犯过这种错误,总觉得是在windows环境下应该是想通的才对,其实不是!

3.1:判断MSYS2中有没有安装git
pacman -Q git

如果能输出版本号,说明git已经被安装过

3.2:安装git
pacman -S git

安装后再次执行就能看到git的版本号了。

4:安装emscripten

为了编译FFmpeg为WebAssmebly可应用版本,需要安装emscripten

4.1:下载emscripten资源
git clone https://github.com/emscripten-core/emsdk.git

 下载完成后切换到emsdk文件夹中

cd emsdk

这时候只是下载了一个emsdk的框架,因为要匹配Qt6.8.2,根据QtCreator文档说明得知,需要搭配emscripten的3.1.56版本,因此在更新安装时指定安装版本,这很重要!

4.2:安装指定版本
./emsdk install 3.1.56
4.4:安装后激活当前版本
./emsdk activate 3.1.56
4.5:激活emscripten环境
source /emsdk/emsdk_env.sh
4.6:配置环境变量

为了以后每次启动时不需要每次都激活emscripten环境,需要将激活功能放到环境变量中,方便使用

找到MSYS2中你的用户下“xx.bashrc”文件,将下面这句话添加到文件末尾。

source /D/msys64/home/sutong/emsdk/emsdk_env.sh

在这里需要写绝对路径的

此时,在命令行中输入

emcc -v

就能看到版本号了,说明安装成功了。

 5:编译FFmpeg

最近我发现deepseek是个好东西,有啥问题都可以用这个咨询,我使用deepseek搜素了很多方案,以及各种博友的回答,都说使用“emconfigure ./configure”方式,但是,我也不知道是哪里出了问题,一直返回不是win32的有效应用程序,我简直跪了!

后来发现,直接使用"./configure"方式照样也能编译成功。下面是我配置FFmpeg编译项参数

第一步:

./configure --prefix=/home/sutong/ffmpeg/build-wasm --target-os=none --arch=x86_32 --enable-cross-compile --disable-asm --disable-programs --disable-doc  --cc="emcc" --cxx="em++" --ar="emar" --cpu=generic --disable-avdevice --disable-swresample --disable-postproc --disable-avfilter --disable-logging --enable-small --enable-decoder=h264 --enable-demuxer=mov --enable-network

第二步:

emmake make

第三步

emmake make install

等待编译完成就行,会将结果输出到“/home/sutong/ffmpeg/build-wasm”我们指定的文件夹中。

以上操作但凡发现有错误后,需要进行清理再次进行编辑

make clean

(二)代码应用

1:创建Qt项目

创建一个套件是WebAssmebly的项目,在这里我选择的是多线程

 2:将编译好的FFmpeg资源添加到项目中

# 添加FFmpeg头文件路径
INCLUDEPATH += $$PWD/ffmpeg/src
LIBS += -L$$PWD/ffmpeg/lib \-lavformat \-lavcodec \-lswscale \-lavutil#WebAssembly特定配置
QMAKE_CXXFLAGS += -s USE_PTHREADS=0 -s ALLOW_MEMORY_GROWTH=1
# 添加以下标志以保留未使用的函数并导出符号
QMAKE_LFLAGS += -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s EXPORT_ALL=1

在这里需要记住,静态库的加载一定是按照这个顺序,否则代码应用一直报错,我已经踩坑过了。

3:代码调用

在.h中

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

在.cpp中

avformat_network_init();
// 初始化AVFormatContext
AVFormatContext* m_avFormCtx_Out = nullptr;
const char* filename = "F:\\11.mp4";
int nErrorCode = avformat_alloc_output_context2(&m_avFormCtx_Out, nullptr, nullptr, filename);
if(nErrorCode < 0)
{qDebug() << "调用<avformat_alloc_output_context2>,失败,错误码 = " << nErrorCode;
}
else
{qDebug() << "调用<avformat_alloc_output_context2>,成功,正确码 = " << nErrorCode;
}

运行代码,可以在浏览器中输出日志,说明FFmpeg接口调用成功

总结

虽然编译过程很简答, 主要是环境配置以及在项目中的兼容程序,之前总是查询emconfigure的使用,浪费了很长时间,发现不用调用“emconfigure”也可以编译成功。

大家有什么问题可以留言告诉我,我也是第一次尝试,接下来我会继续分享Qt程序在WebAssmebly中使用,毕竟要学一学新技术呀!

我是糯诺诺米团,一名C++程序媛~

相关文章:

Qt6.8.2创建WebAssmebly项目使用FFmpeg资源

Qt6新出了WebAssmebly功能&#xff0c;可以将C写的软件到浏览器中运行&#xff0c;最近一段时间正在研究这方便内容&#xff0c;普通的控件响应都能实现&#xff0c;今天主要为大家分享如何将FFmpeg中的功能应用到浏览器中。 开发环境&#xff1a;window11&#xff0c;Qt6.8.2…...

Java阻塞队列深度解析:高并发场景下的安全卫士

一、阻塞队列的核心价值 在电商秒杀系统中&#xff0c;瞬时涌入的10万请求如果直接冲击数据库&#xff0c;必然导致系统崩溃。阻塞队列如同一个智能缓冲带&#xff0c;通过流量削峰和异步解耦两大核心能力&#xff0c;成为高并发系统的核心组件。 二、Java阻塞队列实现类对比 …...

软件信息安全性测试流程有哪些?专业软件测评服务机构分享

在数字化时代&#xff0c;软件信息安全性测试的重要性愈发凸显。尤其是对于企业来说&#xff0c;确保软件的安全性不仅是维护用户信任的关键&#xff0c;也是满足合规要求的必要条件。 软件信息安全性测试是指通过一系列系统化的测试手段&#xff0c;评估软件应用在受到攻击时…...

Linux - 网络基础(应用层,传输层)

一、应用层 1&#xff09;发送接收流程 1. 发送文件 write 函数发送数据到 TCP 套接字时&#xff0c;内容不一定会立即通过网络发送出去。这是因为网络通信涉及多个层次的缓冲和处理&#xff0c;TCP 是一个面向连接的协议&#xff0c;它需要进行一定的排队、确认和重传等处理…...

C++11新特性:auto遇上const时的推导规则

当auto推导变量类型时&#xff0c;const修饰符会影响推导结果&#xff0c;我们具体看一下有哪些影响 1、普通变量 例如&#xff1a; const int ci 42; auto a ci; // a 的类型是 int (顶层 const 被忽略) const auto ca ci; // ca 的类型是 const int (顶层 const 被…...

hom_mat2d_to_affine_par 的c#实现

hom_mat2d_to_affine_par 的c#实现 背景&#xff1a;为课室贡献一个通用函数&#xff0c;实现halcon算子的同等效果&#xff0c;查询csdn未果&#xff0c;deepseek二哥与chtgpt大哥给不了最终程序&#xff0c;在大哥与二哥帮助下&#xff0c;最终实现同等效果。 踩坑&#xf…...

相机几何与标定:从三维世界到二维图像的映射

本系列课程将带领读者开启一场独特的三维视觉工程之旅。我们不再止步于教科书式的公式推导&#xff0c;而是聚焦于如何将抽象的数学原理转化为可落地的工程实践。通过解剖相机的光学特性、构建成像数学模型、解析坐标系转换链条&#xff0c;直至亲手实现参数标定代码&#xff0…...

GPTQ - 生成式预训练 Transformer 的精确训练后压缩

GPTQ - 生成式预训练 Transformer 的精确训练后压缩 flyfish 曾经是 https://github.com/AutoGPTQ/AutoGPTQ 现在是https://github.com/ModelCloud/GPTQModel 对应论文是 《Accurate Post-Training Quantization for Generative Pre-trained Transformers》 生成式预训练Tr…...

【Python项目】基于深度学习的电影评论情感分析系统

【Python项目】基于深度学习的电影评论情感分析系统 技术简介&#xff1a;采用Python技术、Flask框架、MySQL数据库、Word2Vec模型等实现。 系统简介&#xff1a;该系统基于深度学习技术&#xff0c;特别是Word2Vec模型&#xff0c;用于分析电影评论的情感倾向。系统分为前台…...

Redis特性总结

一、速度快 正常情况下&#xff0c;Redis 执⾏命令的速度⾮常快&#xff0c;官⽅给出的数字是读写性能可以达到 10 万 / 秒&#xff0c;当然这也取决于机器的性能&#xff0c;但这⾥先不讨论机器性能上的差异&#xff0c;只分析⼀下是什么造就了 Redis 如此之快&#xff0c;可以…...

深入理解PHP的内存管理与优化技巧

深入理解PHP的内存管理与优化技巧 PHP作为一种广泛使用的服务器端脚本语言&#xff0c;其内存管理机制对于应用程序的性能和稳定性至关重要。本文将深入探讨PHP的内存管理机制&#xff0c;并提供一些优化技巧&#xff0c;帮助开发者更好地理解和优化PHP应用程序的内存使用。 …...

java常见的几种并发安全问题及解决方案

项目场景&#xff1a; 并发的应用场景&#xff0c;在开发过程会经常遇到。 例如&#xff1a;服务应用启动后&#xff0c;需要简单统计接口的总访问量&#xff1b;实时更新订单状态&#xff0c;成交总额。 问题描述&#xff1a; 比如统计接口访问次数&#xff0c;如下的实现&a…...

介绍一下安装时情况 kubernetes 集群

1.安装命令执行完毕 最开始告诉我们应用的版本 v1.29.14前置检测下载镜像写入证书因为当前我们所有的 kubernetes 集群的组件之间的联通 都是基于HTTPS协议实现的 补充知识点&#xff1a;BS架构&#xff0c;即Browser/Server&#xff08;浏览器/服务器&#xff09;架构模式&a…...

Dify部署踩坑指南(Windows+Mac)

组件说明 Dify踩坑及解决方案 ⚠️ 除了修改镜像版本&#xff0c;nginx端口不要直接修改docker-compose.yaml &#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 1、更换镜像版本 这个文件是由.env自动生成的&#xff0c;在.env配置 …...

安科瑞新能源充电桩解决方案:驱动绿色未来,赋能智慧能源

安科瑞顾强 引言 在“双碳”目标与新能源汽车产业高速发展的双重驱动下&#xff0c;充电基础设施正成为能源转型的核心环节。安科瑞电气股份有限公司凭借在电力监控与能效管理领域20余年的技术积淀&#xff0c;推出新一代新能源充电桩解决方案&#xff0c;以智能化、高兼容性…...

深入剖析Java代理模式:静态代理与动态代理的实战应用

代理模式是Java开发中最重要的设计模式之一,广泛应用于性能监控、访问控制、日志记录等场景。本文将带你全面掌握代理模式的实现原理,并通过3种不同的代码实现方式,彻底理解这一核心设计模式的应用技巧。 一、代理模式的核心价值 代理模式(Proxy Pattern)通过创建代理对…...

JVM与性能调优详解

以下是关于 JVM与性能调优 的详细解析&#xff0c;结合理论、实践及常见问题&#xff0c;分多个维度展开&#xff1a; 一、JVM性能调优的核心目标 性能调优的核心目标是通过优化内存管理、垃圾回收&#xff08;GC&#xff09;策略和线程管理&#xff0c;实现以下平衡&#xff…...

【嵌入式通信协议】串口的详细介绍

以下是对嵌入式STM单片机通信串口的详细介绍 一、STM32串口通信基础 STM32的串口模块称为USART(Universal Synchronous/Asynchronous Receiver/Transmitter),支持同步和异步通信;而UART(Universal Asynchronous Receiver/Transmitter)仅支持异步通信。STM32F103C8T6包含…...

乐鑫打造全球首款 PSA Certified Level 2 RISC-V 芯片

乐鑫科技 (688018.SH) 荣幸宣布 ESP32-C6 于 2025 年 2 月 20 日获得 PSA Certified Level 2 认证。这一重要突破使 ESP32-C6 成为全球首款基于 RISC-V 架构获此认证的芯片&#xff0c;体现了乐鑫致力于为全球客户提供安全可靠、性能卓越的物联网解决方案的坚定承诺。 PSA 安全…...

Go学习笔记:基础语法3

1. 常量 Go语言中的常量使用关键字const定义&#xff0c;用于存储不会改变的数据&#xff0c;常量是在编译时被创建的&#xff0c;即使定义在函数内部也是如此&#xff0c;并且只能是布尔型、数字型&#xff08;整数型、浮点型和复数&#xff09;和字符串型。 由于编译时的限…...

虚拟卡 WildCard (野卡) 保姆级开卡教程

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 本篇教程为 WildCard 的介绍以及开卡教学&#xff0c;要了解不同平台&#xff08;Grok、Talkatone 等&#xff09;的订阅方式请移步《订阅教程》分类 当我们想要充值国外平台会员时&#xff0c;一般都需要使…...

机试准备第10天

首先学习二分搜索法。使用二分查找需要先排序。第一题是查找&#xff0c;现学现卖。 //二分查找 #include <stdio.h> #include <vector> #include <algorithm> using namespace std; int main(){int n;scanf("%d", &n);vector<int> a(n…...

Apache ECharts介绍(基于JavaScript开发的开源数据可视化库,用于创建交互式图表)

文章目录 Apache ECharts 介绍功能概览多种图表类型- **基础类型**&#xff1a;折线图、柱状图、饼图、散点图。- **高级类型**&#xff1a;雷达图、热力图、桑基图、K线图。- **地理可视化**&#xff1a;支持地图&#xff08;如中国、世界&#xff09;和地理坐标系。- **3D支持…...

最新版本TOMCAT+IntelliJ IDEA+MAVEN项目创建(JAVAWEB)

前期所需&#xff1a; 1.apache-tomcat-10.1.18-windows-x64&#xff08;tomcat 10.1.8版本或者差不多新的版本都可以&#xff09; 2.IntelliJ idea 24年版本 或更高版本 3.已经配置好MAVEN了&#xff08;一定先配置MAVEN再搞TOMCAT会事半功倍很多&#xff09; 如果有没配置…...

Linux - 进程通信

一、管道 管道是一种进程间通信&#xff08;IPC&#xff09;机制&#xff0c;用于在进程之间传递数据。它的本质是操作系统内核维护的一个内存缓冲区&#xff0c;配合文件描述符进行数据的读写。尽管管道的核心是内存缓冲区&#xff0c;但操作系统通过对管道的实现&#xff0c…...

使用 Arduino 的 WiFi 控制机器人

使用 Arduino 的 WiFi 控制机器人 这次我们将使用 Arduino 和 Blynk 应用程序制作一个 Wi-Fi 控制的机器人。这款基于 Arduino 的机器人可以使用任何支持 Wi-Fi 的 Android 智能手机进行无线控制。 为了演示 Wi-Fi 控制机器人&#xff0c;我们使用了一个名为“Blynk”的 Andr…...

网络安全等级保护2.0 vs GDPR vs NIST 2.0:全方位对比解析

在网络安全日益重要的今天&#xff0c;各国纷纷出台相关政策法规&#xff0c;以加强信息安全保护。本文将对比我国网络安全等级保护2.0、欧盟的GDPR以及美国的NIST 2.0&#xff0c;分析它们各自的特点及差异。 网络安全等级保护2.0 网络安全等级保护2.0是我国信息安全领域的一…...

verb words

纠正correct remedy 修正modify 协商 confer 磋商/谈判 negotiate 通知notice notify *宣布announce 声明declare 宣告 declare *颁布 promulgate /introduce 协调coordinate 评估evaluate assess 撤离evacuate *规定stipulate 参与participate&#xff0c; 涉及refer…...

unity console日志双击响应事件扩展

1 对于项目中一些比较长的日志&#xff0c;比如前后端交互协议具体数据等&#xff0c;这些日志内容可能会比较长&#xff0c;在unity控制面板上查看不是十分方便&#xff0c;我们可以对双击事件进行扩展&#xff0c;将日志保存到一个文本中&#xff0c;然后用系统默认的文本查看…...

维度建模维度表技术基础解析(以电商场景为例)

维度建模维度表技术基础解析(以电商场景为例) 维度表是维度建模的核心组成部分,其设计直接影响数据仓库的查询效率、分析灵活性和业务价值。本文将从维度表的定义、结构、设计方法及典型技术要点展开,结合电商场景案例,深入解析其技术基础。 1. 维度表的定义与作用 定义…...