由于Electron官方编译Linux版本不支持VAAPI编码,需要自行源码编译,这个工作还是有一些挑战性,首先是硬件需要8G以上内存,200G左右硬盘,以及10M以上的国际互联网访问通道。

可能因为各种原因,好不容易下载好的120G源码,在某台机器上由于硬件问题无法编译,需要更换机器,如果反复重复上述工作,都将是天大的折磨。

所以为了复用成果,一次下载在多个机器上可以反复使用,测试了一下使用Docker容器进行编译,以可以避免破坏某台高性能机器(一般上面有比较重要的内容,但临时借用几小时编译下得到编译成果,而不破坏主机现场环境还是可以的,Docker容器的价值也正在于此)。

本次实测通过3台主机:

  • 4U至强服务器:硬伤是SAS机械盘比较慢
  • MacBook Intel i7 16G
  • Mac mini M4: 硬件是256的ssd,存储已经满了(arm主机,实际也可以运行x86 docker进行编译)

如果有已经下载好的electron源码,可以通过移动硬盘(最好是ssd)或者nfs网络共享的方式挂载到上面映射目录~/electronSRC,我的目录下面就两个文件夹,官方的dept_tools和src目录。

注意
编译electron(及chromium,nodejs)对于文件属性、权限敏感,推荐使用Linux环境下ext4或苹果原生APFS,不要使用exFat、Fat32、NTFS等文件系统。

方案1. 挂载nfs到容器映射数据目录:

1
2
mkdir ~/electronSRC
sudo mount -t nfs -o vers=3,resvport 172.21.x.x:/home/xxxx/electron-vaapi ~/electronSRC

方案2. 将挂载的移动硬盘链接到目录:

1
ln -s /Volumes/Untitled/electronSRC ~/electronSRC

或者直接下载我分享的docker镜像“全新”下载所有源码并编译(或者使用官方推荐的ubuntu:22.04自行按Electron官方说明构建编译环境):

1
2
3
docker run -it --name electron-build \
-v ~/electronSRC:/workspace/electronSRC \
ghcr.io/meineson/electron-vaapi:v1 /bin/bash

*如果是mac m4 arm CPU,加一个参数--platform linux/amd64启动容器,apple m4的并发编译性能和大内存还是很快的,哪怕是经过Rosetta2动态转换运行x86容器。

进入容器后,开始编译:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cd /workspace/electronSRC/src
export CHROMIUM_BUILDTOOLS_PATH=`pwd`/buildtools

buildtools/linux64/gn gen out/Release --args='import("//electron/build/args/release.gn")
use_vaapi=true
use_ozone=true
ozone_platform="x11"
use_gtk=true
proprietary_codecs=true
ffmpeg_branding="Chrome"
rtc_use_h264 = true
enable_hevc_parser_and_hw_decoder = true'

ninja -C out/Release electron:electron_dist_zip

耐心等待数小时,即可在out/Release目录下获取编译结果:

1
2
root@1d643c874719:/workspace/electronSRC/src# ls -hl out/Release/dist.zip 
-rw-rw-r-- 1 root root 110M Nov 5 08:12 out/Release/dist.zip

总磁盘消耗:

1
2
Filesystem        Size    Used   Avail Capacity iused ifree %iused  Mounted on
/dev/disk3s1 238Gi 175Gi 64Gi 74% 1.5M 14M 10% /Volumes/Untitled

如果没有预先下载好的源码,也可以先全新下载(下载到你容器映射的主机目录,例如:~/electronSRC,请确保你的/home目录可用空间有120G+的可用空间):

1
2
3
4
5
6
7
cd /workspace/electronSRC
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH=$PATH:$PWD/depot_tools

export DEPOT_TOOLS_UPDATE=0
gclient config --name "src/electron" --unmanaged https://github.com/electron/[email protected]
gclient sync --with_branch_heads --with_tags

然后再重复上面的编译步骤即可(注意,此下载过程你需要耐心,耐心,耐心以及运气,动辄下一整天或者……几天,看你的国际网络质量,反复失败是正常的)。

如果下载过程或编译过程始终出错了,删掉重来……