![如何使用 FFmpeg 從影片中間建立縮圖](https://rvso.com/image/1330228/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20FFmpeg%20%E5%BE%9E%E5%BD%B1%E7%89%87%E4%B8%AD%E9%96%93%E5%BB%BA%E7%AB%8B%E7%B8%AE%E5%9C%96.png)
有沒有辦法在 FFmpeg 中抓取影片縮圖?
我想抓取最中間的畫面作為影片並將其用作縮圖。影片長度未知。
指定縮圖尺寸的能力也會很有幫助。
答案1
一行命令:
ffmpeg -i input.mp4 -vcodec mjpeg -vframes 1 -an -f rawvideo -ss `ffmpeg -i input.mp4 2>&1 | grep Duration | awk '{print $2}' | tr -d , | awk -F ':' '{print ($3+$2*60+$1*3600)/2}'` output.jpg
子命令取得輸入影片的總時長
ffmpeg -i input.mp4 2>&1 | grep Duration | awk '{print $2}' | tr -d ,
並將其通過管道來awk
計算持續時間/2,如下所示
echo '00:01:30.000' | awk -F ':' '{print ($3+$2*60+$1*3600)/2}'
所以它給了 -ss 選項幾秒鐘的時間,就完成了。
如果您想要指定大小,請新增 -s 選項,例如 WxH,其中 W 和 H 是整數值(例如:-s 800x600 或 -s svga)或閱讀 ffmpeg 手冊頁以查看其他可用選項或格式。
答案2
這是一種使用的方法:
ffprobe
獲取持續時間bc
計算一半的持續時間ffmpeg
製作縮圖
例子:
input=input.mp4; ffmpeg -ss "$(bc -l <<< "$(ffprobe -loglevel error -of csv=p=0 -show_entries format=duration "$input")*0.5")" -i "$input" -frames:v 1 half.png
答案3
首先,請務必使用最新版本的 FFmpeg。
如果您可以存取 PHP,您的問題在 Stack Overflow 上得到了完美的解答:使用FFMpeg取得影片的中幀?
$output = shell_exec("/usr/local/bin/ffmpeg -i {$path}");
preg_match('/Duration: ([0-9]{2}):([0-9]{2}):([^ ,])+/', $output, $matches);
$time = str_replace("Duration: ", "", $matches[0]);
$time_breakdown = explode(":", $time);
$total_seconds = round(($time_breakdown[0]*60*60) + ($time_breakdown[1]*60) + $time_breakdown[2]);
shell_exec("/usr/local/bin/ffmpeg -y -i {$path} -f mjpeg -vframes 1 -ss " . ($total_seconds / 2) . " -s {$w}x{$h} {$output_filename}";
它要做的只是從 FFmpeg 的輸出中提取持續時間,並用它來確定中間幀的時間碼。
您可以輕鬆地將其適應其他 shell,只需插入以下命令,其中中間幀大約為534
秒:
ffmpeg -y -i input.mp4 -f mjpeg -vframes 1 -ss 534 thumbnail.jpg
您可以隨時更改大小-s 480x320
或 類似的大小,具體取決於您想要的大小,插入-i input.mp4
選項後的某個位置。
上面的解決方案有點不準確。它會立即給你一個結果,但你無法指定你想要的幀。如果您已經知道要提取的確切幀,請使用過濾器select
,例如使用幀編號12345
:
ffmpeg -i input.mp4 -filter:v select="eq(n\,12345)" -vframes 1 thumbnail.jpg
請注意,此命令可能需要一段時間,因為它需要跳到指定的幀才能提取它。
答案4
簡單的解決方案是:
ffmpeg -i l1.mp4 -ss 00:00:14.435 -vframes 1 out.png