首页 / 资讯中心 / 文章详情

Ubuntu Server 无桌面环境播放视频与显示网页:最小化图形环境实战

Ubuntu Server 无桌面环境播放视频与显示网页:最小化图形环境实战 ★ FEATURED ARTICLE
1. 为什么要在 Ubuntu Server 上折腾视频和网页很多人第一次听到“在 Ubuntu Server 上播放视频、显示网页”这个需求第一反应是这不是有病吗Server 版本连桌面环境都没有装它就是为了跑服务、省资源你拿它看视频但实际工作中这个需求出现的频率远比想象中高。我最早碰到这个场景是给一个做数字标牌的朋友帮忙。他们用 Ubuntu Server 做底层系统跑一台 24 小时不间断的广告机需要循环播放宣传视频同时还要在屏幕角落显示一个实时更新的网页看板。用 Desktop 版本当然更省事但 Desktop 自带的桌面环境、后台服务、自动更新弹窗对一台要连续跑几个月不重启的机器来说全是隐患。Server 版本干净、稳定、资源占用低反而是更靠谱的底座。另一个高频场景是家庭媒体中心。手头有台旧笔记本或者小主机装个 Ubuntu Server接上电视用 mpv 播放本地高清片源配合 Anime4K 这类着色器做实时画质增强效果比很多电视盒子强得多。还有人拿它做监控大屏对接海康这类设备的视频流把多路画面拼在一个网页上轮播。所以这个标题背后真正要解决的问题是一个没有图形界面的 Ubuntu Server怎么让它把画面输出到屏幕上并且能播放视频、渲染网页。这里面的核心矛盾在于Server 版本默认不装 X11/Wayland 这类显示服务而 mpv、Chromium 这些程序又依赖图形环境才能把画面画出来。解决思路无非两条要么补一个极简的图形环境要么用帧缓冲framebuffer直接输出。前者通用性好后者更轻量但限制多。这篇文章我会把两条路都讲清楚重点放在“最小化图形环境 mpv Chromium”这套最实用的组合上。适合手里有 Ubuntu Server、想把它改造成媒体播放或信息展示终端的人也适合单纯想搞明白 Linux 图形栈是怎么回事的读者。哪怕你只是想在一台没桌面的机器上临时看个视频下面的内容也能直接抄。2. 整体方案设计与选型思路2.1 先搞清楚 Server 版到底缺了什么Ubuntu Server 和 Desktop 的本质区别不在于“能不能显示画面”而在于默认安装的软件包集合。Server 版没有安装任何显示服务器Xorg 或 Wayland没有窗口管理器没有桌面环境也没有音频服务。内核本身是支持显卡和帧缓冲的硬件层面没问题缺的是上层软件。打个比方内核像是房子的地基和承重墙显卡驱动是水电管线而 Xorg/Wayland 是装修好的房间桌面环境是家具。Server 版只给你地基和管线房间和家具都得自己装。你要播放视频mpv 需要一个“能画画的表面”这个表面要么来自 X11/Wayland要么来自 DRM/KMS 帧缓冲。2.2 两条技术路线的取舍路线一最小化 X11 窗口管理器。装xorg、一个轻量窗口管理器比如openbox或i3再装 mpv 和 Chromium。优点是兼容性最好几乎所有图形程序都能跑多窗口、缩放、输入法都好处理。缺点是多了 X11 这一层资源占用和启动时间略高但对现代硬件来说完全可以接受。路线二直接走 DRM/KMS。mpv 支持--vogpu配合--gpu-contextdrm不依赖 X11 直接输出到显示设备。Chromium 也有--ozone-platformdrm的实验性支持。优点是极致轻量没有 X11 的开销。缺点是配置麻烦多程序同时显示几乎不可能输入设备处理也原始遇到问题排查困难。我的建议很明确除非你有极端的资源限制否则走路线一。多装一个 X11 带来的那点开销换来的是稳定性和可维护性这笔账怎么算都划算。下面所有实操都基于路线一展开路线二我会在排查章节里提一下作为备选。2.3 软件选型为什么是 mpv 和 Chromium播放器选 mpv理由很充分。它是命令行驱动的配置文件纯文本特别适合无人值守的场景。硬件解码支持好VA-API、VDPAU 都能用。更重要的是它支持 Anime4K 这类 GLSL 着色器能在播放时实时做画质增强这是很多图形界面播放器做不到的。VLC 也能用但它的命令行控制和着色器生态不如 mpv 灵活。浏览器选 Chromium 而不是 Firefox主要考虑是 Chromium 的 kiosk 模式和命令行参数更成熟适合做全屏展示。--kiosk、--app、--window-size这些参数组合起来能精确控制显示效果。Firefox 的 kiosk 模式相对弱一些。当然如果你有特殊需求Firefox 也能用思路是一样的。音频方面Server 版默认没有声音服务。如果只是播放视频不需要声音可以跳过。需要声音的话装pulseaudio或者更轻的pipewire配置一下默认输出设备即可。3. 核心细节解析与实操要点3.1 显示环境的最小化安装先更新软件源然后安装 X11 核心和窗口管理器。这里有个关键点不要装ubuntu-desktop或xubuntu-desktop这类元包它们会拖进来一大堆你用不到的东西违背了用 Server 版的初衷。sudo apt update sudo apt install -y xorg openbox xinitxorg提供 X 服务器openbox是一个极轻量的窗口管理器xinit提供startx命令用来手动启动 X 会话。装完之后你还需要一个终端模拟器来在图形界面里执行命令推荐xterm够小够稳。sudo apt install -y xterm显卡驱动方面Intel 和 AMD 的核显用内核自带的i915、amdgpu驱动就行不用额外装。NVIDIA 独显需要装专有驱动sudo ubuntu-drivers autoinstall一般能搞定装完重启。注意如果你用的是 NVIDIA 显卡务必确认驱动装好后再继续否则 X11 可能起不来或者画面撕裂严重。3.2 mpv 的安装与硬件解码配置mpv 在 Ubuntu 仓库里就有直接装sudo apt install -y mpv装完之后关键是配置硬件解码。默认情况下 mpv 可能用软件解码播放 4K 视频时 CPU 会飙到很高。编辑~/.config/mpv/mpv.conf写入以下内容vogpu hwdecauto-safe gpu-apiopengl profilehigh-qualityhwdecauto-safe会让 mpv 自动选择安全的硬件解码方式Intel 核显走 VA-APINVIDIA 走 NVDEC。vogpu是推荐的视频输出后端配合gpu-apiopengl兼容性最好。profilehigh-quality会启用一系列画质相关的默认设置。验证硬件解码是否生效播放时按i键或者看终端输出里有没有Using hardware decoding字样。如果显示software说明硬解没起来需要检查驱动。3.3 Anime4K 着色器的部署Anime4K 是一套基于 GLSL 的实时画质增强着色器对动画和低分辨率视频效果尤其明显。它不是 mpv 自带的需要手动下载。mkdir -p ~/.config/mpv/shaders cd ~/.config/mpv/shaders从 Anime4K 的官方仓库下载着色器文件把.glsl文件放到这个目录。然后在mpv.conf里引用glsl-shaders~/.config/mpv/shaders/Anime4K_Clamp_Highlights.glsl:~/.config/mpv/shaders/Anime4K_Restore_CNN_M.glsl:~/.config/mpv/shaders/Anime4K_Upscale_CNN_x2_M.glsl着色器的加载顺序有讲究一般先做高光钳制再做修复最后做放大。具体用哪几个文件取决于你的显卡性能和片源质量。显卡弱的话用S或M结尾的轻量版本别上L或VL否则帧率会掉得厉害。提示Anime4K 对 GPU 有一定要求核显跑M级别基本是极限独显可以尝试更重的组合。建议先用一个轻量组合测帧率再逐步加码。3.4 Chromium 的安装与 kiosk 模式Ubuntu 仓库里的 Chromium 是 snap 包在 Server 环境下 snap 有时候会有权限和启动问题。如果遇到麻烦可以考虑用apt装chromium-browser或者直接下载官方构建的 deb 包。这里以 snap 版本为例sudo apt install -y chromium-browserkiosk 模式的核心参数是--kiosk它会全屏显示且隐藏所有浏览器界面元素。配合--app指定网址效果就是一个纯净的全屏网页。chromium-browser --kiosk --apphttp://your-dashboard.local --noerrdialogs --disable-infobars--noerrdialogs和--disable-infobars用来屏蔽各种提示条让画面更干净。如果网页需要自动刷新可以在页面里用 JavaScript 定时location.reload()或者用 Chromium 的扩展但 kiosk 模式下装扩展比较麻烦推荐前者。3.5 输入法在 Chromium 里的坑热词里提到“输入法无法在 chromium 浏览器使用”这是个经典问题。根因是 Chromium 默认使用自己的输入法框架和系统的 IBus/Fcitx 不兼容。解决办法是设置环境变量export GTK_IM_MODULEibus export QT_IM_MODULEibus export XMODIFIERSimibus如果你用的是 Fcitx把ibus换成fcitx。这些变量要写在~/.xprofile或者启动 X 的脚本里确保在 Chromium 启动前生效。另外Chromium 的 ozone 平台选择也会影响输入法--ozone-platformx11通常比默认值更稳。4. 实操过程与核心环节实现4.1 从零开始系统准备与依赖安装假设你刚装好 Ubuntu Server 22.04 LTS登录后第一件事是更新系统sudo apt update sudo apt upgrade -y然后安装基础图形环境。这里我把命令拆开方便你理解每一步装了什么sudo apt install -y xorg openbox xinit xterm sudo apt install -y mpv chromium-browser sudo apt install -y alsa-utils pulseaudioalsa-utils提供aplay等工具用来测试音频pulseaudio是声音服务。如果你确定不需要声音最后一行可以省掉。装完后重启一次让内核和驱动加载完整。4.2 配置自动登录与自动启动 X无人值守场景下你肯定不希望每次开机都要手动输密码、敲startx。配置自动登录编辑/etc/systemd/system/gettytty1.service.d/override.conf[Service] ExecStart ExecStart-/sbin/agetty --autologin yourusername --noclear %I $TERM把yourusername换成你的用户名。然后在~/.bash_profile里加一段让登录 tty1 时自动启动 Xif [ -z $DISPLAY ] [ $(tty) /dev/tty1 ]; then exec startx fi这样开机后会自动登录并进入 X 会话。startx默认会启动~/.xinitrc里配置的程序我们接下来配置它。4.3 编写 .xinitrc 启动脚本~/.xinitrc是 X 会话的启动脚本里面定义启动哪些程序。一个典型的媒体终端配置如下#!/bin/bash xset s off xset -dpms xset s noblank openbox sleep 2 mpv --fs --loop-playlist /home/user/videos/playlist.m3u sleep 1 chromium-browser --kiosk --apphttp://localhost:8080 --window-position0,0 xset那三行是关闭屏幕保护和电源管理防止屏幕自动黑屏。openbox 启动窗口管理器后面的表示后台运行。sleep是给程序启动留时间避免抢资源。mpv 用--fs全屏--loop-playlist循环播放播放列表。Chromium 用 kiosk 模式打开本地网页。如果你想让 mpv 和 Chromium 分屏显示可以用--geometry参数控制窗口位置和大小。比如 mpv 占左半边Chromium 占右半边mpv --fs --loop-playlist --geometry50%x100%00 /home/user/videos/playlist.m3u chromium-browser --kiosk --apphttp://localhost:8080 --window-position960,0 --window-size960,1080 具体数值根据你的屏幕分辨率调整。4.4 播放列表与网页看板的准备mpv 的播放列表就是一个文本文件每行一个视频路径/home/user/videos/intro.mp4 /home/user/videos/main.mp4 /home/user/videos/loop.mp4保存为playlist.m3umpv 用--loop-playlist就能无限循环。网页看板这边如果你只是显示一个现成的网页直接填 URL 就行。如果需要本地生成内容可以用 Python 起一个简单的 HTTP 服务python3 -m http.server 8080 --directory /home/user/dashboard把index.html放在dashboard目录里Chromium 访问http://localhost:8080就能看到。index.html里可以用 JavaScript 定时刷新数据比如每 30 秒重新加载一次script setTimeout(function(){ location.reload(); }, 30000); /script4.5 音频输出配置如果视频需要声音先确认音频设备被识别aplay -l找到你的输出设备比如card 0: HDMI。然后用pactl设置默认输出pactl set-default-sink alsa_output.pci-0000_00_1f.3.hdmi-stereo设备名用pactl list short sinks查看。设置好后mpv 播放时就会有声音。如果没声音检查alsamixer里对应通道是不是被静音了。5. 常见问题与排查技巧实录5.1 启动 X 报错 “no screens found”这是最常见的问题通常是显卡驱动没装好或者 X11 配置不对。先看/var/log/Xorg.0.log搜索(EE)开头的行那里会写明具体原因。如果是 NVIDIA 显卡确认nvidia-driver装好了nvidia-smi能正常输出。如果是核显检查内核模块有没有加载lsmod | grep -E i915|amdgpu|nouveau没有输出说明驱动没加载可能需要更新内核或者检查 BIOS 里显卡设置。5.2 mpv 播放卡顿、CPU 占用高九成是硬件解码没生效。播放时看终端输出如果没有Using hardware decoding检查mpv.conf里的hwdec设置。Intel 核显需要装intel-media-va-driverAMD 需要mesa-va-driverssudo apt install -y intel-media-va-driver mesa-va-drivers装完用vainfo命令验证能看到VAProfileH264之类的条目就说明 OK。5.3 Chromium 启动报错 “failed to connect to chromium.googlesource.com”这个报错通常出现在你尝试从源码构建 Chromium 的时候depot_tools拉取超时。如果你只是要用 Chromium根本不需要走源码构建这条路直接用 apt 或 snap 装现成的二进制包就行。源码构建 Chromium 是个极其耗时的过程编译一次动辄几个小时除非你有特殊的定制需求否则完全没必要。5.4 输入法在 Chromium 里打不出中文前面提过环境变量的问题这里补充一个排查顺序。先确认输入法服务在跑ps aux | grep -E ibus|fcitx没有的话先启动它。然后确认环境变量在 Chromium 进程里生效cat /proc/$(pgrep chromium | head -1)/environ | tr \0 \n | grep IM_MODULE如果看不到GTK_IM_MODULE说明变量没传进去检查.xprofile或.xinitrc里的 export 语句位置必须在启动 Chromium 之前。5.5 屏幕自动黑屏或休眠Server 场景下屏幕黑屏很烦人尤其是监控大屏。除了前面xset的三行命令还要检查 systemd 的电源管理sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target这条命令直接屏蔽休眠和挂起一劳永逸。5.6 常见问题速查表问题现象可能原因排查命令解决方向X 启动失败驱动未装/配置错误cat /var/log/Xorg.0.log装驱动、检查 BIOS视频卡顿硬解未生效vainfo装 VA-API 驱动Chromium 无声音默认 sink 不对pactl list short sinks设置默认输出输入法失效环境变量未传检查/proc/pid/environ在启动前 export屏幕黑屏电源管理xset q关闭 DPMS 和休眠画面撕裂垂直同步未开mpv 终端输出设video-syncdisplay-resample5.7 几个踩过的坑第一个坑是snap 版 Chromium 的沙箱问题。在 Server 环境下snap 的 confinement 有时候会阻止 Chromium 访问本地文件或网络。如果遇到莫名其妙的权限错误可以试试--no-sandbox参数但这会降低安全性仅限内网可信环境使用。第二个坑是mpv 的--geometry参数在某些窗口管理器下不生效。openbox 对 geometry 的支持还行但如果你换了别的 WM可能需要用wmctrl这类工具来强制设置窗口位置。第三个坑是Anime4K 着色器和硬件解码冲突。某些驱动下开启硬解后着色器无法正常工作画面会变黑或花屏。解决办法是关掉硬解用软解跑着色器或者换用兼容性更好的着色器组合。这个需要根据你的具体硬件多试几次。第四个坑是Chromium 的 kiosk 模式在网页加载失败时会显示错误页而不是保持上一帧。对于展示场景来说这很尴尬。可以用--app配合一个本地 HTML里面用 iframe 加载远程页面这样即使远程挂了本地框架还在可以显示一个友好的占位内容。6. 进阶玩法与扩展思路6.1 多屏输出与画面拼接如果你有多个显示器X11 可以用xrandr配置扩展桌面。先看有哪些输出接口xrandr --listmonitors然后设置拼接xrandr --output HDMI-1 --mode 1920x1080 --pos 0x0 --output HDMI-2 --mode 1920x1080 --pos 1920x0这样两个屏幕就拼成了一个 3840x1080 的大桌面mpv 可以跨屏全屏播放Chromium 也可以横跨两个屏幕显示一个超宽网页。数字标牌场景下这个玩法很实用。6.2 用 systemd 管理播放服务把 mpv 和 Chromium 做成 systemd 服务比放在.xinitrc里更可控能设置自动重启、日志收集、依赖关系。一个 mpv 的 service 文件示例[Unit] DescriptionMPV Player Aftergraphical.target [Service] Useruser EnvironmentDISPLAY:0 ExecStart/usr/bin/mpv --fs --loop-playlist /home/user/videos/playlist.m3u Restartalways [Install] WantedBygraphical.targetRestartalways保证程序崩溃后自动拉起这对无人值守场景至关重要。Chromium 同理把ExecStart换成 Chromium 的命令即可。6.3 远程管理与状态监控机器放在远处你不可能每次都接键盘鼠标。开个 SSH 是基本操作还可以装x11vnc来远程看画面sudo apt install -y x11vnc x11vnc -display :0 -forever -shared -rfbauth ~/.vnc/passwd这样用 VNC 客户端连上去就能看到实际画面排查显示问题特别方便。状态监控可以用glances或者简单的htop看 CPU、内存、GPU 占用。6.4 视频流对接的注意事项热词里提到海康设备取流和倍数播放这里简单说下思路。海康的 RTSP 流地址一般是rtsp://user:passip:554/Streaming/Channels/101这种格式mpv 可以直接播放mpv --fs rtsp://admin:password192.168.1.64:554/Streaming/Channels/101倍数播放用--speed2.0参数。但要注意RTSP 流的倍数播放取决于设备是否支持有些设备不支持变速mpv 这边设了也没用。另外 RTSP 流对网络稳定性要求高丢包会导致花屏建议用有线网络并且给 mpv 加上--cacheyes --demuxer-max-bytes50M之类的缓存参数。6.5 离开页面暂停视频的实现网页里实现“离开页面暂停视频”用 Page Visibility APIdocument.addEventListener(visibilitychange, function() { var video document.getElementById(myVideo); if (document.hidden) { video.pause(); } else { video.play(); } });这个在 kiosk 模式下也有用比如你用wmctrl切换窗口时后台的 Chromium 会触发visibilitychange视频自动暂停省资源。7. 一些个人体会这套方案我前前后后搭过五六次从最早的 Ubuntu 16.04 到现在的 22.04坑踩了不少但整体思路没变过用最小的图形环境跑最需要的程序把稳定性放在第一位。Server 版的干净是它的优势别因为要显示画面就把 Desktop 那一套全搬过来那样就失去了用 Server 的意义。mpv 的配置文件建议用版本管理管起来每次调整都留个记录因为着色器和硬解的兼容性组合太多了今天能用的配置明天换个驱动可能就出问题有个历史记录能省很多事。Chromium 的 kiosk 模式尽量用本地 HTML 做壳远程内容用 iframe 嵌这样网络波动不会直接暴露给观众。最后说个小事如果你只是临时想在一台 Server 上看个视频其实不用这么麻烦装个mpv然后mpv --vodrm video.mp4就能直接在帧缓冲上播看完卸载就行。但如果是长期运行的展示终端还是老老实实按上面的方案来多花半小时配置换来的是几个月的安稳。
阅读完成 · 觉得有帮助?
咨询建站