はじめに
Android で、Video のデコードは、MediaCodec
で、簡単に実装できる。
が、MediaCodec
ではデコード結果は、Image
かByteBuffer
として取得できる。
これをBitmapに変換する方法に苦労したので知見をここに残す。
開発環境
Android, Kotlin
コード
サンプルコードは https://github.com/kenmasumitsu/VideoToImages 参照
解説
一言で言うと、
Android CameraXのドキュメント で言及されている、YuvToRgbConverter.kt
を使って、 Image
を Bitmap
に変換のがポイント。
ググると、
- https://stackoverflow.com/questions/41775968/how-to-convert-android-media-image-to-bitmap-object
- https://stackoverflow.com/questions/44486188/android-convert-image-object-to-bitmap-does-not-work
など見つかるが、うまく動かない。
は、正しく動くが、処理時間が長い。YuvToRgbConverter.kt
の 約6倍。 (Pixel 3)
補足
https://bigflake.com/mediacodec/ で紹介されている、https://bigflake.com/mediacodec/ExtractMpegFramesTest_egl14.java.txt でも、同程度高速に正しく動作する。