UXPlay 投屏录制 Podman 部署完整笔记
1. 环境信息
- 宿主机系统:Debian GNU/Linux 13 (trixie/testing)
- 内核:6.12.96+deb13-amd64
- CPU:Intel Celeron 2955U @ 1.40GHz (Haswell 架构,双核双线程)
- 容器镜像:docker.1ms.run/dachack/uxplay:latest
- 容器运行时:Podman
- 硬件加速状态:无 VA-API 硬件加速支持(缺少驱动和插件)
2. UXPlay 参数说明
2.1 录制相关参数
| 参数 | 说明 |
|---|
-mp4 <filename> | 录制音视频到 MP4 文件 |
-p | 使用标准 AirPlay 端口(便于设备发现) |
-vs <sink> | 指定视频输出目标,fakesink 为虚拟设备(不显示) |
-as <sink> | 指定音频输出目标,fakesink 为虚拟设备(不播放) |
-vd <decoder> | 指定视频解码器 |
-a 或 -as 0 | 完全禁用音频 |
-fps <n> | 限制最大帧率 |
-s <WxH> | 请求客户端发送指定分辨率 |
2.2 错误用法说明
| 错误用法 | 原因 |
|---|
-nodisplay | 不是有效选项 |
-f <filename> | -f 用于翻转视频,不是保存文件 |
-vs 0 | 完全禁用视频渲染,导致只录制音频 |
2.3 正确的录制命令
uxplay -mp4 /recordings/screen_$(date +%Y%m%d_%H%M%S).mp4 -p -vs fakesink -as fakesink
2.4 CPU 负载对比(理论值)
| 场景 | CPU 占用率(估算) |
|---|
| avdec_h264(1080p@30fps) | 60-80% |
| avdec_h264(1080p@15fps) | 30-40% |
| avdec_h264(720p@15fps) | 20-30% |
| openh264dec(1080p@30fps) | 50-70% |
| openh264dec(1080p@15fps) | 25-35% |
| openh264dec(720p@15fps) | 15-25% |
2.5 实际使用建议,现用的openh264dec
| 推荐等级 | 命令 | 理由 |
|---|
| 首选 | 命令3(avdec_h264) | 稳定可靠,在所有系统上行为一致 |
| 备选 | 命令2(openh264dec) | 如果 openh264 插件安装正确且稳定 |
| 不推荐 | 命令1(自动选择) | 行为不可预测,不利于问题定位 |
3. 解码器选择
3.1 系统可用解码器
gst-inspect-1.0 | grep -i h264dec
输出显示:
| 解码器 | Rank | 类型 | 说明 |
|---|
| avdec_h264 | primary (256) | 软件解码 | FFmpeg 解码器,稳定可靠 |
| openh264dec | marginal (64) | 软件解码 | Cisco 优化解码器,CPU 负载略低 |
3.2 解码器对比
| 特性 | avdec_h264 | openh264dec |
|---|
| CPU 负载 | 较高 | 较低(约低 10-20%) |
| 稳定性 | 优秀 | 一般 |
| 依赖包 | gstreamer1.0-libav | gstreamer1.0-plugins-bad |
| 可用性 | 始终可用 | 需要额外安装 |
3.3 指定解码器命令
# 使用 avdec_h264(稳定)
uxplay -mp4 /recordings/screen_$(date +%Y%m%d_%H%M%S).mp4 -p -vd avdec_h264 -vs fakesink -as fakesink
# 使用 openh264dec(负载较低)
uxplay -mp4 /recordings/screen_$(date +%Y%m%d_%H%M%S).mp4 -p -vd openh264dec -vs fakesink -as fakesink
4. CPU 负载优化
4.1 优化参数组合
uxplay -mp4 /recordings/screen_$(date +%Y%m%d_%H%M%S).mp4 -p -vd avdec_h264 -vs fakesink -as fakesink -fps 15 -s 1280x720
4.2 优化参数说明
| 参数 | 作用 | 效果 |
|---|
-vd avdec_h264 | 指定解码器 | 确保使用正确的解码器 |
-fps 15 | 限制帧率为 15fps | 减少约 50% 的解码工作量 |
-s 1280x720 | 请求 720p 分辨率 | 减少约 50% 的解码工作量 |
-vs fakesink | 不显示视频 | 节省显示资源 |
-as fakesink | 不播放音频 | 节省音频处理资源 |
5. 基础 Podman 运行命令
5.1 直接运行录制
podman run --rm -it \
--name uxplay-recorder \
--network=host \
-v /dev/shm:/dev/shm \
-v /data/uxplay/recordings:/recordings \
-v /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket:ro \
-v /var/run/avahi-daemon/socket:/var/run/avahi-daemon/socket \
-e LIBVA_DRIVER_NAME=i965 \
docker.1ms.run/dachack/uxplay:latest \
uxplay -mp4 /recordings/screen_$(date +%Y%m%d_%H%M%S).mp4 -p -vd avdec_h264 -vs fakesink -as fakesink -fps 15 -s 1280x720
5.2 进入容器调试
podman run --rm -it \
--name uxplay-recorder \
--network=host \
-v /dev/shm:/dev/shm \
-v /data/uxplay/recordings:/recordings \
-v /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket:ro \
-v /var/run/avahi-daemon/socket:/var/run/avahi-daemon/socket \
-e LIBVA_DRIVER_NAME=i965 \
docker.1ms.run/dachack/uxplay:latest \
sh
5.3 卷挂载说明
| 挂载点 | 说明 |
|---|
/dev/shm:/dev/shm | 共享内存,用于视频缓冲 |
/data/uxplay/recordings:/recordings | 录制文件保存目录 |
/var/run/dbus/system_bus_socket | D-Bus 套接字(只读) |
/var/run/avahi-daemon/socket | Avahi 服务发现套接字 |
6. 自定义镜像构建
6.1 Dockerfile(精简版)
FROM docker.1ms.run/dachack/uxplay:latest
# 安装 avdec_h264 解码器(gstreamer1.0-libav)
# 或安装 openh264dec(gstreamer1.0-plugins-bad)
RUN apt update && \
apt install -y \
gstreamer1.0-libav \
gstreamer1.0-plugins-bad \
&& rm -rf /var/lib/apt/lists/*
# 不设置 ENTRYPOINT,允许运行任意命令
6.2 构建命令
cd /data/uxplay
podman build -t uxplay-recorder:latest .
6.3 使用自定义镜像
# 进入 shell
podman run --rm -it --entrypoint sh uxplay-recorder:latest
# 直接运行录制
podman run --rm -it \
--name uxplay-recorder \
--network=host \
-v /dev/shm:/dev/shm \
-v /data/uxplay/recordings:/recordings \
-v /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket:ro \
-v /var/run/avahi-daemon/socket:/var/run/avahi-daemon/socket \
-e LIBVA_DRIVER_NAME=i965 \
uxplay-recorder:latest \
uxplay -mp4 /recordings/screen_$(date +%Y%m%d_%H%M%S).mp4 -p -vd avdec_h264 -vs fakesink -as fakesink -fps 15 -s 1280x720
7. Docker Compose 配置
7.1 docker-compose.yml
version: '3.8'
services:
uxplay-recorder:
image: docker.1ms.run/dachack/uxplay:latest
container_name: uxplay-recorder
network_mode: host
volumes:
- /dev/shm:/dev/shm
- /data/uxplay/recordings:/recordings
- /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket:ro
- /var/run/avahi-daemon/socket:/var/run/avahi-daemon/socket
environment:
- LIBVA_DRIVER_NAME=i965
command: >
sh -c "uxplay -mp4 /recordings/screen_$$(date +%Y%m%d_%H%M%S).mp4 -p -vd avdec_h264 -vs fakesink -as fakesink -fps 15 -s 1280x720"
restart: no
7.2 使用 docker-compose 的自定义镜像版本
version: '3.8'
services:
uxplay-recorder:
build:
context: .
dockerfile: Dockerfile
image: uxplay-recorder:latest
container_name: uxplay-recorder
network_mode: host
volumes:
- /dev/shm:/dev/shm
- /data/uxplay/recordings:/recordings
- /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket:ro
- /var/run/avahi-daemon/socket:/var/run/avahi-daemon/socket
environment:
- LIBVA_DRIVER_NAME=i965
- DECODER=avdec_h264
- FPS=15
- RESOLUTION=1280x720
command: >
sh -c "uxplay -mp4 /recordings/screen_$$(date +%Y%m%d_%H%M%S).mp4 -p -vd $${DECODER} -vs fakesink -as fakesink -fps $${FPS} -s $${RESOLUTION}"
restart: unless-stopped
7.3 Compose 命令
# 启动
podman-compose up -d
# 查看日志
podman-compose logs -f
# 停止
podman-compose down
8. 容器内依赖安装(临时测试用)
8.1 安装解码器
# 进入容器
podman exec -it uxplay sh
# 安装 avdec_h264
apt update
apt install -y gstreamer1.0-libav gstreamer1.0-plugins-ugly
# 或安装 openh264dec
apt install -y gstreamer1.0-plugins-bad
8.2 验证安装
gst-inspect-1.0 avdec_h264
gst-inspect-1.0 openh264dec
9. 常见问题及解决方案
9.1 录制文件只有音频没有视频
| 问题原因 | 解决方案 |
|---|
使用了 -vs 0 参数 | 改用 -vs fakesink |
| 视频渲染被禁用 | 移除 -vs 0,使用 -vs fakesink |
9.2 GStreamer 崩溃
| 错误信息 | 解决方案 |
|---|
gst_vec_deque_pop_head: assertion 'array != NULL' failed | 确保正确指定了 -as 和 -vs 参数 |
GStreamer:ERROR:../gst/gstbus.c:617 | 使用 fakesink 作为音视频输出 |
9.3 Socket 错误
| 错误信息 | 解决方案 |
|---|
Error initialising socket 98 | 解码器插件未正确加载,检查 gst-inspect-1.0 输出 |
9.4 进入容器时提示 unknown option sh
| 原因 | 解决方案 |
|---|
镜像设置了 ENTRYPOINT ["uxplay"] | 使用 --entrypoint sh 覆盖 |
示例:podman run --rm -it --entrypoint sh image_name | |
10. 前置条件检查
10.1 Avahi 服务
# 检查状态
systemctl status avahi-daemon
# 启动服务
systemctl start avahi-daemon
10.2 录制目录
mkdir -p /data/uxplay/recordings
chmod 755 /data/uxplay/recordings
10.3 解码器可用性
# 在容器内检查
gst-inspect-1.0 | grep -i h264dec
11. 最终推荐配置
11.1 Dockerfile
FROM docker.1ms.run/dachack/uxplay:latest
RUN apt update && \
apt install -y \
gstreamer1.0-libav \
gstreamer1.0-plugins-bad \
&& rm -rf /var/lib/apt/lists/*
11.2 运行命令
podman run --rm -it \
--name uxplay-recorder \
--network=host \
-v /dev/shm:/dev/shm \
-v /data/uxplay/recordings:/recordings \
-v /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket:ro \
-v /var/run/avahi-daemon/socket:/var/run/avahi-daemon/socket \
-e LIBVA_DRIVER_NAME=i965 \
uxplay-recorder:latest \
uxplay -mp4 /recordings/screen_$(date +%Y%m%d_%H%M%S).mp4 -p -vd avdec_h264 -vs fakesink -as fakesink -fps 15 -s 1280x720
11.3 参数组合说明
最终采用的参数组合实现了以下目标:
- 录制视频和音频到 MP4 文件
- 不显示视频窗口(
-vs fakesink) - 不播放音频(
-as fakesink) - 使用稳定的软件解码器(
-vd avdec_h264) - 限制帧率为 15fps(
-fps 15) - 请求 720p 分辨率(
-s 1280x720) - 使用标准 AirPlay 端口(
-p)
这套配置在无硬件加速的 Celeron 2955U 上,能够有效降低 CPU 负载,实现稳定的 AirPlay 投屏录制。