如何让主机显示Docker容器的程序界面,同时支持声音播放

系统中如果安装各种应用软件,很容易会因为版本冲刺引发异常。一个好的办法就是用容器来隔离系统环境,确保主机环境不变。对于一些有界面的程序,可以在容器内运行,让其界面显示在主机上。下面以安装和使用视频剪辑软件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运行界面:

以上是本人挖坑的总结,与大家分享!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深蓝静音

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值