Emscripten 网页js调用C++ (ffmpeg)

Posted chinabinlang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Emscripten 网页js调用C++ (ffmpeg)相关的知识,希望对你有一定的参考价值。

网页js调用FFmpeg,需要先编译 FFmpeg wasm;

Emscripten是一个工具链,通过LLVM来编译生成asm.js、WebAssembly字节码,能够在网页中接近最快的速度运行C和C++,并且不需要任何插件。

Emscripten 是基于LLVM的编译器,能够将任何能够生成LLVM位码的代码编译成javascript的严格子集asm.js,主要用于将C/C++代码编译成asm.js。
 

官网:​​​​​​Download and install — Emscripten 3.1.31-git (dev) documentation

主要,在 win 系统,执行 bat 文件;

           在Linux 系统执行 sh 文件;

git clone https://github.com/emscripten-core/emsdk.git

cd emsdk

emsdk update //提示执行 git pull

emsdk install latest

emsdk activate latest

emsdk_env.bat

或者 emsdk_env.sh  // 设置 emcc 环境变量;win 上是临时变量,每次cmd需要设置;

完成后,执行 emcc -v; 

如果提示命令不识别, 到 emsdk 目录中 执行 

emsdk_env.bat

每次打开 cmd 窗口都需要执行 emsdk_evn.bat,

可以自己写一个 bat 文件 先执行 emsdk_evn.bat ,这样简单写,当然可以自己添加环境变量;

编辑变量完成后:

编写测试代码:

如 D: 判根目录:

创建 test.cpp

#include <stdio.h>

int main()

printf("test emcc\\n");

return 0;

cd  /d D:

emcc test.cpp

编译C++ 文件; 

D: 目录; 生成文件路径默认在 当前 命令行 目录;

emcc test.cpp 生成 a.out.js  a.out.wasm 两个文件;

测试:

cmd 窗口,  D:

node a.out.js

显示: test emcc

或者 页面调用:

写一个index.html

http-server运行:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script src="a.out.js"></script>
</body>
</html>

本地打开会出错;

这是官网,描述更详细,可以参考;

FAQ — Emscripten 3.1.21-git (dev) documentation

导出 c / c++ 接口:

默认 main() 函数自动启动,用 node 命令 ,或者 js 在网页中是一样的默认启动;

导出别的接口:

c/c++ 接口为 test, testt, 在web JavaScript 中,通过 _test(),调用;

 -sEXPORTED_FUNCTIONS=["_test","_testt"]

一个完整的编译命令;

emcc ./test.c -I "./" -I "../" -L "./"     -l testlib1 -l testlib2  -s TOTAL_MEMORY=655360000 -sEXPORTED_FUNCTIONS=["_test","_testt"] -s STACK_SIZE=10MB  -sASSERTIONS -o ./test.js

-I :指定 lib 目录;

-L:指定 include 目录;

-I test: 连接的lib文件;

-sASSERTIONS:更详细的调试信息; 

-s MODULARIZE=1 :这个参数不可以像上面一样直接通过导出函数在JavaScript中用,而是通过web的module方式;

s STACK_SIZE=10MB;

如果快速配置环境,可以通过官方 docker,也比较简单;

ffmpeg wasm 地址:

https://github.com/ffmpegwasm/ffmpeg.wasm-core

以上是关于Emscripten 网页js调用C++ (ffmpeg)的主要内容,如果未能解决你的问题,请参考以下文章

Emscripten 网页js调用C++ (ffmpeg)

2021-09-13 使用Emscripten 将c++编译为WebAssembly给JS调用

Emscripten malloc 和跨 JS 和 C++ 的免费

将 JS 数字数组传递给 emscripten C++ 而无需 reinterpret_cast

Emscripten 传递 stl c++ map 参数

使用 emscripten 将字符串从 C++ 传递给 JS