h5網(wǎng)站制作接單域名備案
使用 FFmpeg 提取 MP4 視頻的關(guān)鍵幀并計算關(guān)鍵幀頻率可以按以下步驟進(jìn)行:
提取關(guān)鍵幀:
使用 FFmpeg 提取視頻中的關(guān)鍵幀可以通過以下命令實現(xiàn):
ffmpeg -i input.mp4 -vf "select='eq(pict_type,I)'" -vsync vfr keyframes_%03d.jpg
這條命令的含義如下:
-i input.mp4:指定輸入文件。
-vf “select=‘eq(pict_type,I)’”:使用視頻濾鏡選擇關(guān)鍵幀(I 幀)。
-vsync vfr:保證輸出視頻幀率。
keyframes_%03d.jpg:輸出的關(guān)鍵幀圖像名稱格式。
這將在當(dāng)前目錄下生成以 keyframes_001.jpg, keyframes_002.jpg 等命名的關(guān)鍵幀圖像文件。
提取到的關(guān)鍵幀圖像將會保存在 當(dāng)前目錄中,命名格式如 keyframes_001.jpg、keyframes_002.jpg 等。
使用以下命令查看 目錄下的 JPG 文件數(shù)量:
ls guanjianzhen/*.jpg | wc -l
該命令會列出 guanjianzhen 目錄中的所有 JPG 文件并計算數(shù)量,從而幫助你得出關(guān)鍵幀數(shù)量。
獲取視頻時長:
如之前提到的,使用 FFmpeg 提取視頻的信息:
ffmpeg -i input.mp4
根據(jù)輸出信息獲取視頻的總時長,并按上面提到的方式計算關(guān)鍵幀頻率。
計算關(guān)鍵幀頻率:
關(guān)鍵幀頻率是指在特定時間內(nèi)的關(guān)鍵幀數(shù)量。你可以通過以下命令來獲取視頻的總幀數(shù)以及時長:
在輸出中找到視頻的時長。如下是相關(guān)的部分:
Duration: 00:15:00.11, start: 0.000000, bitrate: 412 kb/s
這里的 Duration 指的是視頻的總時長。其中 00:15:00.11 表示:
00 小時
15 分鐘
00.11 秒
因此,這個視頻的總時長是 15 分鐘 0.11 秒,換算成秒為:
15分鐘 = 15 * 60 = 900秒
加上0.11秒,視頻總時長為900.11秒
ffmpeg -i input.mp4
比如,如果總時長是 90 秒,而提取到 10 幀關(guān)鍵幀,那么關(guān)鍵幀頻率可以這樣計算:
關(guān)鍵幀頻率 = 關(guān)鍵幀數(shù)量 / 視頻時長 (秒)
關(guān)鍵幀頻率 = 10 / 90 = 0.111 (每秒 0.111 個關(guān)鍵幀)
通過以上步驟,你就能提取出關(guān)鍵幀并計算其頻率。
寫為一個python腳本
import subprocess
import os
import redef get_video_duration(video_file):result = subprocess.run(['./ffmpeg', '-i', video_file], capture_output=True, text=True)duration_line = next((line for line in result.stderr.splitlines() if "Duration" in line), None)if duration_line:duration = re.search(r'Duration: (\d+):(\d+):(\d+\.\d+)', duration_line)if duration:hours, minutes, seconds = map(float, duration.groups())total_seconds = hours * 3600 + minutes * 60 + secondsreturn total_secondsreturn Nonedef extract_keyframes(video_file, output_dir):os.makedirs(output_dir, exist_ok=True)command = ['./ffmpeg', '-i', video_file,'-vf', "select='eq(pict_type,I)'",'-vsync', 'vfr',os.path.join(output_dir, 'keyframe_%03d.jpg')]subprocess.run(command)def count_keyframes(output_dir):return len([name for name in os.listdir(output_dir) if name.endswith('.jpg')])def main():video_file = 'input.mp4' # 指定輸入視頻文件路徑output_dir = 'keyframes' # 指定關(guān)鍵幀輸出目錄# 獲取視頻時長duration_seconds = get_video_duration(video_file)if duration_seconds is None:print("無法獲取視頻時長。")returnprint(f"視頻長度: {duration_seconds:.2f}秒")# 提取關(guān)鍵幀extract_keyframes(video_file, output_dir)# 計算關(guān)鍵幀數(shù)量keyframe_count = count_keyframes(output_dir)print(f"關(guān)鍵幀數(shù)量: {keyframe_count}")# 計算關(guān)鍵幀頻率if duration_seconds > 0:keyframe_frequency = keyframe_count / duration_secondsprint(f"關(guān)鍵幀頻率: {keyframe_frequency:.4f} (每秒)")else:print("視頻時長無效,無法計算關(guān)鍵幀頻率。")if __name__ == "__main__":main()