この記事では、AirPlay非対応のMacを受信機にするために、UxPlayをGitHubから取得し、ビルドして手動起動するところまで進めます。
前回の記事では、Homebrew、Command Line Tools、GStreamer公式pkgの導入までを行いました。
未実施の場合は、過去記事を確認してください。
本記事に記載されたコードや手順を実行したことによって生じたいかなる損害・トラブルについても、筆者および所属組織は一切の責任を負いかねます。
システムの変更やコマンドの実行は、必ずご自身の責任と判断のもとで行ってください。
また、本記事の内容は筆者個人の見解であり、所属する企業や団体を代表するものではありません。
今回やること
この記事では、以下を行います。
- UxPlayをGitHubから取得する
- GStreamerのパスを通す
- UxPlayをビルドする
- 手動でAirPlay受信をテストする
- 起動用スクリプトを作成する
- LaunchAgentを作成する
UxPlayを取得する
UxPlayはGitHubで公開されています。
今回は、~/Downloads配下に取得します。
cd ~/Downloads
git clone https://github.com/FDH2/UxPlay.git
cd UxPlay
これで、以下の場所にUxPlayのソースコードが入ります。
~/Downloads/UxPlay
GStreamerのパスを通す
GStreamerを公式pkgで入れた場合、以下の場所にインストールされます。
/Library/Frameworks/GStreamer.framework
ビルド時に見つけられるように、ターミナルで以下を実行します。
export PATH="/Library/Frameworks/GStreamer.framework/Versions/Current/bin:$PATH"
export PKG_CONFIG_PATH="/Library/Frameworks/GStreamer.framework/Versions/Current/lib/pkgconfig:$PKG_CONFIG_PATH"
念のため、確認します。
gst-launch-1.0 --version
pkg-config --modversion gstreamer-1.0
それぞれバージョンが表示されればOKです。
UxPlayをビルドする
~/Downloads/UxPlayにいる状態で、以下を実行します。
cmake .
make
エラーなく完了すれば、以下のUxPlay本体が作成されます。
~/Downloads/UxPlay/uxplay
以下で確認できます。
ls -l ~/Downloads/UxPlay/uxplay
手動で起動テストする
まずは、手動でUxPlayを起動してAirPlay受信できるか確認します。
cd ~/Downloads/UxPlay
./uxplay -n "iMac-AirPlay" -pin 1234 -vsync no -vs "osxvideosink force-aspect-ratio=true"
iPhoneやiPadのコントロールセンターから「画面ミラーリング」を開き、iMac-AirPlayが表示されれば成功です。
接続時にPINを求められた場合は、ここでは1234を入力します。
GStreamerの映像出力ウィンドウとして、緑色の画面が表示される場合があります。AirPlay接続前の待受ウィンドウなので、異常ではありません。
テストを終了する場合は、ターミナルでcontrol + Cを押します。
UxPlay起動用スクリプトを作る
毎回長いコマンドを入力するのは面倒なので、起動用スクリプトを作ります。
mkdir -p ~/bin
mkdir -p ~/Library/Logs/UxPlay
以下を実行します。
cat > ~/bin/start-uxplay.sh <<'EOF'
#!/bin/zsh
LOG_DIR="$HOME/Library/Logs/UxPlay"
PIN_FILE="$LOG_DIR/uxplay.pin"
mkdir -p "$LOG_DIR"
export PATH="/usr/local/bin:/opt/homebrew/bin:/Library/Frameworks/GStreamer.framework/Versions/Current/bin:/usr/bin:/bin:/usr/sbin:/sbin"
export PKG_CONFIG_PATH="/Library/Frameworks/GStreamer.framework/Versions/Current/lib/pkgconfig"
UXPLAY_BIN="$HOME/Downloads/UxPlay/uxplay"
if [ ! -x "$UXPLAY_BIN" ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: uxplay not found or not executable: $UXPLAY_BIN" >> "$LOG_DIR/uxplay-launch.log"
exit 1
fi
if [ -f "$PIN_FILE" ]; then
UXPLAY_PIN="$(cat "$PIN_FILE" | tr -dc '0-9' | head -c 4)"
else
UXPLAY_PIN="$(jot -r 1 1000 9999)"
echo "$UXPLAY_PIN" > "$PIN_FILE"
fi
if [ -z "$UXPLAY_PIN" ]; then
UXPLAY_PIN="$(jot -r 1 1000 9999)"
echo "$UXPLAY_PIN" > "$PIN_FILE"
fi
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Starting UxPlay..." >> "$LOG_DIR/uxplay-launch.log"
echo "UXPLAY_BIN=$UXPLAY_BIN" >> "$LOG_DIR/uxplay-launch.log"
echo "UXPLAY_PIN=$UXPLAY_PIN" >> "$LOG_DIR/uxplay-launch.log"
exec "$UXPLAY_BIN" -n "iMac-AirPlay" -pin "$UXPLAY_PIN" -vsync no -vs "osxvideosink force-aspect-ratio=true"
EOF
実行権限を付けます。
chmod +x ~/bin/start-uxplay.sh
手動でテストします。
~/bin/start-uxplay.sh
AirPlay待受ウィンドウが表示されればOKです。止める場合は、ターミナルでcontrol + Cを押します。
LaunchAgentを作る
次回の記事でGUIからSTART/STOPできるようにするため、macOSのLaunchAgentを作成します。
今回は、UxPlayを勝手に常時復活させたくないため、RunAtLoadとKeepAliveはfalseにします。つまり、Mac起動時に勝手にUxPlay本体を起動するのではなく、GUIコントローラーから起動する構成です。
mkdir -p ~/Library/LaunchAgents
cat > ~/Library/LaunchAgents/com.local.uxplay.plist <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"https://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.local.uxplay</string>
<key>ProgramArguments</key>
<array>
<string>$HOME/bin/start-uxplay.sh</string>
</array>
<key>RunAtLoad</key>
<false/>
<key>KeepAlive</key>
<false/>
<key>StandardOutPath</key>
<string>$HOME/Library/Logs/UxPlay/uxplay.out.log</string>
<key>StandardErrorPath</key>
<string>$HOME/Library/Logs/UxPlay/uxplay.err.log</string>
</dict>
</plist>
EOF
plistの文法を確認します。
plutil -lint ~/Library/LaunchAgents/com.local.uxplay.plist
OKと表示されれば問題ありません。
LaunchAgentを読み込みます。
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.local.uxplay.plist 2>/dev/null || true
この時点では、RunAtLoad=falseなのでUxPlayは起動しません。
ここまででUxPlay本体の準備は完了
ここまでで、UxPlay本体のビルド、起動スクリプト、LaunchAgentの準備が完了しました。
次の記事では、START/STOPボタン付きの簡易GUIコントローラーを作成し、接続用の4桁PINもGUI上に表示できるようにします。

