簡體   English   中英

ffmpeg從修剪的視頻中獲取幀的時間

[英]ffmpeg Get time of frames from trimmed video

我在應用程序中使用FFmpeg從視頻中提取幀,這些幀將被添加到修剪視頻視圖中,在該視圖中您可以了解視頻在特定時間段內視頻的情況。 因此,每個幀都需要代表視頻中的某個時間。

我不太了解FFmpeg是如何產生幀的。 這是我的代碼:

"-i",
videoCroppedFile.getAbsolutePath(),
"-vf",
"fps=1/" + frameSeperation,
mediaStorageDir.getAbsolutePath() +
"/%d.jpg"

我的應用程序允許您錄制視頻的最大長度為20秒。 從視頻中提取的幀數取決於所捕獲視頻的時長。 通過以下代碼計算frameSeperation。

String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
    long videoLength = Long.parseLong(time) / 1000;
    double frameSeperationDouble = (double) videoLength;
    // Divide by 11 because there is a maximum of 11 frames on trim video view
    frameSeperationDouble /= 11;
    frameSeperationDouble = Math.ceil(frameSeperationDouble);
    int frameSeperation = (int) frameSeperationDouble;

上面的邏輯也許很不好,如果有更好的方法,請告訴我。

無論如何,我運行代碼,下面是一些測試用例:

  • 捕獲的長度為6秒的視頻有7幀。
  • 長度為2秒的視頻捕獲了3幀。
  • 捕獲的長度為10秒的視頻有12幀。
  • 長度為15秒的視頻捕獲有9幀。
  • 長度為20秒的視頻捕獲有11幀。

沒有一致性,因此,我發現很難在每個幀上加上時間戳。 我覺得我的邏輯是錯誤的或不理解。 任何幫助深表感謝

更新1

所以我做了你在評論中說的話:

 final FFmpeg ffmpeg = FFmpeg.getInstance(mContext);
        final File mediaStorageDir = new File(Environment.getExternalStorageDirectory()
                + "/Android/data/"
                + mContext.getPackageName()
                + "/vFrames");

    if (!mediaStorageDir.exists()){
        mediaStorageDir.mkdirs();
    }

    MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    retriever.setDataSource(mContext, Uri.fromFile(videoCroppedFile));
    String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
    long videoLength = Long.parseLong(time) / 1000;
    double frameSeperationDouble = (double) videoLength / 8;

    retriever.release();

    final String cmd[] = {

            "-i",
            videoCroppedFile.getAbsolutePath(),
            "-vf",
            "fps=1/" + frameSeperationDouble,
            "-vframes," + 8,
            mediaStorageDir.getAbsolutePath() +
            "/%d.jpg"
    };

在將vFrame放入cmd的同一點,我也嘗試了"-vframes=" + 8 現在似乎根本不起作用,沒有從視頻中提取幀

這是fps=x的有效流,默認舍入方法near

產生1/x秒的間隔,例如 對於x=1/3 ,間隔為0-3s,3-6s,6-9s ...在每個間隔內,選擇一個時間戳最近的那個幀,該時間戳最接近該間隔的中點。 當最近的幀屬於較早的間隔並且已經為該間隔選擇時,這可能導致重復的幀。 如果源是可變幀率,則可能發生。

在您的情況下,如果可能的話,我建議避免舍入或去除小數值。 或者在最后做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM