🙆

[Android][kotlin]動画からサムネイル生成のサンプル

に公開

Abstract

  • Androidで動画からサムネイル生成の実装サンプル
  • その説明

概要

mp4動画からサムネイルを生成して、一覧に並べるとか、きっとみんなしたいはず。サンプルコードが欲しいはず。というか僕が欲しかった。
のでソースコードをgithubに公開しました。
https://github.com/aaaa1597/Andkot-GenerateThumbnailSample.git

使い方

上記githubからcloneなりzipダウンロードして、Android Studioで開くだけ。

実装のポイント

PlayerView関連のコードが、ガーっていっぱい並んでいるので見にくくなってるんだけど、サムネイル生成のためのコードは下記3行。

  • MediaMetadataRetrieverを生成
  • setDataSource()でmp4を設定
  • getFrameAtTime()でサムネイル画像生成

まー簡単。まー素晴らしい。

MainActivity.kt
class MainActivity : AppCompatActivity() {
      ・
      ・
      ・
    fun getVideoThumbnail(context: Context, videoUri: Uri): Bitmap? {
        //   ↓↓↓↓★★★ココと
        val retriever = MediaMetadataRetriever()
        try {
            /* assets から一時ファイルにコピー */
            val assetFileName = "Gundam_LaLaport_Fuk.mp4"
            val inputStream = context.assets.open(assetFileName)
            val tempFile = File.createTempFile("temp_video", ".mp4", context.cacheDir)
            tempFile.outputStream().use { output ->
                inputStream.copyTo(output)
            }

            //   ↓↓↓↓★★★ココと
            retriever.setDataSource(tempFile.absolutePath)
            /* 1秒目(1,000,000μ秒)付近のフレームを取得 */
            //   ↓↓↓↓★★★ココの3行だけ。
            return retriever.getFrameAtTime(1_000_000, MediaMetadataRetriever.OPTION_CLOSEST)
        }
        catch (e: Exception) {
            e.printStackTrace()
        }
        finally {
            retriever.release()
        }
        return null
    }
}

あと、assets配下のmp4を一時ファイルにコピーしている処理があるのだけど、これをしないと例外はいて失敗する。
MediaMetadataRetriever.setDataSource(Context, Uri) は asset:/// スキームの URI をサポートしていないためらしい。asset:/// は ExoPlayer では使えるけど、MediaMetadataRetriever では使えないんだと。
このコードでは一時ファイルをアプリのキャッシュディレクトリに作っているけど、削除してないので、削除処理は追加して使ってください。

java.lang.IllegalArgumentException: could not access asset:///Gundam_LaLaport_Fuk.mp4
  at android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:370)
  at com.aaa.generatethumbnailsample.MainActivity.getVideoThumbnail(MainActivity.kt:82)
  at com.aaa.generatethumbnailsample.MainActivity.onCreate$lambda$1(MainActivity.kt:44)
  at com.aaa.generatethumbnailsample.MainActivity.$r8$lambda$LqJyYuYzcyJMLkptkmGapuF6ACM(Unknown Source:0) 2025-10-12

以上、動画からサムネイル生成の説明でした。
お役に立ちますように。。。

Discussion