這篇博客主要講有關於視頻壓縮的問題,解決視頻文件太大,不便於下載,占用存儲空間過大等問題,在縮小視頻大小的同時,保證視頻的觀看質量。主要講以下幾點:
1、壓縮視頻工具ffmpeg
2、壓縮視頻的技術參數
3、視頻如何壓縮
一、壓縮視頻工具ffmpeg
下載ffmpeg鏈接:https://ffmpeg.zeranoe.com/builds/;
安裝步驟一: 可以根據你的電腦選擇64位或者32位,下載下來的是個壓縮文件,用解壓文件解壓就可以了,我是安裝在C盤,如圖:
步驟二:配置環境,右擊“我的電腦”----->屬性,然后如圖所示:
步驟三:在cmd下,查看是否安裝成功
二、壓縮視頻的技術參數
1、我們先來了解下壓縮視頻參數(查看這些壓縮視頻參數,可以用mediainfo軟件打開視頻文件,就可以看到各種參數如截圖所示,以視頻3.mp4為例):
2、在上述截圖中可以看到3.mp4視頻音頻部分的位深度沒有顯示,這里我用軟件Adobe Audition打開3.mp4視頻,可以看到音頻部分的位深度是16bit
2、技術參數解釋
視頻尺寸:指的就是視頻的分辨率,常見的分辨率有4096*2304,1920*1080,720*576等。
視頻編碼:視頻編碼方式就是指通過特定的壓縮技術,將某個視頻格式的文件轉換成另一種視頻格式文件的方式。視頻編碼格式常見到的有:MPEG-2 TS、Divx、Xvid、H.264、WMV-HD和VC-1。
音頻編碼:音頻編碼方式指通過特定的壓縮技術對音頻數據進行處理的方法。
幀率:幀率(即視頻更新率)是用於測量顯示幀數的量度。測量單位為“每秒顯示幀數”(Frame Per Second,FPS,幀率)或“赫茲”,單位用FPS用來描述視頻每秒播放多少幀,而單位用赫茲用來描述顯示器的畫面每秒更新多少次。 一般幀率越高,視頻畫面越流暢。
比特率:指每秒傳送的比特(bit)數,即每秒傳輸的文件大小。比特率規定使用“比特每秒”(bit/s 或 bps)為單位。比特率越高,每秒傳送的數據越大。
采樣率:采樣率的單位是Hz,表示每秒采樣的次數。單位時間內取樣率越大,精度就越高,處理過的視頻文件就越接近沒有處理過的視頻文件。
碼率:碼率就是數據傳輸時單位時間傳送的數據位數,一般我們用的單位是kbps即千位每秒。碼率與體積成正比:碼率越大,體積越大;碼率越小,體積越小。由於文件體積與取樣率是成正比的,所以幾乎所有的編碼格式都想用最低的碼率達到最少的失真,“碼率”就是失真度,碼率越高越清晰,反之則畫面粗糙而且馬賽克多。
視頻部分的位深度:用於指定圖像中的每個像素可以使用的顏色信息數量,用“位即bit”為單位。
音頻部分的位深度:單個聲道的采樣數據大小
Audio部分聲道:指聲音在錄制或着播放的時候在不同空間位置采集或回放的相互獨立的音頻信號,所以聲道數量也就是聲音錄制時的音源數量或回放時相應的揚聲器數量。
(1)關於Audio部分碼率的計算公式:
碼率(位/秒)=采樣率(HZ)* 采樣位深度(bit)* 聲道數量
論證"碼率(位/秒)=采樣率(HZ)* 采樣位深度(bit)* 聲道數量"公式的正確性:
1)量綱分析來看:
HZ * bit=bit/s,驗證公式不是錯的
2)從理論上看:
碼率是每秒傳輸的信息大小;
采樣率是每秒采樣的次數;采樣位深度是單個聲道的每次采樣數據大小;
(采樣率*位深度)指的就是音頻部分單個聲道每秒傳輸的數據大小;
然后兩個聲道傳輸的信息大小=單個聲道傳輸的數據大小 * 聲道數 ;
由此得出:Audio部分碼率=采樣率(HZ)* 采樣位深度(bit)* 聲道數量。
3)以一個未被壓縮的音頻文件為例,驗證公式是否正確。
Audio部分碼率碼率=采樣率* 采樣位深度* 聲道數量=44.1KHZ * 16bit * 32= 1411.2 Kbps,與圖中碼率結果相符合,驗證公式正確 。
(2)Video部分碼率的計算公式
碼率(位/秒)= 屏幕顯示分辨率(無單位) * 彩色位數(位)* 幀率(幀數/秒等同於HZ)
1)量綱分析來看:
位/秒 = 位 * HZ ,驗證公式不是錯的。
2)從理論上看:
幀是指視頻中的圖像;
幀率是指每秒顯示的圖像數;
視頻部分的位深度是用於指定圖像中的每個像素可以使用的顏色信息數量;
一張圖像的像素總數等於畫面寬度像素數乘以畫面高度像素數的乘積;
像素是圖像信息大小的最小單位;
所以,一張圖片的信息大小=屏幕顯示分辨率(畫面寬度像素數*畫面高度像素數)* 位深度;每秒顯示的圖像信息量大小即碼=一張圖片的信息大小 * 幀率。從而驗證了公式“Video部分碼率= 屏幕顯示分辨率 * 彩色位數* 幀率”是正確的。
(3)關於視頻大小的計算公式:
Audio部分文件大小=Audio部分碼率* 視頻播放的總時間
Video部分文件大小=Video部分碼率* 視頻播放的總時間
整個視頻 文件大小=(Audio部分碼率+Video部分碼率)* 視頻播放的總時間
(注意:上述(1)(2)公式適用於不被壓縮的視頻文件。(3)公式都適用未被壓縮和壓縮過的視頻文件)
三、視頻如何壓縮
1、對於壓縮.mp4視頻體積,壓縮以后視頻的效果:在不改變視頻尺寸(分辨率不變)、視頻和音頻編碼不變(視頻格式不變,所以這兩個編碼不變)、幀率不變(保證畫面連貫度,所以幀率不變)的情況下,通過改變比特率,使得視頻文件體積變小,不影響畫面和聲音質量,保證眼睛和耳朵感受不到很大差別。
3、如何設置參數呢?
一般, 在壓縮視頻的時候,幀率參數都不改變,原視頻幀率是多少就是多少。碼率影響體積,與體積成正比:碼率越大,體積越大;碼率越小,體積越小。
如何設置壓縮的比特率呢?
壓縮視頻的音頻部分的碼率和視頻部分的碼率大小相比較來說,音頻部分的碼率可以忽略不計,所以視頻的比特率數值可以等同於視頻部分的碼率數值。讓視頻無卡頓的播放,設置的比特率要高於文件的讀入速度,此處以我的聯想電腦F盤為例,下載一個Parkdale軟件測試F盤test.mp4讀入速度,如圖所示:
4、設計實驗計算:以視頻源test.mp4為例,設置的比特率高於(磁盤讀寫速度平均值*8約等於500K,單位kbps),這里設置比特率數值為600K
1、壓縮的ffmpeg命令
參數解釋:
-i 輸入文件,后面跟的是文件的地址,如果test.mp4文件路徑和ffmpeg是在同一根目錄下,則直接輸入-i test.mp4。
-b 數據比特率,每秒傳輸的數據流量大小(kb/s),這個命令里設置的比特率是600k,用於指定視頻的壓縮程度,后面跟的是壓縮原視頻后的視頻存儲路徑。
2、原視頻和壓縮后視頻參數,截圖如下:
1是視頻體積大小,2是視頻的比特率,3是視頻的尺寸,4是幀率,從這兩個圖中我們可以看到視頻壓縮的參數比特率發生了變化,視頻體積變小了,壓縮后的視頻體積由碼率可以算出:約等於(時間*碼率/8=49*600/8=3.58MB),與實際壓縮后視頻大小有一定的誤差,因為audio的比特率忽略不計了。壓縮后的視頻比原視頻肯定有點區別,不過不影響觀看質量。