系统中如果安装各种应用软件,很容易会因为版本冲刺引发异常。一个好的办法就是用容器来隔离系统环境,确保主机环境不变。对于一些有界面的程序,可以在容器内运行,让其界面显示在主机上。下面以安装和使用视频剪辑软件shotcut为例,介绍实现方案。
docker run -it --privileged=true --device /dev/snd -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY -v /mnt:/mnt --gpus all ubuntu:22.04 bash
详细解释如下:
- --privileged=true赋予容器访问设备及文件的权限;
- --device将主机的音频设备/dev/snd共享给容器,实现容器内音频的输出;
- -v /tmp/.X11-unix:/tmp/.X11-unix将主机的x11目录挂载到容器的相同目录,实现显示界面输出;
- -e DISPLAY=$DISPLAY设置容器内的环境变量,显示器使用主机的显示器,这个可以不加,创建容器后在容器内设置也可以
- --gpus all,将主机gpu共享给容器,这个需要安装nvidia-container-toolkit,对于不使用gpu的用户,可以忽略
以上方法创建的容器,基本上就没有问题了,在容器内运行带gui界面的程序,界面就会在主机上显示,声音也会播放出来。比如安装音频播放软件和视频剪辑软件:
#安装x11的app,里面有个时钟程序可以用来测试
apt install x11-apps
xclock #如果显示时钟界面,则表面gui图形界面转发成功
#安装音频播放器
apt install -y sox libsox-fmt-all
play 一吻天荒.mp3 #播放音频
#安装视频播放器
apt install -y mplayer
mplayer 一吻天荒.mp4 #播放视频
如果gui界面没有成功显示,可能是权限问题,尝试以下操作:
#主机执行
xhost +
#或
xhost + 主机IP
#主机echo $DISPLAY看一下显示端口,比如:1,
#然后在容器内export DISPLAY=:1
钟表界面显示如下:
如果播放音频或视频失败,比如上图中的浮点异常情况,此时打开PulseAudio Volume Control
在Configuration选项页,切换一下Build-in Audio的选项,选对设备就ok了。
网上还看到很多帖子,说需要在容器内安装alsa-utils,个人试验发现纯属误导。另外还有说在主机和容器内都要安装pulseaudio,然后做端口转发的,本人实验没有成功,另外个人理解,直接基于设备的转发,应该是不需要使用pulseaudio服务来转发音频的。
附shotcut视频剪辑软件安装方法:
apt install -y shotcut --fix-missing
#各人心得,不要源码安装,shotcut对qt版本的依赖比较严格
#源码安装需要先安装依赖版本的Qt,会有各种异常,解决问题太费时间了
#附Qt编译及shotcut编译
tar -xvf qt-everywhere-src-5.15.1.tar.xz
cd qt-everywhere-src-5.15.1
./configure -help
./configure -recheck-all -opensource -confirm-license -prefix /usr/local/qt-5.15.1 -c++std c++14
gmake -j32
gmake install
#报numeric_limits不是std的成员的异常,找到相应文件添加 #include <limits>
#shotcut
tar -zxvf v22.01.30.gar.gz
cd v22.01.30
qmake PREFIX=/opt/shotcut shotcut.pro
make -j32
make install
shotcut运行界面:
以上是本人挖坑的总结,与大家分享!