Androidアプリ開発でのこと
動画のメタ情報を取得してみたかったです。
- 幅や高さなどのサイズ
- フレームレート(FPS)
- ビットレート(BPS)
- フレームの総数
- 再生時間(マイクロ秒)
- クオリティ(画質)
こういうメタ情報は簡単に取得できます。
外部ライブラリとかも必要ありません。
そこで自分の記録を整理するために、
Androidで動画メタ情報の取得コード例を紹介!
このページの目次
1.動画をファイルピッカーからURIとして取得
まずは動画メタ情報取得の下準備から
動画をファイルピッカーなどから取得します。
▼ その取得コード(Kotlin)の一例をあげると次の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
val openDocumentLauncher = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { result -> if (result.resultCode == Activity.RESULT_OK && result.data != null) { val uri: Uri? = result.data?.data try { /// このuriが動画URIを表す Log.d(TAG, "Video uri : ${uri}") /// 動画のメタ情報を取得する /// 以下メソッドは後述なので今はスルー /// extractVideoMetaData(uri) }catch(e: IOException){ /// } } } /// 動画用ファイルピッカーを起動 val intent = Intent(Intent.ACTION_OPEN_DOCUMENT) intent.type = "video/*" val title = "Select video format" val chooser = Intent.createChooser(intent, title) openDocumentLauncher.launch(chooser) |
この例では ACTION_OPEN_DOCUMENT からMIMEタイプが動画(video/*)のみを選択できるファイルピッカーを起動させてます。
そして動画が選ばれたらActivity#registerForActivityResultに渡したコールバック内で動画URIを取得できるという流れになってます。
ちなみに最近のAndroidはファイル周りが本当に厳格です。
詳しくは次記事などでも書いた通り
もちろん ACTION_OPEN_DOCUMENT はファイルアクセス手段の1つに過ぎないですが、どのAPIレベルでも無難に動かせるので多用する場面が多いです。
ひとまず動画をURIとして取得しときます。
2.動画URIからフレームレートなどメタ情報を抽出
そしたらここからが本番
次のメタデータを抽出してみます。
- 幅や高さなどのサイズ
- フレームレート(FPS)
- ビットレート(BPS)
- フレームの総数
- 再生時間(マイクロ秒)
抽出には MediaExtractorクラス を使ってみました。
このクラスはAPIレベル16以降で使えるため、
かなり古いAndroidとの互換性も保つことが可能です。
▼ 実際に動画メタ抽出のコードがこちら
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
/** * @param uri 動画URI * 動画メタデータを抽出する **/ private fun extractVideoMetaData(uri:Uri):JSONObject{ val mediaExtractor = MediaExtractor() mediaExtractor.setDataSource(uri.path!!) val format = mediaExtractor.getTrackFormat(0) /// 動画の幅 val width = format.getInteger(MediaFormat.KEY_WIDTH) /// 動画の高さ val height = format.getInteger(MediaFormat.KEY_HEIGHT) /// 再生時間(マイクロ秒単位) val duration = format.getLong(MediaFormat.KEY_DURATION) mediaExtractor.release() return if( format.containsKey(MediaFormat.KEY_FRAME_RATE) && format.containsKey(MediaFormat.KEY_BIT_RATE) ){ /// フレームレート val frameRate = format.getInteger(MediaFormat.KEY_FRAME_RATE) /// ビットレート val bitRate = format.getInteger(MediaFormat.KEY_BIT_RATE) /// フレーム総数 val frameCount = frameRate * (duration/ 1000000) JSONObject().put("width", width) .put("height", height) .put("frameRate", frameRate) .put("bitRate", bitRate) .put("frameCount", frameCount) .put("duration", duration) }else{ JSONObject().put("width", width) .put("height", height) .put("duration", duration) } } |
何をしてるかはコメントを参照
各種メタデータはフレームレートだったら MediaFormat.KEY_FRAME_RATE MediaFormat.KEY_FRAME_RATE 、ビットレートだったら MediaFormat.KEY_BIT_RATE から取得できます。分かりやすいですね。
ちなみに動画の総フレーム数の求め方について
あとついでにフレーム総数(frameCount)の求め方です。
1 2 |
/// FPSに再生時間秒をかければいい val frameCount = frameRate * (duration/ 1000000) |
このようにフレームレート(FPS)に再生時間(マイクロ秒単位なので秒単位に直す)をかければ算出することができます。
フレーム総数はメタデータには含まれません。
3.適当な動画のメタデータを抽出・調べてみた
適当な動画を用意してみました。
返ってきたメタデータはこんな感じです。
▼ 先ほどのextractVideoMetaDataメソッドの結果
1 2 3 4 5 6 7 8 |
{ "width":320, "height":400, "frameRate":30, "bitRate":231367, "frameCount":300, "duration":10000000 } |
再生時間は10000000となってますが、マイクロ秒なので秒に直すと10秒になります。表示フォーマットは各自工夫してください。
あとはフレームレートとかビットレートとか……色々取得できてます。もし存在しないならサイズ・再生時間しか返ってこないです。
Android上では動画メタ情報は超簡単に取得できる
別に専用ライブラリを入れる必要もありません。
ただMediaExtractorクラスに動画を渡せば取得できます。
以上、Androidでの動画メタ情報取得でした。
動画のFPS・BPSなどが知りたい時に便利です。ではまた