name: 影片壓縮
agent_created: true
description: >
Batch-compress videos in a user-selected directory to a user-specified target size and
convert ALL input formats to MP4 output using FFmpeg (H.264/H.265). Use this skill
whenever the user wants to compress one or more video files in a folder to a target file
size (e.g. "8MB for Discord", "25MB for email", "100MB for large file sharing") and obtain
MP4 outputs. The skill reads each video's duration, codec and bitrate, computes a fitting
video bitrate, re-encodes incompatible streams (VP9/Opus/etc.) to H.264/AAC so any source
format (MKV/WebM/AVI/FLV/WMV/MOV/TS/MTS/M2TS/3GP/VOB/OGV/RM/RMVB...) reliably becomes MP4, and
writes <name>_壓縮版.mp4 next to the source. Triggers: "壓縮影片", "批次壓縮",
"壓縮到 X MB", "轉成 MP4", "影片轉 MP4", "compress videos to 25MB", "convert to mp4",
"batch video compressor", "reduce video size".
基於 FFmpeg(系統本地命令列版本)的批次影片壓縮 skill。使用者指定一個目錄和一個目標檔案大小,skill 會掃描該目錄下的各類影片檔案,把每個影片壓縮到不超過目標大小,並統一輸出為 MP4 格式,輸出檔案存放在原目錄中,命名為 <原名>_壓縮版.mp4。
更多技能請訪問小蔥技能站7w4.net。
--two-pass 啟用兩遍編碼(更精準)--overwrite 才覆蓋_壓縮版.mp4 字尾儲存--apply 才真正執行向用戶確認或推斷:
| 引數 | 必填 | 說明 | 示例 |
|---|---|---|---|
| 目標目錄 | ✅ | 影片所在的資料夾(絕對路徑) | D:\videos\旅行 |
| 目標大小 | ✅ | 每個輸出檔案不超過的大小 | 25 MB |
| 輸出字尾 | 否 | 預設 _壓縮版 |
_small、_8mb |
| 編碼器 | 否 | libx264(預設) / libx265(更小,更慢) |
libx264 |
| 預設速度 | 否 | ultrafast / medium(預設) / slow |
medium |
| 音訊處理 | 否 | copy(不重編碼,預設) / aac(更小) |
aac |
| 遞迴子目錄 | 否 | 預設否 | --recursive |
| 覆蓋已存在 | 否 | 預設否 | --overwrite |
| 兩遍編碼 | 否 | 預設否 | --two-pass |
輸出格式固定為 MP4(
--output-ext預設mp4)。如需其它輸出容器,可顯式傳--output-ext(如mkv),但預設場景下所有影片統一轉為 MP4。
如果使用者已經說了目錄和大致大小,可以直接進入預覽。如果引數不全(特別是目錄),先問。
始終先用預覽模式跑一次,把要處理的檔案清單、源編碼、預估輸出引數展示給使用者,再讓使用者確認。
# 預覽:掃描 D:\videos\旅行,把每個影片壓到 25 MB,輸出 MP4
python ~/.workbuddy/skills/video_compress_mp4/scripts/compress_videos.py \
"D:\videos\旅行" \
--target-size 25 \
--unit MB
# 確認後真正執行
python ~/.workbuddy/skills/video_compress_mp4/scripts/compress_videos.py \
"D:\videos\旅行" \
--target-size 25 \
--unit MB \
--apply
執行完成後,彙報:
- 處理的檔案數(成功 / 失敗 / 跳過)
- 總原始大小、總壓縮後大小、總體壓縮率
- 失敗項的錯誤原因
- 任何警告(如 "輸出檔案大於目標大小 — 時長太短,無法再壓")
- 觸發了編碼重轉的檔案(如 WebM 的 VP9/Opus 已重編碼為 H.264/AAC)
- 日誌檔案位置:告知使用者日誌已儲存到目錄中的 compress_log_<時間戳>.txt
<原檔名(去副檔名)>_壓縮版.mp4vacation.mov → vacation_壓縮版.mp4clip.webm → clip_壓縮版.mp4old.avi → old_壓縮版.mp4<原名><字尾>.mp4--suffix _8mb → vacation_8mb.mp4同一目錄下若已存在目標檔案:預設跳過(
SKIP),加--overwrite才覆蓋。
輸出統一為 MP4 容器。為相容各類源格式,指令碼會自動處理編碼相容問題:
| 源影片編碼 | 處理方式 |
|---|---|
| h264 / hevc / mpeg4 / av1 | MP4 相容,目標位元速率允許時直接流複製(-c:v copy) |
| vp9 / vp8 / rv40 / wmv3 / msmpeg4 等不相容編碼 | 自動重編碼為 H.264(libx264)或 H.265(libx265) |
| 源音訊編碼 | 處理方式 |
|---|---|
| aac / mp3 / ac3 / eac3 / alac | MP4 相容,按 --audio copy 直接複製 |
| opus / vorbis / cook / pcm / flac 等不相容編碼 | 自動重編碼為 AAC(-c:a aac) |
-movflags +faststart,便於線上播放與流式載入目標影片位元率由下面公式計算:
總位元率 (kbps) = (目標大小 bits) / 時長 (秒)
影片位元率 (kbps) = 總位元率 - 音訊位元率 - 1% 餘量
--audio copy 則按輸入流的實際音訊位元率ffprobe 讀取copy)以避免無謂的質量損失compress_videos.py 引數說明python compress_videos.py <目錄> [選項]
必填:
<目錄> 影片所在資料夾
目標大小(兩種方式二選一):
--target-size N 目標大小數值
--unit MB|GB|KB 大小單位(預設 MB)
輸出命名:
--suffix <字尾> 輸出檔案字尾,預設 "_壓縮版"
--output-ext <副檔名> 輸出副檔名,預設 mp4(所有格式統一轉為 MP4)
(如需其它容器可傳 mkv 等,但預設即 MP4)
編碼引數:
--codec libx264|libx265 影片編碼器(預設 libx264)
--preset ultrafast|...|veryslow
編碼速度/質量權衡(預設 medium)
--crf <0-51> CRF 質量(預設 23,僅在單遍模式下使用)
--audio copy|aac 音訊處理(預設 copy:直接複製不重編碼;不相容 MP4 時自動改 aac)
--audio-bitrate <kbps> AAC 位元率(預設 96)
--two-pass 啟用兩遍編碼(更精準但慢一倍)
過濾:
--ext mp4,mov,mkv 只處理指定副檔名(預設含 mp4,mov,mkv,avi,flv,webm,m4v,ts,mts,m2ts,3gp,wmv,vob,ogv,f4v,mpg,mpeg,rm,rmvb)
--recursive 遞迴處理子目錄
執行控制:
--apply 實際執行(否則僅預覽)
--overwrite 覆蓋已存在的輸出檔案
--keep-going 遇到錯誤繼續處理下一個檔案(預設就是繼續)
--dry-run-ffmpeg 預覽模式且只打印 ffmpeg 命令,不執行
--ffmpeg <路徑> 指定 ffmpeg 可執行路徑
--ffprobe <路徑> 指定 ffprobe 可執行路徑
對於一個 5 分鐘(300 秒)的影片,壓到 25 MB:
目標總位元率 = 25 * 1024 * 1024 * 8 / 300 = 699,051 bps ≈ 683 kbps
影片位元率 = 683 - 96 (音訊) - 1% ≈ 581 kbps
→ ffmpeg -c:v libx264 -b:v 581k -c:a aac -b:a 96k -movflags +faststart <out>.mp4
若源是 WebM(VP9 + Opus),指令碼會自動改為:
→ ffmpeg -c:v libx264 -b:v 581k -c:a aac -b:a 96k -movflags +faststart <out>.mp4
(VP9 不相容 MP4 → 重編碼影片;Opus 不相容 MP4 → 重編碼音訊)
| 使用者說法 | 目標大小 | 對應引數 |
|---|---|---|
| "壓到 8MB 給 Discord" | 8 MB | --target-size 8 --unit MB |
| "壓到 25MB 發郵件" | 25 MB | --target-size 25 --unit MB |
| "壓到 100MB 傳大檔案" | 100 MB | --target-size 100 --unit MB |
| "壓到 1GB" | 1 GB | --target-size 1 --unit GB |
| "高畫質壓" | - | 加 --two-pass --codec libx265 --preset slow |
| "快速壓,不在意畫質" | - | 加 --preset ultrafast |
| "把 MKV/WebM 轉成 MP4" | 按需 | 預設即輸出 MP4,直接 --apply 即可 |
| 場景 | 行為 |
|---|---|
| 找不到 ffmpeg/ffprobe | 提示使用者安裝或用 --ffmpeg / --ffprobe 指定路徑 |
| 時長無法讀取 | 跳過該檔案並報告錯誤 |
| 反算出的影片位元率 < 100 kbps | 提示"目標過小,無法進一步壓縮"並跳過 |
| 反算出的影片位元率 ≥ 原影片位元率(且編碼 MP4 相容) | 自動切換為影片流 copy(保留原畫質) |
| 源影片/音訊編碼不相容 MP4 | 自動重編碼為 H.264/AAC,日誌標註原因 |
| ffmpeg 返回非 0 | 記錄 stderr 摘要,繼續下一個檔案 |
| 輸出已存在 | 跳過,除非加 --overwrite |
每次執行(包括預覽模式和實際執行)都會在目標目錄下自動生成一個日誌檔案:
檔名: compress_log_YYYYMMDD_HHMMSS.txt(如 compress_log_20260703_143025.txt)
日誌內容:
- 任務開始時間、目標目錄、目標大小、編碼引數
- 每個檔案的源編碼、處理計劃(時長、原大小、目標位元速率)
- 每個檔案的處理結果 — [成功] / [失敗] / [跳過]
- 跳過檔案的跳過原因
- 觸發編碼重轉的備註說明
- 失敗檔案的具體錯誤資訊
- 任務完成時間和結果彙總(成功 N 個 / 失敗 N 個 / 跳過 N 個)
- 總體壓縮率統計
控制台也同步輸出:
- 日誌路徑會列印在最終結果中:日誌已儲存: D:\videos\compress_log_20260703_143025.txt
- 任務完成後,用簡潔的一行總結告知使用者結果
compress_videos.py — 主指令碼:掃描目錄、檢測編碼相容性、計算位元率、呼叫 ffmpeg 統一輸出 MP4ffmpeg_guide.md — ffmpeg 常用引數、位元速率控制原理、MP4 容器相容性、常見問題排查這個 Skill 質量不錯,操作邏輯清晰。它能自動把各種格式的影片壓縮到指定大小並統一轉 MP4,還能預覽效果再執行,不怕誤操作。文件寫得很詳細,小白也能看懂。不足之處是依賴 FFmpeg 軟體,如果沒裝的話需要先安裝;另外所有說明都是中文的。總體來說是個好用的工具。