録画したビデオ ファイルのフレーム レートを抽出するにはどうすればよいですか? MediaFormat.KEY_FRAME_RATE があり、MediaExtractor を介して MediaFormat オブジェクトにアクセスできることを知っています。ただし、KEY_FRAME_RATE はエンコーダーでのみ使用できます。代わりに、既に録画されたビデオのフレーム レートを調べたいと考えています。
何か案は?
録画したビデオ ファイルのフレーム レートを抽出するにはどうすればよいですか? MediaFormat.KEY_FRAME_RATE があり、MediaExtractor を介して MediaFormat オブジェクトにアクセスできることを知っています。ただし、KEY_FRAME_RATE はエンコーダーでのみ使用できます。代わりに、既に録画されたビデオのフレーム レートを調べたいと考えています。
何か案は?
を使用する場合、ビデオ トラックの FPS が安定していれば、検索しているフレームの長さだけ進んMediaExtractor
でいることが確実にわかります。MediaExtractor
何かを行う前に、 をセットアップした直後にMediaExtractor
、次の操作を実行できます。
mediaExtractor.Advance();
var fps = 1000000f / (float) mediaExtractor.SampleTime;
mediaExtractor.SeekTo(0, MediaExtractorSeekTo.None);
私が言ったように、すべてのフレームが同じ持続時間を持つことを当然のことと考えることはできません。フレームの表示時間は完全に恣意的ですが、安定した FPS がないことは一般的ではないと感じています。
ffmpeg を使用して、ビデオのフレーム レートを取得できます ( https://www.ffmpeg.org ) - fadden と Marlon が、承認された回答へのコメントで可変フレーム レートについて行うコメントに従います。
Android に ffmpeg を含める方法はいくつかあります。私が見つけた複雑さと機能の最適な妥協点は、コマンド ライン ffmpeg プログラムを Java JNI ラッパーでラップすることでした。
ラッパーを介して ffmpeg を 2 回呼び出す問題など、注意すべき問題がいくつかあるため、既存の Android ラッパー ソリューションを使用するか、調査する価値があります。
そこのドキュメントから:
FFmpeg ffmpeg = FFmpeg.getInstance(context);
try {
// to execute "ffmpeg -version" command you just need to pass "-version"
ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler() {
@Override
public void onStart() {}
@Override
public void onProgress(String message) {}
@Override
public void onFailure(String message) {}
@Override
public void onSuccess(String message) {}
@Override
public void onFinish() {}
});
} catch (FFmpegCommandAlreadyRunningException e) {
// Handle if FFmpeg is already running
}
フレーム レートを取得するための ffmpeg cmd の例で、filename を確認するファイルの名前に置き換えます。
cmd = "-i filename";
次に、コードで fps の出力を解析できます。以下の出力例を参照してください。
ffmpeg version 2.6.1 Copyright (c) 2000-2015 the FFmpeg developers
built with llvm-gcc 4.2.1 (LLVM build 2336.11.00)
configuration: --prefix=/Volumes/Ramdisk/sw --enable-gpl --enable-pthreads --enable-version3 --enable-libspeex --enable-libvpx --disable-decoder=libvpx --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-avfilter --enable-libopencore_amrwb --enable-libopencore_amrnb --enable-filters --enable-libgsm --enable-libvidstab --enable-libx265 --disable-doc --arch=x86_64 --enable-runtime-cpudetect
libavutil 54. 20.100 / 54. 20.100
libavcodec 56. 26.100 / 56. 26.100
libavformat 56. 25.101 / 56. 25.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 11.102 / 5. 11.102
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 3.100 / 53. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/BBB/Desktop/vid_bigbuckbunny.mp4':
Metadata:
major_brand : mp42
minor_version : 1
compatible_brands: mp42avc1
creation_time : 2010-02-09 01:55:39
Duration: 00:01:00.10, start: 0.000000, bitrate: 733 kb/s
Stream #0:0(eng): Audio: aac (LC) (mp4a / 0x6134706D), 22050 Hz, stereo, fltp, 65 kb/s (default)
Metadata:
creation_time : 2010-02-09 01:55:39
handler_name : Apple Sound Media Handler
Stream #0:1(eng): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p(tv, smpte170m/smpte170m/bt709), 640x360, 612 kb/s, 23.96 fps, 24 tbr, 600 tbn, 1200 tbc (default)
Metadata:
creation_time : 2010-02-09 01:55:39
handler_name : Apple Video Media Handler
Stream #0:2(eng): Data: none (rtp / 0x20707472), 45 kb/s
Metadata:
creation_time : 2010-02-09 01:55:39
handler_name : hint media handler
Stream #0:3(eng): Data: none (rtp / 0x20707472), 5 kb/s
Metadata:
creation_time : 2010-02-09 01:55:39
handler_name : hint media handler
ffmpeg の構文と出力形式は時間の経過とともに変化する可能性があることに注意してください。そのため、特に解析ではこれを考慮する必要がありますが、出力で「fps」を探すことはおそらく一般的に機能します。
また、多くのビデオ「コンテナ」(ビデオ ファイルと呼ばれることが多い mp4 など) には複数のビデオ ストリームが含まれている場合があり、ストリームごとにフレーム レートが異なる場合があることにも注意してください。これは ffmpeg からの出力に含まれるため、出力を解析するときに確認する必要があります。
最後に、ビデオのフレーム レートが一定ではない可能性があることをもう一度思い出してください。このことを念頭に置いて使用してください。