项目编译打包

主要分为播放器js部分 和 wasm部分

播放器编译打包

编译环境

  • nodejs 21.x.x 版本
  • npm 10.x.x 版本

目前我的编译环境是 node: v22.17.0npm: 10.9.2

调试

音视频播放器

npm run dev:watch

最终文件会打包在 demo 目录下

音频播放器

npm run dev-audio:watch

最终文件会打包在 demo/audio 目录下

语音通讯

npm run dev-talk:watch

最终文件会打包在 demo 目录下

打包

音视频播放器

npm run build

最终文件会打包在 dist 目录下

音频播放器

npm run build:audio

最终文件会打包在 dist/audio 目录下

语音通讯

npm run build:talk

最终文件会打包在 dist 目录下

wasm编译打包

依赖

以mac 或者 linux 为例子

  • python 3.x.x 版本
sudo apt install python3
  • cMake 3.x.x 版本
sudo apt install cmake
  • emscripten 3.x 版本

参考 Download and install — Emscripten-git (dev) documentation 安装,此安装会自动携带nodejs

本人的(mac)编译配置 emscripten 3.1.50 版本, python 3.10.6 版本, cMake 3.20.2 版本

如果是 linux: glibc 版本不能低于 2.18

编译

需要在服务器端 通过git形式拉取完整的代码。

window 通过打包形式,然后上传到服务器端,会存在编码问题,导致编码失败。

一次安装好了之后,

试下

emcc -v

如果出现版本信息,说明安装成功

问题

问题收集

1. 如果出现如果出现 version 'GLIBC_2.18' not found 错误

可以看下解决方案 链接

运行:strings /lib64/libc.so.6 |grep GLIBC_
发现没有GLIBC_2.18
下载:wget http://mirrors.ustc.edu.cn/gnu/libc/glibc-2.18.tar.gz
解压:tar -zxvf glibc-2.18.tar.gz
进入解压文件夹,创建文件夹build:



mkdir build
cd build



运行configure配置,make,sudo make install



../configure --prefix=/usr
make -j4
sudo make install


2. 如果出现 emcc is unable to create an executable file C compiler test failed

则应该是emcc版本太高,glibc版本低。

glibc 版本不能低于 2.18

3. 如果出现 unsupported option '-mno-avx'for target 'wasm32-unknown-emscripten' 问题

在编译 simd/libavc 的时候会出现。

由于编译平台不支持这个参数。

解决方案

去掉 -mno-avx 参数可以成功。

wasm/simd/libavc/CMakeLists.txt 文件中

94行

set(LIBAVCDEC_X86_C_FLAGS
    "-DX86 -DDISABLE_AVX2 -msse4.2 -mno-avx -DDEFAULT_ARCH=D_ARCH_X86_SSE42 -O3 -msimd128")

修改成

set(LIBAVCDEC_X86_C_FLAGS
    "-DX86 -DDISABLE_AVX2 -msse4.2 -DDEFAULT_ARCH=D_ARCH_X86_SSE42 -O3 -msimd128")

193行

set(LIBAVCENC_X86_C_FLAGS "-msse4.2 -mno-avx -UHP_PL -DN_MB_ENABLE -O3 -msimd128")

修改成

set(LIBAVCENC_X86_C_FLAGS "-msse4.2 -UHP_PL -DN_MB_ENABLE -O3 -msimd128")

即可

4. 编译出现的错误 makefile: /tests/Makefile: 没有那个文件或目录。
makefile: /tests/Makefile: 没有那个文件或目录。

make: *** 没有规则可制定目标 “/tests/Makefile” 停止。
5. cmake: Could NOT find Threads (missing: Threads_FOUND)

解决方案

在CMakeLists.txt最上面添加如下语句:

set(CMAKE_THREAD_LIBS_INIT "-lpthread")
set(CMAKE_HAVE_THREADS_LIBRARY 1)
set(CMAKE_USE_WIN32_THREADS_INIT 0)
set(CMAKE_USE_PTHREADS_INIT 1)
set(THREADS_PREFER_PTHREAD_FLAG ON)

https://blog.csdn.net/hongge_smile/article/details/108789449

6. Linux emcc编译错误:wasm-ld: error: cannot open output file libffmpeg.wasm: Input/output error

解决方案:

原因:使用了虚拟机挂载目录

解决:把所有文件移动到Ubuntu目录重新编译即可

https://blog.csdn.net/liangyamin/article/details/123853994

7. 如果出现 failed: [Errno 13] Permissiordenied:"./configure' 错误

这是权限问题,需要给予执行权限

linux环境赋予 777 权限

  chmod 777 configure
8. 如果出现 emcc: error: --memory-init-file is no longer supported 错误

那是因为emcc的版本安装过高了,不要超过 3.1.50 版本即可

假如已经安装过了emcc 了,可以通过执行

cd到emsdk目录下

sudo ./emsdk install 3.1.50
sudo ./emsdk activate 3.1.50

即可

ffmpeg(依赖)

需要在 wasm/FFmpeg 目录下面

一般情况下,不需要额外编译ffmpeg,因为已经编译好了,如果需要重新编译,可以参考下面的步骤

音频解码器

python ffmpeg-audio.py

最终文件会打包在 /wasm/wasm/thirdparty/ffmpeg-audio 文件夹下面

视频解码器

python ffmpeg-video.py

最终文件会打包在 /wasm/wasm/thirdparty/ffmpeg-video 文件夹下面

视频解码器(多线程)

python ffmpeg-video-mt.py

最终文件会打包在 /wasm/wasm/thirdparty/ffmpeg-video-mt 文件夹下面

simd (依赖)

主要分别为 libavc 和 libhevc 编译

一般情况下,不需要额外编译simd,因为已经编译好了,如果需要重新编译,可以参考下面的步骤

libavc

需要在 wasm/simd/libavc 目录下面

python build.py

最终的打包之后的文件在 /wasm/thirdparty/video/avc

然后需要把文件复制到 /wasm/wasm/thirdparty/simd

目录结构是一样的

-- simd
  -- include
    -- avc
       xxx.h 文件
    -- hecv
       xxx.h 文件
  -- lib
       xxx.a 文件
libhevc

需要在 wasm/simd/libhevc 目录下面

python build.py

最终的打包之后的文件在 /wasm/thirdparty/video/hevc

然后需要把文件复制到 /wasm/wasm/thirdparty/simd

目录结构是一样的

-- simd
  -- include
    -- acv
       xxx.h 文件
    -- hecv
       xxx.h 文件
  -- lib
       xxx.a 文件

simd(多线程)

等同于 simd,只是多了一个多线程的版本

打包也是几乎一样的,只是需要把文件复制到 /wasm/wasm/thirdparty/simd-mt

wasm 打包(业务)

在 wasm 目录(下面有make_decoder-xxx.py 等文件)下。

每次修改了c的业务代码,需要重新打包。

cd wasm
python make_decoder-xxx.py

最终文件会打包在 src 目录下面的

可以执行一个 build.sh 脚本,一次性打包所有的文件,并且复制到js 的播放器目录(src/decoder)下面

./build.sh

wasm 合并到播放器

需要把 wasm/src 下面打包生成的文件 复制到播放器的 src/decoder 目录下面

如果已经执行了 build.sh 脚本,就不需要复制这块操作了,脚本会帮你复制过去的。

先安装依赖 npm install

如果是用的 yarn 也是一样的。

然后重新执行 npm run build 进行打包