核心思路
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-ugly2. 克隆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
fi8.创建应用快捷方式
在~/.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图标的快捷方式,点击即可启动,启动成功/失败会在系统通知栏进行通知