VideoEncoderFactory

VideoEncoderFactory は、 SoraMediaOption.videoEncoderFactory で指定することができます。

注釈

VideoEncoderFactory は libwebrtc に定義された interface です。

参考リンク: https://chromium.googlesource.com/external/webrtc/+/HEAD/sdk/android/api/org/webrtc/VideoEncoderFactory.java

VideoEncoderFactory を設定しない場合の挙動

VideoEncoderFactory を設定しない場合は、以下のように VideoEncoderFactory が決定されます (Sora Android SDK の持つ VideoEncoderFactory は internal なので SDK ユーザーが直接利用することはできません)。

  • サイマルキャストが有効な場合

    • SimulcastVideoEncoderFactoryWrapper

  • それ以外

    • SoraDefaultVideoEncoderFactory

ソフトウェアエンコーダーの使用を強制する

Sora Android SDK ではデフォルトでハードウェアエンコーダーをメインに設定し、ソフトウェアエンコーダーをフォールバック先に指定します。

この挙動を変更してソフトウェアエンコーダーのみを利用するには SoraMediaOptionsoftwareVideoEncoderOnly: Booleantrue を設定してください。デフォルト値は false です。

これにより、ハードウェアエンコーダーではなくソフトウェアエンコーダーを利用することができます。

注釈

videoEncoderFactory を設定している場合、softwareVideoEncoderOnly は無視されます。

val capturer = CameraCapturerFactory.create(this)

val option = SoraMediaOption().apply {

    // ソフトウェアエンコーダーのみを利用するように設定
    softwareVideoEncoderOnly = true

    // 映像、音声の送受信の設定
    enableVideoUpstream(capturer!!, egl.eglBaseContext)
    enableAudioUpstream()
    enableVideoDownstream()
    enableAudioDownstream()

    // 映像コーデックを指定
    videoCodec = SoraVideoOption.Codec.VP9
}

VideoEncoderFactory の設定方法

Sora Android SDK は利用したい VideoEncoderFactory を指定できます。

実装例

val capturer = CameraCapturerFactory.create(this)

val option = SoraMediaOption().apply {

    // 独自のエンコーダー実装を利用するように設定する
    videoEncoderFactory = MyVideoEncoderFactory()

    // 映像、音声の送受信の設定
    enableVideoUpstream(capturer!!, egl.eglBaseContext)
    enableAudioUpstream()
    enableVideoDownstream()
    enableAudioDownstream()

    // 映像コーデックを指定
    videoCodec = SoraVideoOption.Codec.VP9
}

org.webrtc.SoftwareVideoEncoderFactory を videoEncoderFactory に設定する際の注意

重要

ソフトウェアエンコーダーを利用したい場合は、まず ソフトウェアエンコーダーの使用を強制する を試してみることをおすすめします。

以下の実装例のように libwebrtc で提供されている、 org.webrtc.SoftwareVideoEncoderFactory を videoEncoderFactory に設定する場合は、 SoftwareVideoEncoderFactory をインスタンス化する前に jingle_peerconnection_so をロードしてください。

注釈

なぜ jingle_peerconnection_so をロードする必要があるのか

SoftwareVideoEncoderFactory 生成時に JNI の nativeCreateFactory() を即時に呼び出すようになりました。 そのため PeerConnectionFactory.initialize(...) より前に本クラスを生成すると、 まだ jingle_peerconnection_so がロードされておらず JNI 解決に失敗し、 次の UnsatisfiedLinkError が発生します。

java.lang.UnsatisfiedLinkError: No implementation found for long org.webrtc.SoftwareVideoEncoderFactory.nativeCreateFactory()

そのため、System.loadLibrary("jingle_peerconnection_so") を先に呼んで明示的にロード しておく必要があります。

この対応が必要になったのはこの commit 以降です。 https://source.chromium.org/chromium/_/webrtc/src.git/+/c97651cbb4e94ef3f9768015c2bb3b93c953ebe9

実装例

val capturer = CameraCapturerFactory.create(this)

// jingle_peerconnection_so をロードしてから
// SoftwareVideoEncoderFactory を初期化しないと実行時に例外が起こります
try {
   System.loadLibrary("jingle_peerconnection_so")
} catch (e: UnsatisfiedLinkError) {
}

val option = SoraMediaOption().apply {

    // ソフトウェアエンコーダーを利用するように設定する
    videoEncoderFactory = SoftwareVideoEncoderFactory()

    // 映像、音声の送受信の設定
    enableVideoUpstream(capturer!!, egl.eglBaseContext)
    enableAudioUpstream()
    enableVideoDownstream()
    enableAudioDownstream()

    // 映像コーデックを指定
    videoCodec = SoraVideoOption.Codec.VP9
}
© Copyright 2018-2025, Shiguredo Inc. Created using Sphinx 8.2.3