この記事は Androidスマホ用のアプリ開発の中で、
今後の開発で再使用性が高いと思われるコーディングをまとめたものです。
Java での開発経験、XML構文規則、Android のアプリ開発経験がある方を対象としています。
Android のアプリ開発でお役にたててれば、嬉しいです。
(これから Android のアプリ開発や Java での開発を始めたい方への案内は、記事の最後で紹介します)
動画ファイルのフレームレート(29fps)を取得し、1フレーム毎にシークバーを操作して動画を動かします。
ポイント
動画をコマ送りで再生する場合、動画ファイルのフレームレート(1秒間のフレーム数)が必要になります。
動画ファイルのフレームレートを取得する方法として、ffmpeg-kit、MediaExtractorを使用する方法があります。
しかし、ffmpeg-kitはCUIのため、結果(値)の受け渡しのハンドリングに難があります。
また、MediaExtractorでは動画ファイルのパス指定しますが、MediaStoreのパスでは動作しないようです。
なお、MediaStoreから取得できる値として、CAPTURE_FRAMERATEがありますが、期待した値が取得できません。
今回は、ExoPlayerのAnalyticsListenerを使用して、フレームレートを取得する方法を紹介します。
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つの動画ファイルのみセットしています。
複数の動画ファイルに対応する場合は、該当のトラック番号のフレームレートのみ取得する必要があります。
今回は、ここまでです。
動画ファイルのフレームレートを取得にしているAndroidアプリです。
自撮り撮影するのに便利です♪
誤字脱字、意味不明でわかりづらい、
もっと詳しく知りたいなどのご意見は、
このページの最後にあるコメントか、
こちらから、お願いいたします♪