###############處理原視頻,使其格式和原數據一樣
import os
import cv2
import subprocess
import json
from PIL import Image
from pydub import AudioSegmentimport sys
import shutil
# === 🔹 第一步:強制檢測并設置FFmpeg路徑 🔹 ===
def get_ffmpeg_path():"""確保FFmpeg和FFprobe可用"""ffmpeg_path = shutil.which("ffmpeg")ffprobe_path = shutil.which("ffprobe")if not ffprobe_path or not ffmpeg_path:print("? 致命錯誤: FFmpeg未正確安裝")print("請按照以下步驟操作:")print("1. 訪問 https://github.com/BtbN/FFmpeg-Builds/releases")print("2. 下載 'ffmpeg-master-latest-win64-gpl.zip'")print("3. 解壓到 C:\\ffmpeg")print("4. 將 C:\\ffmpeg\\bin 添加到系統PATH變量")print("5. 重啟命令行終端")sys.exit(1)# 配置pydub使用正確的路徑AudioSegment.converter = ffmpeg_pathreturn ffmpeg_path, ffprobe_pathffmpeg_path, ffprobe_path = get_ffmpeg_path()
print(f"? FFmpeg路徑: {ffmpeg_path}")
print(f"? FFprobe路徑: {ffprobe_path}")# === 🔹【設置文件路徑】🔹 ===
original_audio_path = "waveforms/7fmOlUlwoNg_20000_30000.wav" # 原始數據集音頻
original_image_path = "frames/frame_0/7fmOlUlwoNg_20000_30000.jpg" # 原始數據集幀input_video = "lai.mp4" # 你要處理的視頻
output_audio = "waveforms/lai_audio.wav"
frames_dir = "frames"os.makedirs("waveforms", exist_ok=True)
os.makedirs("frames", exist_ok=True)# === 🔹【獲取原始數據集格式】🔹 ===
def get_audio_info(audio_path):""" 獲取音頻的格式信息 """cmd = ["ffprobe", "-i", audio_path, "-show_streams", "-select_streams", "a","-of", "json"]result = subprocess.run(cmd, capture_output=True, text=True)audio_info = json.loads(result.stdout)["streams"][0]return {"sample_rate": int(audio_info["sample_rate"]), # 采樣率"channels": int(audio_info["channels"]), # 聲道數"bit_rate": int(audio_info["bit_rate"]), # 比特率"duration": float(audio_info["duration"]) # 時長}def get_image_info(image_path):""" 獲取圖片的格式信息 """img = Image.open(image_path)return {"size": img.size, # (width, height)"mode": img.mode # "RGB" / "L" (灰度) / "CMYK" 等}# 獲取 **原始數據集** 的格式信息
original_audio_info = get_audio_info(original_audio_path)
original_image_info = get_image_info(original_image_path)print("🎯 原始音頻信息:", original_audio_info)
print("🎯 原始圖像信息:", original_image_info)# === 🔹【處理音頻】🔹 ===
def process_audio(input_audio, output_audio, ref_info):""" 將音頻轉換為和原始數據集匹配的格式 """audio = AudioSegment.from_file(input_audio)# 轉換采樣率if audio.frame_rate != ref_info["sample_rate"]:audio = audio.set_frame_rate(ref_info["sample_rate"])# 轉換聲道if audio.channels != ref_info["channels"]:audio = audio.set_channels(ref_info["channels"])# 轉換比特率(pydub 不支持直接修改比特率,但可以調整導出參數)audio.export(output_audio, format="wav", bitrate=str(ref_info["bit_rate"]) + "k")print(f"? 音頻已轉換并保存至 {output_audio}")process_audio(input_video, output_audio, original_audio_info)# === 🔹【處理視頻幀】🔹 ===
def extract_frames(video_path, output_dir, ref_info, frame_count=20):""" 從視頻中提取均勻分布的 20 幀,并匹配原始格式 """cap = cv2.VideoCapture(video_path)total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))frame_interval = max(total_frames // frame_count, 1)for i in range(frame_count):cap.set(cv2.CAP_PROP_POS_FRAMES, i * frame_interval)success, frame = cap.read()if success:# 統一尺寸frame = cv2.resize(frame, ref_info["size"])# 統一色彩模式if ref_info["mode"] == "L": # 如果是灰度frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)else: # 默認 RGBframe = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)# 逐幀存入 frame_0 到 frame_19frame_folder = os.path.join(output_dir, f"frame_{i}")os.makedirs(frame_folder, exist_ok=True)frame_path = os.path.join(frame_folder, "lai_frame.jpg")cv2.imwrite(frame_path, frame)cap.release()print(f"? 視頻幀已提取并存入 {output_dir}")extract_frames(input_video, frames_dir, original_image_info)print("🎉 處理完成!所有格式已匹配 ?")
直接執行腳本會報錯,解決辦法
安裝 FFmpeg(如果未安裝)
步驟一:手動下載 FFmpeg
-
訪問 FFmpeg 官方構建版本頁面:
https://github.com/BtbN/FFmpeg-Builds/releases -
下載最新版本:
- 點擊?
ffmpeg-master-latest-win64-gpl.zip
- 如果該版本不可用,選擇類似名稱的文件
- 點擊?
步驟二:解壓安裝
-
創建目錄:
- 打開文件資源管理器
- 導航到?
C:\
- 右鍵新建文件夾,命名為?
ffmpeg
-
解壓文件:
- 將下載的 ZIP 文件解壓到?
C:\ffmpeg
?目錄中 - 結構應為?
C:\ffmpeg\bin\ffmpeg.exe
- 將下載的 ZIP 文件解壓到?
🔧 解決方案二:設置環境變量(最重要的一步)
添加 FFmpeg 到系統 PATH
-
打開系統屬性:
- 按?
Win + R
?輸入?sysdm.cpl
?回車 - 或在文件資源管理器右鍵點擊"此電腦">屬性>高級系統設置
- 按?
-
打開環境變量:
- 點擊"環境變量"按鈕
- 在"系統變量"區域,找到并選擇"Path"
- 點擊"編輯"
-
添加 FFmpeg 路徑:
- 點擊"新建"
- 輸入?
C:\ffmpeg\bin
- 確保路徑中"bin"是小寫字母(Windows 路徑不區分大小寫)
-
保存更改:
- 點擊所有"確定"按鈕保存設置
- 關閉所有窗口
驗證設置:
-
打開新的命令提示符:
- 按?
Win + R
?輸入?cmd
?回車 - ?重要:必須是新打開的命令窗口,環境變量變更后生效?
- 按?
-
運行測試命令:
cmd
ffmpeg -version