web-dev-qa-db-ja.com

Android> 4.0:内部オーディオを記録/キャプチャする方法のアイデア(例:STREAM_MUSIC)?

数ヶ月前、Android ICS(4.0)で、私は「pcmC0D0p」をインターセプトしたAndroidカーネルモジュールを開発しました-すべてのシステムオーディオを取得するモジュール。

私の目標は、AirPlay経由ですべてのオーディオ(または少なくとも再生された音楽)をリモートスピーカーにストリーミングすることです。

カーネルモジュールは動作しましたが、いくつかの問題(カーネルバージョン、ルート特権など)があったため、この作業を停止しました。

現在、Android 4.1および4.2があり、新しい希望があります!

Androidでオーディオをキャプチャする方法を知っているのは誰ですか?

次のアイデアがありました:

  1. bluetooth経由で接続 同じ電話に、ルーティングをBTに設定し、「相手側」のオーディオを取得します。これは機能しません。

  2. 以前のようにカーネルモジュールでオーディオをインターセプトします。ハードコア、動作させますが、適用できません。

  3. JACKオーディオ接続キット :悲しいことにAndroidは "ALSA"ではなく "tinyALSA"を使用します。TinyALSAはJACKのようなフィルターをサポートしていません(しかし、これはカーネルにアイデアをもたらしましたモジュール)

  4. AudioFlingerの代わりにPulseAudioを使用しますが、これも適用されません


編集(忘れた):

  1. tinyALSA (Android上のALSA)から「tinymix」(ALSAミキサーのベビー版)をコンパイルし、オーディオ出力をマイク入力にルーティングしようとしましたが、成功しませんでした( 私には理解できない )。また、これにはルート化も必要です:適用されません

  2. 私は OpenSL ES をテストしましたが、私はCクラックではなく、「マイクを録音できますが、これ以上はありません」で終わりました(おそらく間違っていたのですか?)


ちょうど見つけました ROUTE_TYPE_LIVE_AUDIO

ライブオーディオルーティングをサポートするデバイスでは、メディアオーディオストリームをサポートされている宛先にルーティングできます。これには、デバイス自体の内蔵スピーカーまたはオーディオジャック、A2DPデバイスなどが含まれます。

開始されると、このルーティングはアプリケーションに対して透過的です。メディアストリームで再生されるすべてのオーディオは、選択した宛先にルーティングされます。

たぶんこれは何らかの形で役立ちますか?

私はアイデアを使い果たしていますが、「このナットをクラック」したい、多分誰かが私を助けることができますか?

編集:

私は本当にCとカーネルコーディングが初めてです(ただし、クロスコンパイルされたオーディオインターセプションモジュールを正常に作成しました)-しかし、PCMデータがユーザースペースから来る時点でリッスンすることは決して可能ではありません(Java 、Cレイヤー?)、ハッキングとルート化なしで、カーネル空間(tinyALSA、カーネルモジュール)に?

39
Martin L.

ローカルソケットサーバーを介してオーディオトラフィックを渡す必要があります。

  1. ローカルソケットサーバーを作成する

  2. オーディオHTTPストリームアドレスを、アドレスなどのローカルソケットサーバーを介したパスに変更します

    http://example.com/stream.mp3  ->
    
    http://127.0.0.1:8888/http://example.com/stream.mp3
    

    8888はソケットポートです。

  3. 演奏する

    http://127.0.0.1:8888/http://example.com/stream.mp3 
    

    デフォルトのメディアプレーヤーで

  4. ローカルソケットサーバーのポート8888へのすべての着信要求を読み取り、分析して、example.comサーバーに渡します。

  5. Example.comからの応答を読み取り、ローカルクライアント(メディアプレーヤー)に渡します。ここでオーディオストリームをキャプチャできます!

2
Nik