【发布时间】:2021-06-30 03:25:24
【问题描述】:
我正在尝试使用 Emscripten 构建一个使用 ffmpeg 库到 WebAssembly 的小项目。在此之前,我通过将一些简单的程序从 C 转换为 Wasm 来尝试它,它运行良好,但那次我没有使用任何额外的库。
对于 C++,我正在使用 Visual Studio 和 FFmpeg 我在项目的“属性”中链接如下:
-
我放置在“包含”目录中的所有 .h 头文件,并在“C/C++”部分中将其添加为“附加包含目录”
-
我放置在“lib”中的所有 .lib 和 .dll.a(例如 avcodec.lib 或 libavcodec.dll.a)文件并在“链接器”部分添加为“附加库目录”
所有内容都包含在内,程序本身运行良好,所以现在我尝试使用 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
我添加了“-I include”参数,该参数假定指向我上面提到的相同头文件,这对 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 文件非常大,最好只在此处粘贴 link to this file on github 而不是大代码块。
【问题讨论】:
-
你应该避免链接不是由 Emscripten 生成的静态库,你应该退后一步,用 emmake make 用 Emscripten 编译 ffmpeg 静态库(当然你需要 ffmpeg 源代码)然后链接这些静态库。如果您需要,我会提供详细的答案。
-
你能发布 cut_video.cpp 文件吗?
-
@kalwalt 感谢您的回复!我在上面的帖子中添加了 cut_video.cpp 文件的链接。我将尝试阅读更多关于 emmake 以及如何使用它的信息,但如果您有空闲时间让我更好地了解它,我将非常感激。
-
我去看看,谢谢!
-
我认为,正如我所说,您应该使用 Emscriten 编译 FFmpeg 库,但这需要大量工作。但是你可以看看github.com/ffmpegwasm/ffmpeg.wasm-core和github.com/ffmpegwasm/ffmpeg.wasm
标签: ffmpeg webassembly emscripten