Windows / macOS / Raspberry Pi で動く、iPhone AirPlay + Android キャスト レシーバー。 iPhone の音声/画面 と Android の画面 を PC のスピーカー・ディスプレイで受けます。
iPhone ──(Wi-Fi)──▶ Itodenwa ──▶ スピーカー / ディスプレイ
Android ──(Wi-Fi)──▶ Itodenwa ──▶ ディスプレイ
| タブ式 GUI | iPhone 音声 / iPhone ミラー / Android の3タブ。独立に開始/停止でき、Android + iPhoneミラー の並行動作もOK |
| iPhone 音声 | AirPlay 1 (RAOP) を自作エンジンで実装。iPhone 音量連動 + ソフトリミッター付きブースト |
| iPhone ミラー | UxPlay を内部利用(要別途インストール、docs/SETUP_MIRRORING.md) |
| Android キャスト | scrcpy を内部利用(要別途インストール、docs/SETUP_ANDROID_CAST.md)。Wi-Fi ペアリング / USB→無線化 を GUI から操作可能 |
| 設定の自動保存 | タブごとの設定・アクティブタブ・Android 接続先を記憶 |
| GUI / CLI | どちらもフル機能。CLI はラズパイの SSH 運用に最適 |
python -m venv .venv .\.venv\Scripts\Activate.ps1 pip install -r requirements.txt python run.py # またはエクスプローラで Itodenwa.bat をダブルクリック
画面ミラーリング / Androidキャストを使うには、それぞれ UxPlay と
winget install Genymobile.scrcpy を先に済ませてください。
brew install python python-tk@3.13 # tkinter は別 formula python3 -m venv .venv && source .venv/bin/activate pip install -r requirements.txt python run.py # または Itodenwa.command をダブルクリック
ミラーリング用の uxplay、Android用の scrcpy はどちらも brew で入ります。詳細は
docs/SETUP_MIRRORING.md /
docs/SETUP_ANDROID_CAST.md を参照。
sudo apt install python3-venv python3-tk libportaudio2 ffmpeg sudo apt install uxplay scrcpy # ミラーリング/Androidキャストを使う場合 python3 -m venv .venv && source .venv/bin/activate pip install -r requirements.txt python run.py # GUI / または python run.py cli でヘッドレス
python run.py selftest
すべて [OK] なら起動可能。初回はここで AirPlay 用の公開 RSA 鍵
(airport.key)が自動ダウンロードされます。UxPlay / scrcpy は使う場合のみ検出されればOK。
Itodenwa は上部に 3つのタブがあり、それぞれ独立して開始/停止できます。
- 使いたいタブ(
iPhone 音声/iPhone ミラー/Android)を選ぶ - タブ内の 「開始」 を押す
- iPhone のコントロールセンター → AirPlay(音符マーク)または 画面ミラーリング から 「Itodenwa」 を選択 (Android は事前に接続セットアップ要 → docs/SETUP_ANDROID_CAST.md)
- 鳴る/映る
並行動作: iPhone ミラー と Android は同時起動可能(両方のウィンドウが並ぶ)。
ただし iPhone 音声 と iPhone ミラー は同じ RTSP ポートを使うため同時起動不可。
初回起動時、Windows ファイアウォールが Python の通信を確認したら 「プライベートネットワーク」を許可 してください。
Tkinter を読み込まないので python3-tk 無しでも動きます。SSH 越しで OK。
python run.py cli --list-devices # 出力デバイス一覧 python run.py cli --device USB --boost 2.0 # 名前部分一致+ブースト python run.py cli --mode mirror --resolution 540x1170 python run.py cli --mode androidcast # Android画面キャスト(scrcpy必要) python run.py cli --help # 全オプション # Android のワイヤレス adb セットアップ(ワンショット) python run.py wireless pair <pair_ip:port> <code> <connect_ip:port> python run.py wireless usb2tcpip # USB接続中を無線化 python run.py wireless status python run.py wireless disconnect
ラズパイ起動時に常駐させたい場合は systemd --user ユニット化が便利です
(具体例はリクエストくれれば手順を案内します)。
| OS | 起動ファイル | アイコン化 |
|---|---|---|
| Windows | Itodenwa.bat |
tools\create-shortcut.ps1 でショートカット作成 → 右クリック→タスクバーにピン留め |
| macOS | Itodenwa.command |
Finder からドラッグで Dock へ |
| Linux | Itodenwa.sh |
tools/itodenwa.desktop を ~/.local/share/applications/ にコピー |
| OS | パス |
|---|---|
| Windows | %APPDATA%\Itodenwa\settings.json |
| macOS | ~/Library/Application Support/Itodenwa/settings.json |
| Linux | ~/.config/Itodenwa/settings.json |
出力先は デバイス名で保存されるので、USB の抜き挿し等で番号が変わっても 同じ機器を自動で選び直します。Android の接続先 IP:PORT も同じファイルに保存されます。
主なもの(詳細は各セットアップ docs 参照):
| 症状 | 対処 |
|---|---|
| iPhone の一覧に出ない | 同じ Wi-Fi か / ファイアウォールで Python を許可 / Apple Bonjour が動作中か |
| 音が出ない・小さい | 「音の出力先」を実機スピーカーへ / 「音量ブースト」を上げる |
| ミラーリング関連 | → docs/SETUP_MIRRORING.md#うまくいかないときは |
| Androidキャスト関連 | → docs/SETUP_ANDROID_CAST.md#トラブルシューティング |
pip install av で失敗 |
Python 3.10 以上の 64bit 版を使う |
macOS でファイアウォール許可が要る場合:
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add $(realpath .venv/bin/python)音声(iPhone): iPhone ─▶ mDNS発見 ─▶ RTSP鍵交換 ─▶ AES復号 ─▶ ALACデコード ─▶ 再生
映像(iPhone): iPhone ─▶ mDNS発見 ─▶ (以降は UxPlay が担当) ─▶ ディスプレイ
映像+音声(Android): Android ─▶ Wi-Fi(adb) ─▶ (以降は scrcpy が担当) ─▶ ディスプレイ
| モジュール | 役割 |
|---|---|
itodenwa/mdns.py |
iPhone への機器広告(Bonjour) |
itodenwa/rtsp.py |
接続交渉・本人確認・鍵交換 |
itodenwa/keys.py |
RSA 鍵管理 |
itodenwa/crypto.py |
音声 AES 復号 |
itodenwa/alac.py |
ALAC → PCM デコード |
itodenwa/rtp.py |
音声/同期/時刻 の UDP 受信 |
itodenwa/audio.py |
スピーカー再生・音量・ブースト |
itodenwa/mirror.py |
UxPlay 連携 |
itodenwa/mirror_android.py |
scrcpy 連携(Androidキャスト) |
itodenwa/android_adb.py |
adb ラッパー(Wi-Fiペアリング/USB→無線化) |
itodenwa/gui.py |
Tkinter GUI(タブ式) |
itodenwa/settings.py |
ユーザー設定の永続化 |
itodenwa/platform_paths.py |
OS 抽象化(パス・フォント等) |
- AirPlay 1 のみ対応(AirPlay 2 のマルチルーム同期は未対応)
- タイミング同期は簡易実装(音楽は問題なし、映像の口パク同期はやや甘い)
- RSA 鍵は 2011 年に公開された OSS 共有鍵を使用。リポジトリ非同梱・初回起動時に juhovh/shairplay から自動取得。学習・個人利用前提
- Androidキャストは Android 11+ で「Wi-Fi デバッグ」による最初から無線接続が可能 (Pixel 等推奨)。Android 10 以下は「USB を無線化」方式のみ、音声転送も Android 11+ のみ