簡體   English   中英

使用ffmpeg在間隔的第一幀中每分鍾生成縮略圖

[英]Using ffmpeg to generate thumbnails every minute at the first frame in the interval

當然,分鍾可能會有所不同(例如30秒或2分鍾),但問題的邏輯保持不變。 我目前有三種解決方案,各有其缺點。

我的第一個解決方案使用fps選擇,如下所示:

ffmpeg -i <input> -vf scale=320:-1,fps=1/60 "img%04d.jpg"

這一次通過了視頻,但是選擇的幀不是每60秒的第一幀,而是中間的幀。 這樣會在0:30 : 1:30 : 2:30 ...等等生成幀。

我的第二個解決方案通過bash計算縮略圖的數量,並使用ss選項以手動查找並檢索縮略圖:

#durRaw: interval in seconds (this case: 60)
#end: the end index for the number of thumbnails needed
for t in $(seq 0 $end)
do
    local time=$(bc -l <<< "(( $t * $durRaw ))")
    ffmpeg -i <input> -ss $time -vframes 1 -vf scale=320:-1 "img$(printf "%04d" $t).jpg"
done

這樣會產生准確的幀,但會讀取過多的視頻 ,因為通常必須遍歷整個視頻30-60次才能生成必要的縮略圖。

最后,我的第三個解決方案恰好是快速而准確的,但是隨着視頻的進行,質量會下降(偽影將開始變得可見,文件大小將下降到可比較文件的25%)。 我知道視頻是按比例縮放的,但是質量下降得比我縮放的幅度還要大。 我使用了select過濾器,並將幀速率計算輸入到其中:

getFrameRate() {
    ffmpeg -i "$1" 2>&1 | sed -n "s/.*, \(.*\) fp.*/\1/p"
}
local fr=$(getFrameRate <input>)
local sel=$(bc -l <<< "(( $fr * $durRaw ))") #in actual code, sel is floored
ffmpeg -i <input> -vf "scale=320:-1,select='not(mod(n,$sel))',setpts='N/($fr*TB)'" "img%04d.jpg"

在此處輸入圖片說明

如果沒有某種巨大的缺點,我似乎無法生成縮略圖。 由於我需要運行大量的視頻,因此解決方案2(雖然是最佳的)將需要數周的時間才能真正完成對所有所需視頻的處理。 如果不涉及降級,則解決方案3將是理想的選擇,並且在線指南似乎都指向我嘗試過的相同解決方案。 簡而言之,我需要能夠在不無故損失畫質的情況下,相當快地(也就是一次通過)生成縮略圖。

在輸入( -i )之前使用解決方案#2中的-ss參數,以便更快地讀取輸入。 作為摘錄:

之前的ss

輸入將使用關鍵幀進行解析,這非常快

ss之后:

在這里,輸入將被解碼(並丟棄),直到到達-ss給定的位置。 這將非常緩慢地完成

https://trac.ffmpeg.org/wiki/Seeking

花費的時間從幾分鍾/小時到毫秒/秒。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM