ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Ubuntu Server 视频播放全攻略:从图形界面到网页流媒体

Ubuntu Server 视频播放全攻略:从图形界面到网页流媒体 1. 先搞清楚一件事Server 版 Ubuntu 到底能不能播视频很多人第一次拿到 Ubuntu Server 的时候脑子里想的都是这不就是个没有桌面的 Linux 嘛装个播放器不就完了。结果一上手就懵了——apt install vlc装是装上了敲vlc回车终端里蹦出来一堆报错什么cannot open display、no protocol specified视频窗口连个影子都没有。这不是你操作有问题而是 Ubuntu Server 从设计上就没打算让你在本机屏幕上直接看视频。它默认不装任何图形界面没有 X11 或 Wayland 显示服务没有显卡驱动甚至连声卡驱动都未必齐全。播放器本质上是一个图形程序它需要一个画布才能把画面渲染出来而 Server 版连这块画布都没有。所以这个问题的本质不是怎么装播放器而是怎么给一台没有图形环境的服务器创造出一个能显示视频画面的条件。围绕这个核心实际需求可以分成几类本机接显示器直接播放服务器就放在你旁边插着显示器你想让它像普通电脑一样放视频。远程访问时看到画面服务器在机房或者云端你通过 SSH 连过去想看到视频画面。把视频转成网页可播放的流服务器作为媒体源把视频推成网页能直接访问的流用浏览器看。在服务器上做视频处理比如转码、截图、分析不需要看但需要解码能力。这四种场景对应的方案完全不同选错了方向会浪费大量时间。下面我按从简单到复杂的顺序把每条路都走一遍把踩过的坑和关键细节都摊开讲。提示在动手之前先确认你的服务器有没有独立显卡或者集成显卡。纯 CPU 解码虽然能跑但 1080P 以上就会很吃力4K 基本没戏。用lspci | grep -i vga可以快速查看显卡信息。2. 方案一给 Server 装上轻量图形界面本机直接播这是最直观的思路——既然 Server 没有图形界面那就装一个。但这里有个关键选择装什么桌面环境。很多人第一反应是装 Ubuntu Desktop 的完整 GNOME 桌面apt install ubuntu-desktop一把梭。我不推荐这么做原因很简单GNOME 太重了它会拉进来大量的依赖包占用 1.5GB 以上的磁盘空间启动后内存占用轻松超过 1GB。对于一台本来就资源紧张的服务器来说这是巨大的浪费。而且 GNOME 的很多组件比如在线账户、蓝牙管理、打印服务在服务器场景下完全用不上。2.1 桌面环境选型XFCE 还是 LXQt我的建议是选XFCE或者LXQt这两个都是轻量级桌面内存占用在 300-500MB 左右磁盘占用不到 500MB而且该有的功能都有。桌面环境内存占用磁盘占用适合场景GNOME1GB1.5GB不推荐用于 ServerKDE Plasma800MB1.2GB功能全但偏重XFCE300-500MB400MB推荐稳定成熟LXQt250-400MB350MB推荐更轻量安装 XFCE 的命令很直接sudo apt update sudo apt install xfce4 xfce4-goodies -y装完之后还需要一个显示管理器也就是登录界面推荐用lightdm它比gdm3轻得多sudo apt install lightdm -y安装过程中会弹出一个界面让你选择默认显示管理器选lightdm就行。装完之后重启sudo reboot重启后你应该能看到图形登录界面了。登录进去打开终端装播放器sudo apt install vlc -yVLC 在 Linux 上的兼容性是最好的几乎什么格式都能播不需要额外装解码器包。如果你更喜欢 MPV也可以sudo apt install mpv -y2.2 显卡驱动视频能不能流畅播的关键装完桌面和播放器很多人会发现视频能播但很卡尤其是 1080P 以上。这十有八九是显卡驱动没装好系统在用 CPU 软解。对于 Intel 集成显卡大多数服务器用的都是 Intel 核显或者没有独显驱动是开源的一般已经内置了sudo apt install intel-media-va-driver-non-free -y对于 NVIDIA 独立显卡需要装专有驱动sudo apt install nvidia-driver-535 -y装完驱动后用vainfo命令可以验证硬件加速是否启用sudo apt install vainfo -y vainfo如果输出里能看到VAProfileH264、VAProfileHEVC这些条目说明硬件解码已经可用了。VLC 里需要在工具 → 偏好设置 → 输入/编解码器 → 硬件加速解码里选上对应的选项。注意服务器主板上的显卡输出接口有时候默认是关闭的需要在 BIOS 里把Primary Display设置成对应的接口比如 Onboard VGA 或者 PCIe否则接显示器可能没信号。2.3 音频输出别忽略了声卡视频有画面还得有声音。服务器通常没有内置扬声器你需要通过 3.5mm 接口或者 HDMI 输出音频。先检查声卡是否被识别aplay -l如果能看到card 0: PCH [HDA Intel PCH]之类的输出说明声卡正常。如果 HDMI 接的显示器带音箱需要把默认输出切到 HDMIpactl set-default-sink alsa_output.pci-0000_00_1f.3.hdmi-stereo具体的 sink 名称用pactl list short sinks查看。这一步很多人会漏掉结果视频播了但没声音折腾半天以为是驱动问题。3. 方案二不装桌面用 X11 转发把画面送到本地如果你的服务器在远端不方便接显示器又不想装整个桌面环境那 X11 转发是一个折中方案。它的原理是服务器上运行播放器程序但画面通过网络传到你本地的 X Server 上显示。这个方案的前提是你本地得有一个 X Server。Linux 和 macOS 桌面版自带Windows 需要装 VcXsrv 或者 Xming。3.1 配置 SSH 的 X11 转发在服务器端确保/etc/ssh/sshd_config里有这两行X11Forwarding yes X11DisplayOffset 10改完重启 SSH 服务sudo systemctl restart sshd然后在你本地机器上用-X或者-Y参数连接ssh -X useryour-server-ip-X是标准转发-Y是信任模式转发权限更宽松某些程序需要。连上之后在服务器上装个轻量播放器sudo apt install mpv -y然后直接运行mpv your-video.mp4如果一切正常视频窗口会出现在你本地的屏幕上。3.2 X11 转发的真实体验和局限说实话X11 转发播视频的体验并不好。原因在于 X11 协议本身不是为传输视频流设计的它传的是绘图指令每一帧画面都要经过网络往返。局域网内还能勉强看跨公网基本就是幻灯片。我实测过在千兆局域网内用 X11 转发播 720P 视频延迟大概在 200-300ms画面偶尔会撕裂。1080P 就明显卡顿了。所以这个方案只适合偶尔看看短视频或者做调试用不适合长时间观看。另外X11 转发对音频不会自动处理声音还是在服务器端。你需要额外配置 PulseAudio 的网络传输或者干脆用-R参数把音频端口转发过来。这部分配置比较繁琐实际用的人不多。提示如果只是想在远端看视频其实更推荐方案三——把视频转成网页流用浏览器看体验好得多。4. 方案三把视频变成网页能播的流浏览器直接访问这是我认为最实用的方案尤其适合服务器在远端、你只想用浏览器看视频的场景。核心思路是在服务器上跑一个流媒体服务把视频文件或者实时画面转成 HTTP 流然后你在任何设备的浏览器里打开一个网址就能看。4.1 用 FFmpeg 做 HLS 切片HLSHTTP Live Streaming是目前兼容性最好的网页视频流方案iOS、Android、桌面浏览器全都支持。它的原理是把视频切成一个个小的 TS 片段再用一个 m3u8 播放列表串起来。先装 FFmpegsudo apt install ffmpeg -y然后一条命令就能把视频转成 HLSffmpeg -i input.mp4 \ -c:v libx264 -preset veryfast -crf 23 \ -c:a aac -b:a 128k \ -f hls -hls_time 6 -hls_list_size 0 \ -hls_segment_filename output_%03d.ts \ output.m3u8参数解释一下-c:v libx264视频用 H.264 编码兼容性最好。-preset veryfast编码速度优先画质略降但转码快。-crf 23画质参数数值越小画质越好23 是默认值。-hls_time 6每个 TS 片段 6 秒。-hls_list_size 0播放列表保留所有片段适合点播。转完之后你会得到一堆.ts文件和一个.m3u8文件。用 Nginx 或者 Python 自带的 HTTP 服务器就能提供访问python3 -m http.server 8080然后在浏览器里打开http://your-server-ip:8080/output.m3u8不过浏览器不能直接播 m3u8需要一个 HTML 页面配合 hls.js!DOCTYPE html html head title视频播放/title script srchttps://cdn.jsdelivr.net/npm/hls.jslatest/script /head body video idvideo controls width800/video script var video document.getElementById(video); var videoSrc output.m3u8; if (Hls.isSupported()) { var hls new Hls(); hls.loadSource(videoSrc); hls.attachMedia(video); } else if (video.canPlayType(application/vnd.apple.mpegurl)) { video.src videoSrc; } /script /body /html把这个 HTML 文件放到同一个目录浏览器打开就能看了。4.2 实时推流把服务器屏幕或者摄像头变成网页流如果你想把服务器的实时画面比如桌面操作过程推到网页上FFmpeg 也能做。先装一个虚拟显示服务sudo apt install xvfb -y然后用 Xvfb 创建一个虚拟显示器Xvfb :99 -screen 0 1280x720x24 export DISPLAY:99在这个虚拟显示器上跑你的程序然后用 FFmpeg 抓屏推流ffmpeg -f x11grab -video_size 1280x720 -framerate 25 -i :99 \ -c:v libx264 -preset veryfast -tune zerolatency \ -f hls -hls_time 2 -hls_list_size 3 \ -hls_flags delete_segments \ stream.m3u8这样就能实现一个低延迟的网页直播流。-tune zerolatency是关键它会让编码器不做缓冲牺牲一点压缩率换取低延迟。4.3 用 Nginx 做流媒体服务器Python 的http.server只适合测试正式用还是得上 Nginx。装好 Nginx 后在配置文件里加一个 locationserver { listen 8080; root /var/www/video; location / { add_header Access-Control-Allow-Origin *; types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } } }Access-Control-Allow-Origin *这行很重要不加的话跨域请求会被浏览器拦截视频加载不出来。这个坑我踩过排查了半天才发现是 CORS 问题。5. 方案四纯命令行下的视频处理与播放有时候你并不需要真的看视频而是需要在服务器上对视频做处理——转码、截图、提取音频、分析内容。这种情况下命令行工具比图形播放器更高效。5.1 FFmpeg 常用操作速查FFmpeg 是服务器上处理视频的瑞士军刀几个高频操作# 截取视频某一帧作为图片 ffmpeg -i input.mp4 -ss 00:01:30 -vframes 1 screenshot.jpg # 视频转码H.265 转 H.264 ffmpeg -i input_hevc.mp4 -c:v libx264 -crf 23 -c:a copy output_h264.mp4 # 提取音频 ffmpeg -i input.mp4 -vn -c:a copy output.m4a # 压缩视频降低码率 ffmpeg -i input.mp4 -b:v 1M -b:a 128k output_compressed.mp4 # 查看视频信息 ffprobe -v quiet -print_format json -show_format -show_streams input.mp4ffprobe这个命令特别有用它能输出视频的编码格式、分辨率、码率、帧率等详细信息排查播放问题时第一时间就该用它。5.2 用 mpv 在终端里看视频你可能不知道mpv 有一个--votct模式可以在纯终端里用字符画的方式显示视频。虽然画质惨不忍睹但在没有图形界面的情况下应急还是有点用的mpv --votct your-video.mp4还有一个--vokitty模式如果你用的终端支持 Kitty 图形协议能显示真正的画面。不过这个限制比较多实际用的人少。更实用的是用 mpv 做无头播放测试验证视频文件能不能正常解码mpv --no-video --aonull your-video.mp4这个命令会解码音频但不输出用来检查文件是否损坏很有用。5.3 视频分析用 Python 做帧提取和处理如果你需要在服务器上做视频内容分析Python 的 OpenCV 是最常用的工具sudo apt install python3-opencv -y然后写个脚本提取关键帧import cv2 cap cv2.VideoCapture(input.mp4) fps cap.get(cv2.CAP_PROP_FPS) total_frames int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) # 每秒提取一帧 interval int(fps) count 0 while True: ret, frame cap.read() if not ret: break if count % interval 0: cv2.imwrite(fframe_{count}.jpg, frame) count 1 cap.release() print(f共提取 {count // interval} 帧)这个脚本在服务器上跑完全没问题不需要任何图形环境。OpenCV 底层用的是 FFmpeg 的解码库纯 CPU 也能跑只是速度慢一些。6. 踩坑实录那些让我折腾半天的典型问题6.1 装了桌面但 VLC 报 no suitable decoder module这个报错通常是因为缺少解码器包。Ubuntu 默认的软件源里有些解码器因为授权问题没有包含需要额外装sudo apt install ubuntu-restricted-extras -y这个包会拉进来一堆多媒体解码器包括 MP3、H.264、H.265 等。装的时候会弹出一个许可协议界面用 Tab 键选确定再回车就行。如果还不行检查一下 VLC 的工具 → 偏好设置 → 输入/编解码器 → 硬件加速解码是不是设成了禁用。有时候自动检测会出问题手动选VA-API或者VDPAU反而能解决。6.2 网页播放 m3u8 时一直转圈加载不出来这个问题有几种可能按排查顺序来CORS 问题打开浏览器开发者工具看 Console 里有没有跨域报错。有的话在 Nginx 配置里加Access-Control-Allow-Origin *。MIME 类型不对Nginx 默认可能不认识.m3u8和.ts文件需要手动指定types块。路径问题m3u8 文件里的 TS 片段路径是相对路径如果 m3u8 和 TS 不在同一目录需要调整。编码问题有些视频的 H.264 profile 太高比如 High 10浏览器不支持需要用 FFmpeg 重新编码成 Main profile。我遇到最多的是第一种和第二种尤其是第一次配 Nginx 的时候两个问题同时出现排查起来很费劲。6.3 硬件加速启用了但视频还是卡vainfo显示硬件解码可用但播放还是卡这种情况通常是渲染环节的问题。检查一下桌面环境的合成器是不是开了太多特效关掉试试。播放器的视频输出模块选的是不是xv或者gl换成vaapi试试。如果是 4K 视频检查 HDMI 线是不是 2.0 以上的版本1.4 的线带宽不够。还有一个容易被忽略的点服务器的 CPU 如果太老比如 Intel 四代以前它的核显可能不支持 H.265 硬解只能软解那卡就是正常的换什么配置都没用。6.4 SSH 连接下运行图形程序报 cannot open display这个错误的根本原因是 SSH 会话没有传递 DISPLAY 环境变量。解决办法export DISPLAY:0:0是本机第一个显示器的编号。如果服务器上跑着 X Server这样设置后图形程序就能在本机显示器上显示了。但如果你是通过 SSH 远程连的:0指的是服务器本机的显示器不是你的本地屏幕。要在本地显示还是得用前面说的 X11 转发。7. 怎么选不同场景下的方案对照把上面几条路捋一遍实际选择的时候可以对照这个表场景推荐方案关键工具难度服务器在旁边接显示器看装 XFCE VLCxfce4, vlc低远程 SSH偶尔看短视频X11 转发 mpvssh -X, mpv中远程想用浏览器看FFmpeg HLS Nginxffmpeg, nginx中实时画面推流到网页Xvfb FFmpeg HLSxvfb, ffmpeg高只做视频处理不看画面FFmpeg 命令行ffmpeg, ffprobe低视频内容分析Python OpenCVpython3-opencv中我个人最常用的是 FFmpeg Nginx 这套组合。原因是它一次配置好之后任何设备只要能打开浏览器就能看不用装客户端也不用折腾 X11 转发。而且服务器上不需要装桌面环境资源占用最小。如果你只是临时需要看个视频装 XFCE 是最快的路径半小时就能搞定。但如果你经常需要在服务器上处理视频花点时间把 FFmpeg 和 Nginx 配好长期来看省事得多。最后分享一个我自己的习惯在服务器上专门建一个/srv/media目录放视频文件Nginx 的 root 指向这个目录FFmpeg 的输出也放这里。这样不管是点播还是推流路径统一管理起来清爽。另外记得给这个目录设好权限别让无关用户能访问到你的视频文件。
返回列表