如何將影片的大小減小到目標大小?
我想減小影片的大小,以便能夠通過電子郵件等方式發送。我看了這個問題:如何使用 ffmpeg 減小影片的大小?在那裡我得到了關於如何減少它的好建議。問題是我需要手動計算比特率。而且在這樣做的時候,我必須通過手動試驗和錯誤來完成。
有沒有什麼好的方法可以使用
ffmpeg
(或其他工具)將影片的大小減小到目標大小?由於frostschutz 的評論,請注意:
無論影片長度/解析度/幀速率/內容如何,過於擔心大小並追求固定的文件大小在大多數情況下都不會產生令人滿意的結果……將其上傳到某個地方,通過電子郵件發送連結。如果您必須對其進行編碼,請設置質量級別,保持比特率動態。如果明顯無法滿足大小,請取消編碼並相應地調整質量級別。沖洗並重複。
一般來說,這是個好建議,但它不適合我的案例。由於技術限制,上傳到外部連結不是一種選擇,其中之一是接收者沒有 http 訪問權限。
我還可以澄清一下,我並不是在尋找我指定的尺寸。如果它與我想要的相當接近(可能最多降低 5% 或 10% 左右)就足夠了,但應該保證它不會超過我的目標限制。
@philip-couling 的答案很接近,但缺少幾部分:
- 所需的 MB 大小需要乘以 8 才能獲得比特率
- 對於比特率,1Mb/s = 1000 kb/s = 1000000 b/s;乘數不是 1024(還有另一個前綴 KiB/s,即 1024 B/s,但 ffmpeg 似乎沒有使用它)
- 截斷或舍入非整數
length
(而不是精確使用或舍入)將導致文件大小略微超過目標大小- 該
-b
標誌指定平均比特率:實際上,編碼器會讓比特率跳躍一點,結果可能會超出您的目標大小。但是,您可以使用-maxrate
和指定最大比特率-bufsize
對於我的案例,我還想要一個硬編碼的音頻比特率,並相應地調整影片(這似乎也更安全,我不是 100% 確定 ffmpeg 的
-b
標誌是否指定了影片和音頻流的比特率)。考慮到所有這些並嚴格限制為 25MB:
file="input.mp4" target_size_mb=25 # 25MB target size target_size=$(( $target_size_mb * 1000 * 1000 * 8 )) # target size in bits length=`ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file"` length_round_up=$(( ${length%.*} + 1 )) total_bitrate=$(( $target_size / $length_round_up )) audio_bitrate=$(( 128 * 1000 )) # 128k bit rate video_bitrate=$(( $total_bitrate - $audio_bitrate )) ffmpeg -i "$file" -b:v $video_bitrate -maxrate:v $video_bitrate -bufsize:v $(( $target_size / 20 )) -b:a $audio_bitrate "${file}-${target_size_mb}mb.mp4"
請注意,當限制最大比特率時
-maxrate
,-bufsize
平均比特率必然會更低,因此在我的測試中,影片將低於目標大小多達 5-10%(在各種目標大小的 20 秒影片上)。的值-bufsize
很重要,上面使用的計算值(基於目標大小)是我最好的猜測。太小,它會大大降低質量並低於目標大小 50%,但太大,我認為它可能會超過目標大小?如果您沒有嚴格的最大文件大小,為了給編碼器更大的靈活性,刪除
-maxrate
和-bufsize
將導致更好的質量,但在我的測試中可能會導致影片超出目標大小 5%。文件中的更多資訊,您將在其中看到此警告:注意:如果影片難以編碼,則限制比特率可能會導致低質量輸出。在大多數情況下(例如儲存文件以供存檔),讓編碼器選擇適當的比特率是恆定質量或基於 CRF 的編碼。