VideoEncoderFactory¶
VideoEncoderFactory は、 SoraMediaOption.videoEncoderFactory で指定することができます。
注釈
VideoEncoderFactory は libwebrtc に定義された interface です。
VideoEncoderFactory を設定しない場合の挙動¶
VideoEncoderFactory を設定しない場合は、以下のように VideoEncoderFactory が決定されます (Sora Android SDK の持つ VideoEncoderFactory は internal なので SDK ユーザーが直接利用することはできません)。
サイマルキャストが有効な場合
SimulcastVideoEncoderFactoryWrapper
それ以外
SoraDefaultVideoEncoderFactory
ソフトウェアエンコーダーの使用を強制する¶
Sora Android SDK ではデフォルトでハードウェアエンコーダーをメインに設定し、ソフトウェアエンコーダーをフォールバック先に指定します。
この挙動を変更してソフトウェアエンコーダーのみを利用するには SoraMediaOption の softwareVideoEncoderOnly: Boolean
に true
を設定してください。デフォルト値は 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
}