IVS Broadcast SDK: カスタム画像ソース | Low-Latency Streaming
このガイドは、ブロードキャストセッション (Android、iOS) のセットアップ方法とミキサー API の使用方法に既に精通していることを前提としています。
カスタム画像入力ソースを使用することで、プリセットカメラやスクリーン共有に限定されるのではなく、アプリケーションが独自の画像入力を Broadcast SDK に提供できます。カスタム画像ソースは、半透明の透かしや静的な「be right back」(すぐに戻ります) シーンと同じくらいシンプルにすることも、アプリケーションがカメラにビューティーフィルターを追加するなど、追加のカスタム処理を実行できるようにすることもできます。
透かしやビューティーフィルターを備えたカメラなど、複数のカスタム画像ソースを使用できます。カメラのカスタムコントロールにカスタム画像入力ソースを使用する場合 (カメラアクセスを必要とするビューティーフィルターライブラリを使用するなど) 、Broadcast SDK はカメラの管理をしなくなります。代わりに、アプリケーションはカメラのライフサイクルを正しく処理する責任があります。アプリケーションがカメラをどのように管理すべきかについては、プラットフォームの公式ドキュメントを参照してください。
Android
ブロードキャストセッションを作成したら、画像入力ソースを作成します。
SurfaceSource surfaceSource = broadcastSession.createImageInputSource();
このメソッドは、標準の Android SurfaceSurfaceSource
を返します。ブロードキャストセッションに自動的にアタッチされるため、後で attachDevice(...)
メソッドを使用する必要はありません。ただし、SurfaceSource
はスロットにバインドする必要があります。これについては、後で説明します。SurfaceSource
のサイズを変更したり、回転したりできます。ImagePreviewView
を作成して、その内容のプレビューを表示することもできます。
基盤の Surface
を取得します。
Surface surface = surfaceSource.getInputSurface();
この Surface
は、Camera2、OpenGL ES、その他のライブラリなどの画像プロデューサーの出力バッファとして使用できます。最も簡単なユースケースは、静的なビットマップまたは色を Surface のキャンバスに直接描画することです。ただし、多くのライブラリ (加工フィルターライブラリなど) には、レンダリングする外部 Surface
をアプリケーションで指定できるメソッドが用意されています。このようなメソッドを使用して、この Surface
をフィルターライブラリに渡すことができます。これによりライブラリは、ストリーミングするブロードキャストセッションに、処理されたフレームを出力できます。
最後に、SurfaceSource
は、ブロードキャストセッションによってストリーミングされるためには、Mixer.Slot
にバインドされる必要があります。
broadcastSession.getMixer().bind(surfaceSource, "customSlot");
Android サンプルコード
-
半透明の透かしが
MixerActivity
に追加されます。 -
MP4 ファイルは
MixerActivity
でループされます。 -
CameraManager
ユーティリティクラスは、 CustomActivity
の Camera2 メソッドを使用してデバイスのカメラのカスタム管理を行います。これは、単純なセピアフィルターを適用します。この例は、カメラを管理し、ブロードキャストセッションのカスタムSurfaceSource
をカメラキャプチャリクエストに渡す方法を示しているため、特に役立ちます。他の外部ライブラリを使用する場合は、ブロードキャストセッションによって提供される AndroidSurface
に出力するようにライブラリを設定する方法に関するドキュメントに従ってください。
iOS
ブロードキャストセッションを作成したら、画像入力ソースを作成します。
let customSource = broadcastSession.createImageSource(withName: "customSourceName")
このメソッドは、アプリケーションが手動で CMSampleBuffers
を送信できるようにする画像ソースである IVSCustomImageSource
を返します。サポートされているピクセル形式については、「iOS ブロードキャスト SDK リファレンス」を参照してください。最新バージョンへのリンクは、最新のブロードキャスト SDK リリースの「Amazon IVS リリースノート」にあります。ソースはブロードキャストセッションに自動的にアタッチされないため、ソースがストリーミングされる前に、画像ソースをセッションにアタッチし、スロットにバインドする必要があります。
broadcastSession.attach(customSource, toSlotWithName: "customSourceSlot", onComplete: nil)
カスタムソースがアタッチされてバインドされた後、アプリケーションはカスタムソースに直接 CMSampleBuffers
を送信できます。onComplete
コールバックを使用して開始することもできます。
カスタムソースに送信されたサンプルは、ブロードキャストセッションでストリーミングされます。
customSource.onSampleBuffer(sampleBuffer)
動画のストリーミングには、このメソッドをコールバックで使用します。例えば、カメラを使用している場合、AVCaptureSession
から新しいサンプルバッファを受信するたびに、アプリケーションはサンプルバッファをカスタム画像ソースに転送できます。必要に応じて、カスタム画像ソースにサンプルを送信する前に、アプリケーションでさらなる処理 (加工フィルターなど) を適用できます。
静的画像については、カスタム画像ソースのスロットバインディングが変更された場合、またはソースがデタッチされてブロードキャストセッションに再アタッチされた場合、最初のサンプルの後、アプリケーションはサンプルを再送信する必要があります。例えば、スロットをミキサーから削除してから、そのミキサーにスロットを追加する場合は、サンプルを再送信する必要があります。
iOS サンプルアプリケーション
-
半透明の透かしが
MixerViewController
に追加されます。 -
MP4 ファイルは
MixerViewController
でループされます。 -
デバイスのカメラによる CIFilter 実装は、
CustomSourcesViewController
に追加されました。これにより、アプリケーションは Amazon IVS Broadcast SDK とは独立してデバイスのカメラを管理できます。AVCaptureSession
を使用してデバイスのカメラから画像をキャプチャし、CIFilter 実装を使用して画像を処理し、ライブストリーミング用にCMSampleBuffers
をcustomSource
に送信します。