再生キャプチャ

Android Q には新しい AudioPlaybackCapture API が含まれています。この API は、他のアプリで再生されている音声をコピーする機能をアプリに提供します。この機能はアナログの画面キャプチャですが、音声用です。主に、ゲームで再生されている音声をキャプチャするストリーミング アプリで使用されます。

キャプチャ API は、音声をキャプチャされるアプリの遅延の原因にはなりません。

キャプチャ アプリのビルド

前提条件

セキュリティ確保とプライバシー保護のため、再生キャプチャにはいくつかの制限があります。音声のキャプチャを可能にするには、アプリが次の要件を満たしている必要があります。

  • アプリに RECORD_AUDIO 権限が付与されている必要があります。
  • アプリが MediaProjectionManager.createScreenCaptureIntent() によるプロンプトを表示し、ユーザーがそれを承認する必要があります。
  • キャプチャ アプリと再生アプリが同じユーザー プロファイルに含まれている必要があります。

音声のキャプチャ

別のアプリの音声をキャプチャするには、アプリで AudioRecord オブジェクトをビルドし、AudioPlaybackCaptureConfiguration を追加する必要があります。手順は次のとおりです。

  1. AudioPlaybackCaptureConfiguration.Builder.build() を呼び出して、AudioPlaybackCaptureConfiguration をビルドします。
  2. setAudioPlaybackCaptureConfig を呼び出して、設定を AudioRecord に渡します。

音声コンテンツによるキャプチャの制限

アプリは次のメソッドを使用して、キャプチャできる音声を制限できます。

addMatchingUsage() メソッドと excludeUsage() メソッドは一緒に使用できないため、どちらか一方のみを選択する必要があります。同様に、addMatchingUid()excludeUid() も同時に使用することはできません。

再生キャプチャの許可

他のアプリによって音声がキャプチャされないようにアプリを設定できます。アプリの音声は、アプリが次の要件を満たしている場合にのみキャプチャできます。

用途

音声を再生するプレーヤーの usage の設定が、USAGE_MEDIAUSAGE_GAME、または USAGE_UNKNOWN である必要があります。

キャプチャ ポリシー

プレーヤーのキャプチャ ポリシーが、AudioAttributes.ALLOW_CAPTURE_BY_ALL(他のアプリに再生のキャプチャを許可する)である必要があります。これはさまざまな方法で設定できます。

これらの前提条件が満たされている場合は、プレーヤーで生成された音声をキャプチャできます。

システム キャプチャの無効化

前述したキャプチャの許可に関する保護が適用されるのはアプリのみです。Android システム コンポーネントはこれらの制約を無視して、デフォルトで再生をキャプチャできます。これらのコンポーネントの多くは Android ベンダーによってカスタマイズされており、ユーザー補助やキャプションなどの機能に対応しています。したがって、システムがアプリの再生をキャプチャできるようにすることをおすすめします。システムにアプリの再生をキャプチャされないようにする場合は、キャプチャ ポリシーを ALLOW_CAPTURE_BY_NONE に設定してください。

実行時におけるポリシーの設定

アプリの実行中に AudioManager.setAllowedCapturePolicy() を呼び出してキャプチャ ポリシーを変更できます。メソッドを呼び出したときに MediaPlayer や AudioTrack が再生中でも、音声に影響が及ぶことはありません。ポリシーの変更を有効にするには、プレーヤーまたはトラックを閉じて再度開く必要があります。

ポリシー = マニフェスト + AudioManager + AudioAttributes

キャプチャ ポリシーは複数の場所で指定できるため、有効なポリシーがどのように決定されるかを理解することが重要です。最も制限の厳しいキャプチャ ポリシーが常に適用されます。たとえば、マニフェストに setAllowedCapturePolicy="false" が含まれるアプリは、AudioManager#setAllowedCapturePolicyALLOW_CAPTURE_BY_ALL に設定されていても、システム以外のアプリに音声のキャプチャを許可しません。同様に、AudioManager#setAllowedCapturePolicyALLOW_CAPTURE_BY_ALL に設定され、マニフェストで setAllowedCapturePolicy="true" が設定されていても、メディア プレーヤーの AudioAttributesAudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM) を使用してビルドする場合、このメディア プレーヤーをシステム以外のアプリでキャプチャすることはできません。

次の表は、マニフェスト属性と有効なポリシーによる影響をまとめたものです。

allowAudioPlaybackCapture ALLOW_CAPTURE_BY_ALL ALLOW_CAPTURE_BY_SYSTEM ALLOW_CAPTURE_BY_NONE
true すべてのアプリ システムのみ キャプチャなし
false システムのみ システムのみ キャプチャなし