AirPlay非対応のMacを受信機にする。UxPlayをビルドして手動起動する

この記事では、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を勝手に常時復活させたくないため、RunAtLoadKeepAlivefalseにします。つまり、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上に表示できるようにします。

よかったらシェアしてね!
  • URLをコピーしました!
目次