项目编译打包
主要分为播放器js部分 和 wasm部分
播放器编译打包
编译环境
- nodejs 21.x.x 版本
- npm 10.x.x 版本
目前我的编译环境是 node: v22.17.0 和 npm: 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 进行打包