[英]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;
上面的邏輯也許很不好,如果有更好的方法,請告訴我。
無論如何,我運行代碼,下面是一些測試用例:
沒有一致性,因此,我發現很難在每個幀上加上時間戳。 我覺得我的邏輯是錯誤的或不理解。 任何幫助深表感謝
更新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.