3

録画したビデオ ファイルのフレーム レートを抽出するにはどうすればよいですか? MediaFormat.KEY_FRAME_RATE があり、MediaExtractor を介して MediaFormat オブジェクトにアクセスできることを知っています。ただし、KEY_FRAME_RATE はエンコーダーでのみ使用できます。代わりに、既に録画されたビデオのフレーム レートを調べたいと考えています。

何か案は?

4

3 に答える 3

3

を使用する場合、ビデオ トラックの FPS が安定していれば、検索しているフレームの長さだけ進んMediaExtractorでいることが確実にわかります。MediaExtractor

何かを行う前に、 をセットアップした直後にMediaExtractor、次の操作を実行できます。

mediaExtractor.Advance();
var fps = 1000000f / (float) mediaExtractor.SampleTime;
mediaExtractor.SeekTo(0, MediaExtractorSeekTo.None);

私が言ったように、すべてのフレームが同じ持続時間を持つことを当然のことと考えることはできません。フレームの表示時間は完全に恣意的ですが、安定した FPS がないことは一般的ではないと感じています。

于 2015-08-04T02:53:29.527 に答える
2

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 からの出力に含まれるため、出力を解析するときに確認する必要があります。

最後に、ビデオのフレーム レートが一定ではない可能性があることをもう一度思い出してください。このことを念頭に置いて使用してください。

于 2015-05-13T08:31:13.357 に答える