Introduction

Android Studio Flamingo (2022.2.1) で正式に導入された、開発マシンに接続した Android 端末のスクリーン映像を開発マシンに表示する機能である Device Mirroring
この機能を使うと、端末画面の録画が開発マシンから実施できて非常に便利なのだが…ワクワクしながら使ったすぐにエラーが発生したがっかり。

それがこのエラー。

repeated_video_encoder_errors

上記のエラーの文字に従ってログを確認すると

codec_component_died

Codec2 component “c2.android.vp8.encoder” died. が出力されている。

日本語の情報は全くなく、英語でも断片的な情報がわずかにあるのみ。

How to resolve?

結論から言えば、端末のビデオエンコーダの性能問題の可能性が高いため、ミラーリングの際の負荷を抑えることが解決策である。

この件に関して、重要な情報が Device mirroring error というタイトルで Android Studio の Issue Tracker で報告されていた。
studioFlags.xml というファイルを開発マシンに用意することで、上記のミラーリングの負荷を抑制できる。
studioFlags.xml の中身は下記。

1
2
3
4
5
6
7
8
9
10
<application>
<component name="StudioFlags">
<option name="data">
<map>
<entry key="device.mirroring.agent.log.level" value="debug" />
<entry key="device.mirroring.max.bit.rate" value="1000000" />
</map>
</option>
</component>
</application>

このファイルを ~/Library/Application Support/Google/AndroidStudio<Android Studio のバージョン>/option にコピーする。
studioFlags.xml を追加または編集した際には、Android Studio を再起動すること。

重要なのは device.mirroring.max.bit.ratevalue である。
この値が、ミラーリングの際、開発マシンに映像データを送信する際のビットレートで、初期値は 8000000
これはエラーが発生時、Logcat に下記のようなログが表示されることからわかる。

1
2
2024-02-18 00:15:10.628 22546-22570 CCodecBuffers   app_process D  [c2.android.vp8.encoder#721:Output[N]] popFromStashAndRegister: at 10189435427us, output format changed to AMessage(what = 0x00000000) = {
int32_t bitrate = 8000000

初期値の 8000000 より小さな値を指定することで、エンコードのビットレートを変化させ、安定したミラーリングが可能になると推測できる。

私の環境では SONY SO-41B (2021年発売) とそこそこ新しい端末であったが、とりあえず、先述の Issue で提案されていた 1000000 に変更することで問題を回避することができた。

だが、Issue では、500000200000100000 と値を下げたにもかかわらず現象が回避できなかったと報告されている。
報告者の端末は Samsung SM-T220 (2021年発売) であり、開発側は Mediatek のようなローエンドの CPU の使用を避けるように提言していた。