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_h264primary (256)软件解码FFmpeg 解码器,稳定可靠
openh264decmarginal (64)软件解码Cisco 优化解码器,CPU 负载略低

3.2 解码器对比

特性avdec_h264openh264dec
CPU 负载较高较低(约低 10-20%)
稳定性优秀一般
依赖包gstreamer1.0-libavgstreamer1.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_socketD-Bus 套接字(只读)
/var/run/avahi-daemon/socketAvahi 服务发现套接字

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 参数组合说明

最终采用的参数组合实现了以下目标:

  1. 录制视频和音频到 MP4 文件
  2. 不显示视频窗口(-vs fakesink
  3. 不播放音频(-as fakesink
  4. 使用稳定的软件解码器(-vd avdec_h264
  5. 限制帧率为 15fps(-fps 15
  6. 请求 720p 分辨率(-s 1280x720
  7. 使用标准 AirPlay 端口(-p

这套配置在无硬件加速的 Celeron 2955U 上,能够有效降低 CPU 负载,实现稳定的 AirPlay 投屏录制。

标签: none

添加新评论