我正在尝试构建一个小项目,使用Emscripten将ffmpeg库用于WebAssembly。在此之前,我通过将一些简单的程序从C转换到Wasm来尝试它,它运行得很好,但那一次我没有使用任何额外的库。
对于C++,我正在使用Visual Studio和FFmpeg,我链接到项目的";属性";如下所示:
-
我放置在";包括";目录,我将其添加为";附加包含目录";在";C/C++";区段
-
所有.lib和.dll.a(例如avcodec.lib或libavcodec.dll.a(文件;lib";并添加为";附加图书馆目录";在";链接器";区段
All includes和程序本身运行良好,所以现在我正试图用Emscripten用我之前使用的相同命令准备Wasm模块,但我已经知道这是行不通的:
em++ cut_video.cpp -Os -g1 -L lib -I include -s WASM=1 -s FORCE_FILESYSTEM=1 -s ALLOW_MEMORY_GROWTH=1 -s EXPORT_ES6=1 -s MODULARIZE=1 -s "EXPORT_NAME='Editor'" -s "ENVIRONMENT='web'" -s EXPORTED_FUNCTIONS="['_doubler', '_cut_video', '_cut_video1']" -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s ASSERTIONS=1 --bind -o cutter.js
我添加了"-我包括";参数,假设它指向与我上面提到的相同的头文件,它似乎对Emscripten来说很好,因为它解决了最初的错误。Emscripten已经发现了ffmpeg库中函数的问题,所以我添加了";ERROR_ON_UNDEFINED_SYMBOLS=0";只是想看看当我将这个模块添加到前端应用程序时会发生什么。显然,它最终会出现错误";缺少函数:av_register_all";,这是我代码中的第一个ffmpeg函数。
我发现所有有帮助的解释对我来说都很不清楚,因为通常我不使用C++或Linux环境,所以我对Makefile或其他软件不感兴趣
根据我所描述的内容以及我的项目是如何使用Visual Studio准备的,有没有办法告诉Emscripten为我的应用程序使用那些预构建的FFmpeg的.dll.a或.lib文件?或者,我应该如何修改我的项目,使其为Emscripten所接受?
编辑:因为cut_video.cpp文件很大,所以最好在github上粘贴一个指向该文件的链接,而不是大块代码。
FFmpeg和Emscripten
使用Emscripten构建FFmpeg库不是一项容易的任务,但您可以遵循FFmpeg.wasm教程:
- 简介
- 使用Emscripten构建
仔细阅读所有教程,直到教程结束,因为可能会出现很多问题。
备注
我建议您从教程中使用的FFmpeg和Emscripten版本开始,并查看build-FFmpeg.sh脚本。脚本本身导出一个带有主函数的wasm文件
https://github.com/ffmpegwasm/ffmpeg.wasm-core/blob/85f0e51d9a94447a3b3481c7a4794c2eb9abbfee/wasm/build-scripts/build-ffmpeg.sh#L22
-s EXPORTED_FUNCTIONS="[_main, _proxy_main]" # export main and proxy_main funcs
也就是说,fftools/ffmpeg.c中的主要功能。这将对您有很大帮助。
有用的资源
注意,在Emscripten文档中,有一个移植到WASM/Javascript的C/C++库/项目列表,还有一些FFmpeg项目请参阅实用程序
编码快乐!
选项返回链接错误:emcc:错误:未定义的导出符号:"_proxy_main";[-Wundefine][-Werror]USE_PTHREAD选项是否生成proxy_main(…(函数来抽象main(…(?
-s USE_PTHREADS=1#启用PTHREADS支持-s PROXY_TO_PTHREAD=1#从浏览器/UI主线程分离main((-s INVOKE_RUN=0#一开始不运行main((-s EXIT_RUNTIME=1#执行后退出运行时-s EXPORTED_FUNCTION=";[_main,_proxy_main]"#导出main和proxy_main函数