数ヶ月前、Android ICS(4.0)で、私は「pcmC0D0p」をインターセプトしたAndroidカーネルモジュールを開発しました-すべてのシステムオーディオを取得するモジュール。
私の目標は、AirPlay経由ですべてのオーディオ(または少なくとも再生された音楽)をリモートスピーカーにストリーミングすることです。
カーネルモジュールは動作しましたが、いくつかの問題(カーネルバージョン、ルート特権など)があったため、この作業を停止しました。
現在、Android 4.1および4.2があり、新しい希望があります!
Androidでオーディオをキャプチャする方法を知っているのは誰ですか?
次のアイデアがありました:
bluetooth経由で接続 同じ電話に、ルーティングをBTに設定し、「相手側」のオーディオを取得します。これは機能しません。
以前のようにカーネルモジュールでオーディオをインターセプトします。ハードコア、動作させますが、適用できません。
JACKオーディオ接続キット :悲しいことにAndroidは "ALSA"ではなく "tinyALSA"を使用します。TinyALSAはJACKのようなフィルターをサポートしていません(しかし、これはカーネルにアイデアをもたらしましたモジュール)
AudioFlingerの代わりにPulseAudioを使用しますが、これも適用されません
編集(忘れた):
tinyALSA (Android上のALSA)から「tinymix」(ALSAミキサーのベビー版)をコンパイルし、オーディオ出力をマイク入力にルーティングしようとしましたが、成功しませんでした( 私には理解できない )。また、これにはルート化も必要です:適用されません
私は OpenSL ES をテストしましたが、私はCクラックではなく、「マイクを録音できますが、これ以上はありません」で終わりました(おそらく間違っていたのですか?)
ちょうど見つけました ROUTE_TYPE_LIVE_AUDIO :
ライブオーディオルーティングをサポートするデバイスでは、メディアオーディオストリームをサポートされている宛先にルーティングできます。これには、デバイス自体の内蔵スピーカーまたはオーディオジャック、A2DPデバイスなどが含まれます。
開始されると、このルーティングはアプリケーションに対して透過的です。メディアストリームで再生されるすべてのオーディオは、選択した宛先にルーティングされます。
たぶんこれは何らかの形で役立ちますか?
私はアイデアを使い果たしていますが、「このナットをクラック」したい、多分誰かが私を助けることができますか?
編集:
私は本当にCとカーネルコーディングが初めてです(ただし、クロスコンパイルされたオーディオインターセプションモジュールを正常に作成しました)-しかし、PCMデータがユーザースペースから来る時点でリッスンすることは決して可能ではありません(Java 、Cレイヤー?)、ハッキングとルート化なしで、カーネル空間(tinyALSA、カーネルモジュール)に?
ローカルソケットサーバーを介してオーディオトラフィックを渡す必要があります。
ローカルソケットサーバーを作成する
オーディオHTTPストリームアドレスを、アドレスなどのローカルソケットサーバーを介したパスに変更します
http://example.com/stream.mp3 ->
http://127.0.0.1:8888/http://example.com/stream.mp3
8888はソケットポートです。
演奏する
http://127.0.0.1:8888/http://example.com/stream.mp3
デフォルトのメディアプレーヤーで
ローカルソケットサーバーのポート8888へのすべての着信要求を読み取り、分析して、example.comサーバーに渡します。
Example.comからの応答を読み取り、ローカルクライアント(メディアプレーヤー)に渡します。ここでオーディオストリームをキャプチャできます!