Android には、あるアプリの再生音を別アプリのマイクへ回す(VoiceMeeter や仮想オーディオケーブル的な)ユーザー向けの手段が無い。配線自体は AUDIO_DEVICE_IN/OUT_REMOTE_SUBMIX として存在するが、REMOTE_SUBMIX を録音で開くには CAPTURE_AUDIO_OUTPUT(特権)が要る。
aroute は APK をインストールせず、root/shell で app_process 経由に叩く(scrcpy / sndcpy と同じ方式)。REMOTE_SUBMIX を開くとポリシーがメディア再生をそこへミラーするので、それを録音・再出力できる。
flowchart LR
A[アプリの再生音] -->|AudioFlinger| S[(REMOTE_SUBMIX)]
S -->|AudioRecord| R[aroute]
R -->|AudioTrack / socket / file| O[別アプリ・録音・配信]
REMOTE_SUBMIX は /dev/snd に出ない RAM 上のパイプで、AudioFlinger 越しにしか触れない(tinyalsa では届かないことを実測で確認済み)。
| モード | 内容 |
|---|---|
tone <freq> <secs> |
フレームワーク再生(AudioTrack)でサイン波を鳴らす。動作確認用 |
capture <secs> <outfile> |
REMOTE_SUBMIX を録音し、raw PCM(s16le / mono / 48k)に保存 |
route <secs> |
REMOTE_SUBMIX → AudioTrack。横取り→再出力するライブケーブル |
- root 必須(
REMOTE_SUBMIX録音の特権を uid=0 で越える) - 検証済み: Android 14 / android-34 / x86_64 エミュレータ(440Hz を横取り録音できることを確認)
- 実機・OS バージョンによっては MediaProjection の同意が要る場合がある
要 JDK + Android SDK build-tools(d8)。
bash build.sh # out/classes.dex を生成adb push out/classes.dex /data/local/tmp/aroute.dex
# 再生音を 5 秒横取りして PCM 保存
adb shell "CLASSPATH=/data/local/tmp/aroute.dex \
app_process /system/bin com.agapkit.aroute.AudioRouter capture 5 /data/local/tmp/out.pcm"
# 横取り→再出力(ライブケーブル)
adb shell "CLASSPATH=/data/local/tmp/aroute.dex \
app_process /system/bin com.agapkit.aroute.AudioRouter route 10"app_process 経由で REMOTE_SUBMIX を叩く手法は scrcpy / sndcpy が確立したアプローチを参考にしている。
MIT License — 詳細は LICENSE を参照。