iPhone投屏到Ubuntu

作者:zhangyunlong 发布时间: 2025-08-09 阅读量:8 评论数:0

核心思路

1. AirPlay 接收端运行在 Ubuntu

  • 用 UxPlay / OpenAirPlay / raop-play 等软件

  • Ubuntu 直接监听局域网的 AirPlay 投屏请求

2. iPhone 直接连接 Ubuntu

  • iPhone 和 Ubuntu 必须在 同一 Wi-Fi

  • iPhone “屏幕镜像”选择 Ubuntu 上的 AirPlay 设备

3. 优点

  • 没有额外硬件成本

  • 延迟主要由 Ubuntu 性能和 Wi-Fi 决定

4. 局限

  • iPhone 锁屏后投屏会中断

  • 无法直接操作 iPhone,只能观看


RPiPlay

  • 原本为树莓派写的,但也能在普通 Linux 运行

  • 使用更轻量的解码(OpenGL + SDL),延迟比 UxPlay 低

  • 功能上和 UxPlay 类似,也能接收 AirPlay 屏幕镜像

原本为树莓派写的,但也能在普通 Linux 运行

使用更轻量的解码(OpenGL + SDL),延迟比 UxPlay 低

功能上和 UxPlay 类似,也能接收 AirPlay 屏幕镜像

1. 安装依赖

zhangyunlong@matebook14s:~$ sudo apt install \
  cmake \
  build-essential \
  libavahi-compat-libdnssd-dev \
  libssl-dev \
  libexpat1-dev \
  libasound2-dev \
  libsdl2-dev \
  libgstreamer1.0-dev \
  libgstreamer-plugins-base1.0-dev libplist-dev \
  streamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly

2. 克隆RPiPlay项目

zhangyunlong@matebook14s:~$ cd /opt/
zhangyunlong@matebook14s:/opt$ sudo git clone https://github.com/FD-/RPiPlay.git
正克隆到 'RPiPlay'...
remote: Enumerating objects: 3145, done.
remote: Total 3145 (delta 0), reused 0 (delta 0), pack-reused 3145 (from 1)
接收对象中: 100% (3145/3145), 6.82 MiB | 82.00 KiB/s, 完成.
处理 delta 中: 100% (1693/1693), 完成.
zhangyunlong@matebook14s:/opt$

3. 编译RPiPLay

zhangyunlong@matebook14s:/opt$ cd RPiPlay/
zhangyunlong@matebook14s:/opt/RPiPlay$ sudo mkdir build && cd build
zhangyunlong@matebook14s:/opt/RPiPlay/build$
zhangyunlong@matebook14s:/opt/RPiPlay/build$ sudo cmake ..
zhangyunlong@matebook14s:/opt/RPiPlay/build$ sudo make -j$(nproc)

4. 启动RPiPlay

zhangyunlong@matebook14s:/opt/RPiPlay/build$ ./rpiplay -r opengl -n "matebook14s"
Initialized server socket(s)
*** WARNING *** The program 'rpiplay' uses the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see <http://0pointer.de/blog/projects/avahi-compat.html>

5. iPhone投屏

  • 保持iPhone和Ubuntu系统在同一个局域网下

  • iPhone找到屏幕镜像, 待RPIiPlay启动后, 选择目标设备

6. 如需投屏左右镜像反转(适用于HUD等场景)

cd /opt/RPiPlay/renderers
vim video_renderer_gstreamer.c
找到这一行:
g_string_append(launch, "autovideosink name=video_sink sync=false");
修改为:
g_string_append(launch, "videoflip method=horizontal-flip ! autovideosink name=video_sink sync=false");
​
# 重新编译
cd /opt/RPiPlay/build
cmake ..
make -j$(nproc)

7.创建启动脚本

/opt/RPiPlay目录下创建启动脚本airplay.sh ,同时上传一个logo图标到/opt/RPiPlay目录下,命名为airplay.png

cd /opt/RPiPlay
touch airplay.sh
chmod +x airplay.sh

启动脚本内容如下:

#!/bin/bash

# ===== 配置区域 =====
# 你可以在此修改程序路径和参数
PROGRAM_NAME="rpiplay"
PROGRAM_PATH="/opt/RPiPlay/build/rpiplay"
PROGRAM_ARGS='-n "matebook14s" -r opengl'
NOTIFICATION_TYPE="notify"
# ====================

# 函数:发送弹窗提示
send_notification() {
    local title="$1"
    local message="$2"
    local type="$3"

    if [ "$NOTIFICATION_TYPE" = "notify" ]; then
        # 使用 notify-send 发送系统通知(成功/失败图标不同)
        if [ "$type" = "success" ]; then
            notify-send -i "video-display" --app-name="RPiPlay" "$title" "$message"
        else
            notify-send -i "dialog-error" --app-name="RPiPlay" "$title" "$message"
        fi
    fi
}

# --- 原有进程管理逻辑 (开始) ---
echo "正在检查现有的 $PROGRAM_NAME 进程..."
pkill -f "$PROGRAM_NAME"
WAIT_COUNT=0
while pgrep -f "$PROGRAM_NAME" > /dev/null && [ $WAIT_COUNT -lt 4 ]; do
    sleep 0.5
    ((WAIT_COUNT++))
done
if pgrep -f "$PROGRAM_NAME" > /dev/null; then
    echo "进程仍在运行,正在强制结束..."
    pkill -9 -f "$PROGRAM_NAME"
    sleep 1
fi
if pgrep -f "$PROGRAM_NAME" > /dev/null; then
    send_notification "启动失败" "无法结束现有的 $PROGRAM_NAME 进程。" "error"
    exit 1
fi
echo "旧进程已清理完毕。"
# --- 原有进程管理逻辑 (结束) ---

# 启动新实例
cd /opt/RPiPlay/build
echo "正在启动 $PROGRAM_NAME..."
nohup ./rpiplay -n "matebook14s" -r opengl > /tmp/rpiplay.log 2>&1 &
NEW_PID=$!

# 等待并检测启动是否成功
echo "等待程序启动..."
sleep 5 # 等待5秒让程序充分初始化

if ps -p $NEW_PID > /dev/null; then
    echo "启动成功!进程PID: $NEW_PID"
    send_notification "启动成功" "AirPlay 接收器已在后台运行。\n进程PID: $NEW_PID" "success"
    # 可选:将PID写入文件,方便其他脚本管理
    echo $NEW_PID > /tmp/rpiplay.pid
else
    echo "启动失败。请检查日志: /tmp/rpiplay.log"
    send_notification "启动失败" "AirPlay 未能成功启动。\n请查看日志文件: /tmp/rpiplay.log" "error"
    exit 1
fi

8.创建应用快捷方式

~/.local/share/applications目录下创建快捷方式airplay.desktop

cd ~/.local/share/applications
touch airplay.desktop
chmod +x airplay.desktop

快捷方式文件内容如下:

[Desktop Entry]
Type=Application
Name=AirPlay
Comment=AirPlay Receiver for iPhone to Matebook14s
Exec=/opt/RPiPlay/airplay.sh
Icon=/opt/RPiPlay/airplay.png
Categories=AudioVideo;Player;
Terminal=false
StartupNotify=false

更新应用快捷方式

update-desktop-database ~/.local/share/applications

此时应用菜单中出现对应logo图标的快捷方式,点击即可启动,启动成功/失败会在系统通知栏进行通知

评论