WebAssembly技術(shù)_加載ffmpeg在Web端調(diào)用解碼
1. 前言
WebAssembly 就是運行在 Web 平臺上的 Assembly。Assembly 是指匯編代碼,是直接操作 CPU 的指令代碼,比如 x86 指令集上的匯編代碼有指令集、寄存器、棧等等設(shè)計,CPU 根據(jù)匯編代碼的指導(dǎo)進行運算。匯編代碼相當(dāng)于 CPU 執(zhí)行的機器碼能夠轉(zhuǎn)換成的人類適合讀的一種語言。
Wasm的技術(shù)優(yōu)勢:
性能高效:WASM采用二進制編碼,在程序執(zhí)行過程中的性能優(yōu)越;
存儲成本低:相對于文本格式,二進制編碼的文本占用的存儲空間更??;
多語言支持:用戶可以使用 C/C++/RUST/Go等多種語言編寫智能合約并編譯成WASM格式的字節(jié)碼;
2. emcc編譯的ffmpeg靜態(tài)庫
(1)CSDN上的-
-: https://download.csdn.net/download/xiaolong1126626497/82868215
(2)GitHub倉庫-
https://github.com/wang-bin/avbuild
https://sourceforge.net/projects/avbuild/files/
https://sourceforge.net/projects/avbuild/files/wasm/
(3)這里有編譯好的ffmpeg.wasm文件,前端JS可以直接調(diào)用完成視頻轉(zhuǎn)碼等功能
https://github.com/ffmpegwasm/ffmpeg.wasm
const fs = require('fs'); const { createFFmpeg, fetchFile } = require('@ffmpeg/ffmpeg'); const ffmpeg = createFFmpeg({ log: true }); (async () => { await ffmpeg.load(); ffmpeg.FS('writeFile', 'test.avi', await fetchFile('./test.avi')); await ffmpeg.run('-i', 'test.avi', 'test.mp4'); await fs.promises.writeFile('./test.mp4', ffmpeg.FS('readFile', 'test.mp4')); process.exit(0); })();
(4)ffmpeg編譯wasm文件的源碼,可以自行編譯wasm文件:
https://github.com/ffmpegwasm/ffmpeg.wasm-core
3. 調(diào)用ffmpeg庫-打印版本號
3.1 準(zhǔn)備ffmpeg庫文件
3.2 編寫C語言代碼
下面只是編寫了一個打印版本號的函數(shù),用于測試ffmpeg的庫和相關(guān)函數(shù)是否可以正常調(diào)用。
#include
3.3 編譯生成wasm和js文件
emcc wasm_ffmpeg/wasm_ffmpeg.c ffmpeg-4.4-wasm/lib/libavformat.a ffmpeg-4.4-wasm/lib/libavcodec.a ffmpeg-4.4-wasm/lib/libswresample.a ffmpeg-4.4-wasm/lib/libavutil.a -I "ffmpeg-4.4-wasm/include" -s EXPORTED_FUNCTIONS="['_malloc','_free','ccall','allocate','UTF8ToString','_print_version']" -s WASM=1 -s ASSERTIONS=0 -s TOTAL_MEMORY=167772160 -s ALLOW_MEMORY_GROWTH=1 -o out/ffmpeg_decoder.js
編譯成功后生成的wasm和js文件:
3.3 編寫index.html代碼
編寫HTML文件調(diào)用js文件里的接口。
4.4 開啟服務(wù)器
命令行運行命令,開啟HTTP服務(wù)器,方便測試:
python -m http.server
4.5 測試效果
打開谷歌瀏覽器,輸入http://127.0.0.1:8000/index.html地址,按下F12打開控制臺,點擊頁面上的按鈕看控制臺輸出。
(1)輸入地址,打開網(wǎng)頁
(2)按下F12,打開控制臺
(3)選擇一個MP4文件載入測試。獲取一幀圖片。
Linux
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。