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++程序媛~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72687.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72687.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72687.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DeepSeek V3 源碼:從入門到放棄!

從入門到放棄 花了幾天時間&#xff0c;看懂了DeepSeek V3 源碼的邏輯。源碼的邏輯是不難的&#xff0c;但為什么模型結構需要這樣設計&#xff0c;為什么參數需要這樣設置呢&#xff1f;知其然&#xff0c;但不知其所以然。除了模型結構以外&#xff0c;模型的訓練數據、訓練…

【leetcode hot 100 240】搜索二維矩陣Ⅱ

解法一&#xff1a;直接查找 class Solution {public boolean searchMatrix(int[][] matrix, int target) {for(int i0; i<matrix.length; i){for(int j0; j<matrix[0].length; j){if(matrix[i][j]>target){break;}if(matrix[i][j]target){return true;}}}return fal…

UE4 組件 (對話組件)

制作一個可以生成對話氣泡&#xff0c;顯示對話臺詞的簡單組件。這個組件要的變量&#xff1a;臺詞&#xff08;外部傳入&#xff09;。功能&#xff1a;開始對話&#xff08;生成氣泡UI&#xff09; &#xff0c;結束對話。 一、對話組件創建 二、開始對話事件 1、注意這里獲…

自動化同步多服務器數據庫表結構

當項目每次進行版本升級的時候&#xff0c;如果在這次迭代中涉及表結構變更&#xff0c;需要將不同的生產環境下&#xff0c;都需要同步表結構的DDL語句&#xff0c;比較麻煩&#xff0c;而且還有可能忘記同步腳本&#xff0c;導致生產環境報錯.... 該方案采用SpringBootMybat…

DeepSeek安全:AI網絡安全評估與防護策略

&#x1f345; 點擊文末小卡片 &#xff0c;免費獲取網絡安全全套資料&#xff0c;資料在手&#xff0c;漲薪更快 本文基于現有的公開資料&#xff0c;從企業資深網絡安全專家的視角&#xff0c;系統梳理DeepSeek技術在網絡安全領域的潛在貢獻與核心風險&#xff0c;并結合中國…

【論文筆記】Attentive Eraser

標題&#xff1a;Attentive Eraser: Unleashing Diffusion Model’s Object Removal Potential via Self-Attention Redirection Guidance Source&#xff1a;https://arxiv.org/pdf/2412.12974 收錄&#xff1a;AAAI 25 作者單位&#xff1a;浙工商&#xff0c;字節&#…

【powerjob】 powerjobserver注冊服務IP錯誤

1、問題&#xff1a;powerjobserver 4.3.6 的服務器上有多個網卡對應多個ip,示例 eth0 :IP1 &#xff0c;docker0:IP2 和worker 進行通信時 正確的應該時IP1 但是注冊顯示獲取的確實IP2,導致 worker 通過ip2和server通信&#xff0c;網絡不通&#xff0c;注冊不上 2、解決方案 …

視頻錄像機視頻通道是指什么

視頻錄像機的視頻通道是指攝像機在監控矩陣或硬盤錄像機設備上的視頻輸入的物理位置。 與攝像頭數量關系&#xff1a;在視頻監控系統中&#xff0c;有多少個攝像頭就需要多少路視頻通道&#xff0c;通道數量決定了視頻錄像機可接入攝像頭的數量&#xff0c;一般硬盤錄像機有4路…

面試150,數組 / 字符串

27. 移除元素 class Solution:def removeElement(self, nums: List[int], val: int) -> int:# 把不等于 val 的值移動到前面n len(nums)left 0for right in range(n):if nums[right] ! val:nums[left] nums[right]left 1return left26. 刪除有序數組中的重復項 只保留 1…

【江科大STM32】TIM輸入捕獲模式PWMI模式測頻率

一、輸入捕獲測頻率 接線圖&#xff1a; 測信號的輸入引腳為PA6&#xff0c;信號從PA6進來&#xff0c;待測的PWM信號也是STM32自己生成的&#xff0c;輸出引腳是PA0&#xff0c;所以接線這里直接用一根線將PA0引到PA6就可以了。 如果有信號發生器的話&#xff0c;也可以設置成…

湖倉一體化及冷、熱、實時三級存儲

一、湖倉一體化&#xff08;Lakehouse&#xff09; 湖倉一體化&#xff08;Lakehouse&#xff09;是數據湖&#xff08;Data Lake&#xff09;與數據倉庫&#xff08;Data Warehouse&#xff09;的結合&#xff0c;旨在解決傳統數據架構中數據孤島、存儲冗余、計算性能不足等問…

go切片定義和初始化

1.簡介 切片是數組的一個引用&#xff0c;因此切片是引用類型&#xff0c;在進行傳遞時&#xff0c;遵守引用傳遞的機制。切片的使用和數組類似&#xff0c;遍歷切片、訪問切片的元素和切片的長度都一樣。。切片的長度是可以變化的&#xff0c;因此切片是一個可以動態變化的數…

游戲引擎學習第138天

倉庫:https://gitee.com/mrxiao_com/2d_game_3 資產&#xff1a;game_hero_test_assets_003.zip 發布 我們的目標是展示游戲運行時的完整過程&#xff0c;從像素渲染到不使用GPU的方式&#xff0c;我們自己編寫了渲染器并完成了所有的工作。今天我們開始了一些新的內容&#…

畢業項目推薦:基于yolov8/yolov5/yolo11的暴力行為檢測識別系統(python+卷積神經網絡)

文章目錄 概要一、整體資源介紹技術要點功能展示&#xff1a;功能1 支持單張圖片識別功能2 支持遍歷文件夾識別功能3 支持識別視頻文件功能4 支持攝像頭識別功能5 支持結果文件導出&#xff08;xls格式&#xff09;功能6 支持切換檢測到的目標查看 二、數據集三、算法介紹1. YO…

docker中kibana啟動后,通過瀏覽器訪問,出現server is not ready yet

問題&#xff1a;當我在瀏覽器訪問kibana時&#xff0c;瀏覽器給我報了server is not ready yet. 在網上試了很多方法&#xff0c;都未能解決&#xff0c;下面是我的方法&#xff1a; 查看kibana日志&#xff1a; docker logs -f kibana從控制臺打印的日志可以發現&#xff…

在 Docker 中,無法直接將外部多個端口映射到容器內部的同一個端口

Docker 的端口映射是一對一的&#xff0c;即一個外部端口只能映射到容器內部的一個端口。 1. 為什么不能多對一映射&#xff1f; 端口沖突&#xff1a; 如果外部多個端口映射到容器內部的同一個端口&#xff0c;Docker 無法區分外部請求應該轉發到哪個內部端口&#xff0c;會…

游戲引擎學習第120天

倉庫:https://gitee.com/mrxiao_com/2d_game_3 上次回顧&#xff1a;周期計數代碼 我們正在進行一個項目的代碼優化工作&#xff0c;目標是提高性能。當前正在優化某個特定的代碼片段&#xff0c;已經將其執行周期減少到48個周期。為了實現這一目標&#xff0c;我們設計了一個…

C++中的.h文件一般是干什么的?

在C中&#xff0c;.h 文件通常是 頭文件&#xff08;Header File&#xff09;&#xff0c;它們的主要作用是聲明類、函數、常量、宏以及其他在多個源文件&#xff08;.cpp文件&#xff09;之間共享的元素。頭文件提供了一個接口&#xff0c;使得不同的源文件能夠訪問這些共享的…

基礎算法總結

基礎算法總結 1、模擬1.1 什么是模擬算法1.2 算法題1.2.1 多項式輸出1.2.2 蛇形方陣 2 高精度算法2.1 什么是高精度算法2.2 算法題2.2.1 高精度加法 2.2.2 高精度乘法 3 普通枚舉3.1 算法題3.1.1 鋪地毯 3.1.2 回文日期 4 前綴和算法4.1 什么是前綴和4.2 算法題4.2.1 最大子段和…

密碼學(哈希函數)

4.1 Hash函數與數據完整性 數據完整性&#xff1a; 檢測傳輸消息&#xff08;加密或未加密&#xff09;的修改。 密碼學Hash函數&#xff1a; 構建某些數據的簡短“指紋”&#xff1b;如果數據被篡改&#xff0c;則該指紋&#xff08;以高概率&#xff09;不再有效。Hash函數…