Androidアプリ開発

動画ファイルのフレームレートを取得する

この記事は約8分で読めます。
記事内に広告が含まれています。
スポンサーリンク

この記事は Androidスマホ用のアプリ開発の中で、
今後の開発で再使用性が高いと思われるコーディングをまとめたものです。
Java での開発経験、XML構文規則、Android のアプリ開発経験がある方を対象としています。
Android のアプリ開発でお役にたててれば、嬉しいです。
(これから Android のアプリ開発や Java での開発を始めたい方への案内は、
記事の最後で紹介します)

この記事のテーマ


動画ファイルのフレームレート(fps)を取得する

動画ファイルのフレームレート(29fps)を取得し、1フレーム毎にシークバーを操作して動画を動かします。

動画再生アプリ(Duel)のコマ送り機能

ポイント

動画をコマ送りで再生する場合、動画ファイルのフレームレート(1秒間のフレーム数)が必要になります。
動画ファイルのフレームレートを取得する方法として、ffmpeg-kitMediaExtractorを使用する方法があります。
しかし、ffmpeg-kitはCUIのため、結果(値)の受け渡しのハンドリングに難があります。
また、MediaExtractorでは動画ファイルのパス指定しますが、MediaStoreのパスでは動作しないようです。
なお、MediaStoreから取得できる値として、CAPTURE_FRAMERATEがありますが、期待した値が取得できません。
今回は、ExoPlayerAnalyticsListenerを使用して、フレームレートを取得する方法を紹介します。

ffmpeg-kit

MediaExtractor

ExoPlayer

動画ファイルのフレームレートを取得する

動画再生でExoPlayerを使用している場合、AnalyticsListenerに取得するコードを追加するだけです。
onTracksChangedはトラックが変更する度に動画ファイルを解析して、フレームレートを取得することができます。

        private float  flame = 30; // フレームレート
     :
        PlayerView playerView = dialog.findViewById(R.id.video);
        ExoPlayer exoPlayer = new ExoPlayer.Builder(context)
                .setHandleAudioBecomingNoisy(true)
                .build();
        playerView.setPlayer(exoPlayer);
        exoPlayer.setMediaItem(MediaItem.fromUri("動画ファイルのUri"), 0);
        exoPlayer.prepare();
        // フレームレート取得
        exoPlayer.addAnalyticsListener(new AnalyticsListener() {
            @Override
            public void onTracksChanged(@NonNull EventTime eventTime, @NonNull Tracks tracks) {
                try {
                    for (int i = 0; i < tracks.getGroups().size() - 1; i++) {
                        frame = tracks.getGroups().get(i).getTrackFormat(i).frameRate;
                    }
                } catch (Exception e) {
                    Log.d(TAG, String.format("onTracksChanged:%s", e.getMessage()));
                }
         :
                AnalyticsListener.super.onTracksChanged(eventTime, tracks);
            }
        });
        :

AnalyticsListenerのメソッド(onTracksChanged)は、複数のトラックをハンドリングします。
このため、サンプルではMediaItemには1つの動画ファイルのみセットしています。
複数の動画ファイルに対応する場合は、該当のトラック番号のフレームレートのみ取得する必要があります。

Google Pixelで撮影した動画でフレームレートが取得できないケースを確認しました。
取得できない場合のエラーハンドリングを追加しました。

今回は、ここまでです。

動画ファイルのフレームレートを取得にしているAndroidアプリです。

自撮り撮影するのに便利です♪

誤字脱字、意味不明でわかりづらい、
もっと詳しく知りたいなどのご意見は、
このページの最後にある
コメントか、
こちらから、お願いいたします♪