利用ffmpeg截圖和生成gif

從視頻中截取指定數量的圖片?

ffmpeg -i input.mp4 -ss 00:00:10 -vframes 1 output.jpgffmpeg -i input.mp4 -ss 00:00:10 -vframes 180 output.jpg
-vframes 180代表截取180幀,
實測后發現如果視頻是60fps,那么會從第10秒截取到第13秒
  • -i input.mp4:指定輸入視頻文件。
  • -ss 00:00:10:定位到視頻的第10秒。
  • -vframes 1:指定只提取一幀。
  • output.jpg:輸出截圖文件。

從視頻中提取多幀截圖

ffmpeg -i input.mp4 -vf fps=1/60 output_%03d.jpg
  • fps=1/60fps=幀數/秒 的形式

  • 1/60 表示 1 幀每 60 秒(即每分鐘 1 張圖),通常用于長視頻中低頻截圖(比如做縮略圖或監控抽幀)

截取多張圖時,通配符文件名規則

output_%03d.jpg:輸出文件命名格式,%03d表示三位數字編號
舉例:
output_%03d.jpg
輸出
output_001.jpg
output_002.jpg
output_003.jpg

?從視頻中提取特定時間段的截圖

ffmpeg -i input.mp4 -ss 00:01:00 -to 00:02:00 -vf fps=1/10 output_%03d.jpg-vf 是 -filter:v 的簡寫,表示對視頻流使用視頻濾鏡。fps=1/10 指每10秒提取一幀。意味著1分鐘內截6張圖
  • -ss 00:01:00:開始時間,從第1分鐘開始。
  • -to 00:02:00:結束時間,到第2分鐘結束。
  • -vf fps=1/10:每10秒提取一幀,如果視頻有1分鐘,那么僅截圖6張圖

截圖時長說明-t與-to區別

參數順序影響行為?

-t是相對時間(持續時間)和-to?絕對時間

  • ??推薦將?-ss?和?-t/-to?放在?-i?之前??:
    這樣 FFmpeg 會直接跳轉到指定時間點(快速但不精確,依賴關鍵幀)。
  • ??將?-ss?放在?-i?之后??:
    FFmpeg 會解碼到指定時間點(速度慢但精確到幀)。
  • #舉例說明
    # 快速截取(依賴關鍵幀,可能不精確)
    ffmpeg -ss 10 -to 15 -i input.mp4 output.mp4# 精確截取(逐幀解碼,速度慢)
    ffmpeg -i input.mp4 -ss 10 -to 15 output.mp4

設置截圖質量

?如果需要提取高質量的截圖,可以指定輸出圖片的質量:

ffmpeg -i input.mp4 -ss 00:00:10 -vframes 1 -q:v 2 output.jpg
  • -q:v 2:設置輸出圖片的質量,數值越小質量越高,范圍是1-31。

截圖并設置分辨率

ffmpeg -i input.mp4 -ss 00:00:10 -vframes 1 -s 640x360 output.jpg
  • -s 640x360:設置輸出圖片的分辨率為640x360。

關鍵幀限制??:若視頻關鍵幀間隔大,快速定位(-ss-i前)可能無法精確到非關鍵幀。,所以為了精確,需要先-i然后再-ss

截取第5秒的第1幀(快速定位,可能不精確)

ffmpeg -ss 5 -i input.mp4 -vframes 1 -q:v 2 output.jpg

特點??:-ss-i前,優先用關鍵幀定位,速度快但可能不精確。

精確截取第5秒的幀(較慢但準確)

ffmpeg -i input.mp4 -ss 5 -vframes 1 -q:v 2 output.jpg
  • ??特點??:-ss-i后,逐幀解碼到指定時間,速度慢但更精確。

截取第5.5秒的幀(精確到小數)

ffmpeg -ss 5.5 -i input.mp4 -vframes 1 output.png

?輸出PNG格式并設置圖片品質

ffmpeg -ss 5 -i input.mp4 -vframes 1 -compression_level 0 output.png-compression_level:取值范圍:0 到 9含義:0:最小壓縮,生成的文件較大,但處理速度快9:最大壓縮,文件體積小,但處理速度慢默認值:-compression_level 6

時間精度??:支持毫秒級時間(如00:00:05.500

文件名通配符

ffmpeg -ss 5 -i input.mp4 -vframes 1 output_%03d.jpg
  • 效果??:生成?output_001.jpg
  • ??占位符說明??:
    • %03d:3位數字編號(如?001,?002)。
    • %d:無填充編號(如?1,?2)。

每秒截n張圖

ffmpeg -i input.mp4 -r 7.5 -q:v 2 output_%03d.jpg

參數詳解:

-r n表示一秒內我一共想提取n幀,也就是每秒的幀率,即fps

可理解為:視頻的fps/n=每隔x幀截取一次圖片

  • -r 7.5表示如果原視頻是 30fps,每 4 幀截圖一次,30/4= 7.5fps。

  • 如果原視頻是 60fps,每5幀截圖一次,60/5=12

把視頻直接做成gif

體積小
./ffmpeg -ss 00:00:00 -to 00:00:10 -i ../input.mp4 -filter_complex "[0:v]fps=20,scale=400:-1" output_20fps.gif顏色質量高,體積適宜,需要分2步
第一步:生成調節板
./ffmpeg -ss 00:00:00 -to 00:00:10 -i ../coe33.mp4 -vf "fps=10,scale=400:-1:flags=lanczos,palettegen" palette.png
第二步:參考調班板生成圖片
./ffmpeg -ss 00:00:00 -to 00:00:10 -i ../input.mp4 -i palette.png -filter_complex "[0:v]fps=20,scale=400:-1:flags=lanczos[x];[x][1:v]paletteuse"  output_20fps.gif以下命令無需預先生成調色板#生成黑白色gif
./ffmpeg -ss 00:00:00 -to 00:00:10 -i ../input.mp4 -filter_complex "[0:v]fps=20,scale=400:-1,split[a][b];[a]palettegen=max_colors=2:reserve_transparent=0[p];[b][p]paletteuse=dither=floyd_steinberg" blackwhite.gif#256色
./ffmpeg -ss 00:00:00 -to 00:00:10 -i ../input.mp4 -filter_complex "[0:v]fps=20,scale=400:-1,split[a][b];[a]palettegen=max_colors=256[p];[b][p]paletteuse=dither=floyd_steinberg" o256colors.gif

多個參數混用

./ffmpeg -ss 00:00:00 -to 00:00:10 -i ../input.mp4 -filter_complex "[0:v]fps=20,scale=400:-1:flags=lanczos,split[a][b];[a]palettegen=max_colors=256:stats_mode=diff[p];[b][p]paletteuse=dither=floyd_steinberg" o256colors.gif

上述代碼的關鍵參數解析

  1. ??split[a][b]??
    將視頻流拆分為兩個分支?[a]?和?[b],分別用于生成調色板和應用調色板。

  2. ??palettegen=max_colors=256??

    • max_colors=256:設置調色板最大顏色數量(默認 256,GIF 支持的最大值)。
    • 若需減小文件體積,可降低此值(如?max_colors=128)。
  3. ??paletteuse=dither=floyd_steinberg??

    • dither=floyd_steinberg:使用高質量抖動算法(推薦保留顏色過渡)。
    • 若需減小體積,可改用?dither=none?或?dither=bayer

dither=none表示不使用抖動,直接使用調色板中最接近的顏色替換原顏色。這會導致顏色過渡生硬,出現色帶,但文件體積小,適合顏色簡單的圖像。

dither=bayer使用拜耳矩陣抖動,通過有序的圖案擴散誤差,模擬更多顏色。這種方法在低顏色深度下能減少色帶,但可能引入可見的圖案,體積比none大但比floyd_steinberg小。

實測發現生成gif體積排序是bayer>floyd_steinberg>none

如何選擇???

  • ??優先體積??:選?dither=none(如生成文件大小敏感的 LOGO)。
  • ??優先畫質??:選?dither=floyd_steinberg(誤差擴散算法,更平滑)。
  • ??平衡方案??:選?dither=bayer(動態 GIF 或分辨率較高的靜態圖)。

dither=bayer時,bayer_scale可控制gif大小

paletteuse=dither=bayer:bayer_scale=0

./ffmpeg -ss 00:19:50 -t 5 -i ../input.mp4  -filter_complex "[0:v]fps=15,scale=700:-1:flags=lanczos,split[a][b];[a]palettegen=max_colors=128:stats_mode=diff[p];[b][p]paletteuse=dither=bayer:bayer_scale=5" output.gif

bayer_scale取值范圍[0,5],實測發現0體積最大,5體積最小

縮小gif體積的方法

1上文中提到的調色板

2:使用?gifsicle?后處理壓縮?

# 安裝 gifsicle(macOS: brew install gifsicle, Linux: apt-get install gifsicle)
gifsicle -O3 --lossy=80 input.gif -o output_compressed.gif參數說明??:
-O3:最高級別壓縮優化。
--lossy=80:有損壓縮(值越大,壓縮率越高,畫質損失越大)。

3:動態區域裁剪?

-vf "crop=300:200:20:50"  # 截取 300x200 區域(從坐標 x=20,y=50 開始)
-filter_complex后面也可以用crop
例如
./ffmpeg -ss 00:19:50 -t 5 -i ../input.mp4 -filter_complex "[0:v]scale=300:-1,crop=130:120:70:70" output.gif

避免?-fs??:除非接受尾部截斷,否則不要使用?-fs

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81935.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81935.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81935.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

系統架構設計師案例分析題——數據庫緩存篇

一.核心知識 1.redis和MySQL的同步方案怎么做的? 讀數據:先查詢緩存,緩存不存在則查詢數據庫,然后將數據新增到緩存中寫數據:新增時,先新增數據庫,數據庫成功后再新增緩存;更新和刪…

什么是智能體?

什么是智能體? 智能體(AI Agent)是一種能夠自主感知環境、做出決策并執行任務的智能實體,其核心依賴大型語言模型(LLM)或深度學習算法作為“大腦”模塊。它通過感知模塊(如多模態輸入&#xff…

企業數字化轉型是否已由信息化+自動化向智能化邁進?

DeepSeek引發的AI熱潮迅速蔓延到了各個行業,目前接入DeepSeek的企業,涵蓋了科技互聯網、云服務、電信、金融、能源、汽車、手機等熱門領域,甚至全國各地政府機構也紛紛引入。 在 DeepSeek 等國產 AI 技術的推動下,眾多企業已經敏銳…

廣州卓遠VR受邀參加2025智能體育典型案例調研活動,并入駐國體華為運動健康聯合實驗室!

近日,“2025年智能體育典型案例調研活動”在東莞松山湖成功舉辦。本次調研活動由國家體育總局體育科學研究所和中國信息通信研究院聯合主辦,旨在深入貫徹中央關于培育新型消費的戰略部署,通過激活智能健身產品消費潛力,加快運動健…

springboot+vue實現鮮花商城系統源碼(帶用戶協同過濾個性化推薦算法)

今天教大家如何設計一個 鮮花商城 , 基于目前主流的技術:前端vue3,后端springboot。學習完這個項目,你將來找工作開發實際項目都會又很大幫助。文章最后部分還帶來的項目的部署教程。 系統有著基于用戶的協同過濾推薦算法,還有保證…

【android bluetooth 協議分析 02】【bluetooth hal 層詳解 3】【高通藍牙hal主要流程介紹-上】

1. 背景 本節主要討論 高通 藍牙 hal 中,的一些流程。 看看你是否都清楚如下問題: 高通芯片電如何控制?串口是在哪里控制的?固件如何下載?初始化流程是怎么樣的? 如果你已經對上述討論的問題&#xff0c…

JavaEE 初階文件操作與 IO 詳解

一、文件操作基礎:File 類 作用:操作文件或目錄(創建、刪除、獲取信息)。 核心方法: exists():文件是否存在createNewFile():創建新文件mkdir():創建目錄delete():刪除…

C++(27): 標準庫 <iterator>

目錄 1. 核心概念 2. 基本語法 3. 特點 4. 特有成員函數與工具 5. 內存與性能 6. 示例代碼 7. 成員函數與類型 8. 使用場景 9. 注意事項 1. 核心概念 迭代器(Iterator) 是 C++ 中用于訪問和遍歷容器元素的通用接口,類似于指針,但支持更豐富的操作。 抽象訪問機制:…

談談 Kotlin 中的構造方法,有哪些注意事項?

在 Kotlin 中,構造方法分為主構造方法(Primary Constructor)和次構造方法(Secondary Constructor)。 1 主構造方法 主構造方法是類的核心構造方法,直接在類頭聲明,位于類名之后。 1.1 基本語…

年會招標抽獎活動軟件———仙盟創夢IDE

年會是企業一年的總結與歡慶時刻,而抽獎環節更是點燃全場氣氛的關鍵。如何讓抽獎環節既大氣又充滿儀式感?選對抽獎軟件至關重要!本文精心挑選了 3 款兼具實用性與氛圍感的年會抽獎軟件,從界面設計到功能特色,全方位為你…

安全軟件檢測進程異常行為-Postgresql應用執行異常指令whoami

文章目錄 環境癥狀問題原因解決方案 環境 系統平臺:UOS(海光) 版本:4.5.8 癥狀 數據庫安裝包: 安全軟件告警中提示“sh -c whoami”命令,是由數據庫發出的,安全軟件捕獲到了postgres.exe–fo…

車載診斷架構 --- LIN 節點 ECU 故障設計原則

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 鈍感力的“鈍”,不是木訥、遲鈍,而是直面困境的韌勁和耐力,是面對外界噪音的通透淡然。 生活中有兩種人,一種人格外在意別人的眼光;另一種人無論…

GPU加速的AlphaFold3蛋白質復合體預測:如何在64GB顯存下跑超大規模模型(混合精度+模型并行實戰技巧)

一、AlphaFold3的超大規模挑戰與優化方向 AlphaFold3作為當前生物計算領域的革命性工具,其核心架構基于擴散模型,能夠預測包含蛋白質、核酸、小分子配體等復雜生物復合物的三維結構。然而,模型參數量級(典型配置超百億級&#xf…

Qt功能區:Ribbon控件

控件 1. 按鈕1.1 多選按鈕1.2 2. 下拉列表框SARibbonComboBox2.1 簡介2.2 代碼實現 1. 按鈕 1.1 多選按鈕 軟件功能:用于實現Category的名稱居中。 SARibbonCheckBox繼承于QCheckBox,使用方法完全相同。 SARibbonCheckBox* checkBox new SARibbonChe…

一個由微軟開源的 Python 工具,用于將多種文件格式轉換為 Markdown 格式

📚 Markitdown 由微軟開源的 Python 工具,用于將多種文件格式轉換為 Markdown 格式 支持:PDF、PowerPoint、Word、Excel、圖像、音頻、HTML、文本格式(CSV、JSON、XML)、ZIP 文件的轉換。 它旨在提供一個簡單且靈活的…

Linux的進程概念

目錄 1、馮諾依曼體系結構 2、操作系統(Operating System) 2.1 基本概念 2.2 目的 3、Linux的進程 3.1 基本概念 3.1.1 PCB 3.1.2 struct task_struct 3.1.3 進程的定義 3.2 基本操作 3.2.1 查看進程 3.2.2 初識fork 3.3 進程狀態 3.3.1 操作系統的進程狀態 3.3…

export和import的書寫方式

一、導出模塊(export) 1. 命名導出(Named Exports) // math.js export const PI 3.14159; // 導出單個常量 export function sum(a, b) { return a b; } // 導出單個函數 export class Calculator { /* ..…

HOW - 結合 AI 進行 Tailwind 樣式開發

文章目錄 情況 1:使用 Tailwind CSS 與手寫傳統 CSS 的開發效率對比情況 2:AI Tailwind 自動生成 UI 的效率如何?總結 在 WHAT - Tailwind 樣式方案(不寫任何自定義樣式) 中我們已經簡單介紹過 Tailwind。今天主要認識…

java面試每日一背 day1

1.什么是緩存穿透 緩存穿透是指查詢一個數據庫中根本不存在的數據,導致這個查詢請求繞過緩存直接訪問數據庫的情況。這種情況如果頻繁發生,會對數據庫造成不必要的壓力。 典型特征: (1)查詢的數據在數據庫和緩存中都…

ngx_http_realip_module 模塊概述

一、使用場景 日志記錄 記錄真實客戶端 IP 而非反向代理的 IP,有助于流量分析和安全審計。訪問控制 基于真實 IP 實現防火墻規則(allow/deny)或限流,而非誤將上游 IP 視為客戶端。GeoIP、WAF、限速等功能 模塊化的上游真實 IP 支…