1. 程式人生 > >幀率與碼率的概念

幀率與碼率的概念

幀率 碼率

音視頻有許多概念,幀率跟碼率,是其中兩個常見的概念。

讀者經常會聽到“刷新的幀率是多少”或“碼率比較高所以要求網速要比較好”等表達。

本文介紹音視頻的幀率與碼率的概念。

小程之前還介紹了音視頻的其它概念,讀者可以關註“廣州小程”微信公眾號,並在“音視頻->基礎概念與流程”菜單項中查閱相關的文章。

(1)幀率

幀率,表示的是頻率,也就是在一段時間,操作的頻度。

幀率的具體含義,需要分兩個場景來介紹,一個是采集時的場景,另一個是顯示時的場景。

(a)采集時

對於自然界的聲音或圖像來說,要轉換成為計算機裏面的物件,采集是必須的。

對於圖像的采集,一般以攝像頭或屏幕作為輸入,按一定的規則拍攝圖片或截取圖片(小程之前介紹過錄制視頻,讀者可以參考這篇文章)。

這個獲取圖片的規則中,有一項指標,可以稱為“取圖速度”。明顯,取圖越快,就越能把變化的細節捕捉到,但圖片的總數量也越多,如果這些圖片存放在磁盤或在網絡上傳輸,那存儲空間與占用的帶寬就是要考慮的因素,而這個跟“取圖速度”有關。

“取圖速度”,一般用單位時間(比如一秒鐘)內取幾張圖來界定,也就是一秒鐘有多少幀,單位為fps,比如“我的這個電影是25fps”,就是1秒內我取了25張圖。

小程之前介紹“從視頻中提取圖片”時,傳給ffmepg的參數-r,就是一秒鐘拿幾張圖,也是“取圖速度”的概念,但這個是從已有視頻中提取,而不是從攝像頭或屏幕提取。

(b)顯示時

采集到圖片,經過編碼壓縮、存儲或傳輸、解碼,最終被展示出來。

展示圖片時,也有一些展示的規則,這些規則中有一項指標,可以稱為“畫圖速度”。

“畫圖速度”,就是一秒畫出幾張圖,單位同樣為fps。

同樣,在源圖片連續的情況下,如果畫得越快,理論就越平滑。但是,畫得越快,就越費勁,甚至根本就沒有能力畫得那麽快。

到底“畫圖速度”要多快,要看你的目的與實際能力。一般理想的效果是,既讓圖片展示得平滑,又讓顯示組件不太忙。

小白:那麽,多少fps,才算是平滑?

小程:得看內容變化的情況,如果不經常運動的,那15fps都可能夠用了;如果運動劇烈的,那就要畫得更快一些,比如30fps、60fps或更高。當然,前提是,采集到的是平滑的。

畫得太慢或畫得太快,會導致什麽問題?這個跟代碼邏輯有關。一般來說,對於視頻,有聲音跟圖像,那就要考慮聲畫同步的問題,其中一個實現邏輯,可以用聲音為主,圖像落後於聲音的pts就渲染圖片,否則就等待,如果按這樣的邏輯,那麽,畫得太慢就會出現圖像跟不上聲音的問題,畫得太快則問題不大(只是多一些判斷的執行)。如果是其它處理邏輯,則要具體問題具體分析。

總的來說,采集時的“取圖速度”以及顯示時的“畫圖速度”,就叫幀率。

一般來說,如果說一個視頻的幀率,那指得是采集時的幀率。

小白:我可以這一秒15fps,一下秒就變成30fps嗎?

小程:這個叫動態幀率(vfr),不在這裏展開了。

接下來,小程演示一下如何改變視頻的幀率。

這裏用FFmpeg來改變視頻的幀率。對於FFmpg的安裝與使用,讀者可以參考小程之前介紹的文章。

幀率更改前,是這樣的:
技術分享圖片

使用ffmepg命令來修改幀率,更改為1fps(類似於采集,1秒鐘拿一張圖):

ffmpeg -i moments.mp4 -y -r 1 moments_1fps.mp4

幀率更改後,是這樣的:
技術分享圖片

然後,這兩個不同的采集幀率(左邊1fps,右邊25fps),對應的視頻的效果是這樣的:
技術分享圖片

(2)碼率

碼率也叫比特率,是在編碼壓縮時使用的概念。音視頻數據,最終用二制數(bit)來表示,1秒鐘的數據量,就是碼率。單位為bps,或者kbps,比如“我用128kbps來編碼mp3文件”。

1秒鐘的比特量越多,能表達的細節就越多(比如聲音的高頻段信息等),占用的磁盤空間越大,如果傳輸則占用的帶寬也越大。

這裏演示一下,用ffmepg命令來更改碼率

碼率更改前,是這樣的:
技術分享圖片

用ffmpeg命令修改碼率

ffmpeg -i moments.mp4 -y -b:v 50K -b:a 0K moments_50k_br.mp4

碼率更改後,是這樣的:
技術分享圖片

兩個不同碼率(左50kbps,右388kbps),對應視頻的播放效果是這樣的:
技術分享圖片

可以看到,左邊的非常模糊,甚至出現了馬賽克,因為碼率太小,壓縮得太嚴重了。

最後,說一下文件大小與碼率的關系。

文件大小 = 碼率 * 時長。這個適用於固定碼率的情況,碼率為總的碼率(音頻+視頻+其它)。一般可以根據這個公式,推算出音視頻的時長。

同樣,可以用ffmpeg命令來修改文件大小(從頭截取一段):

ffmpeg -i moments.mp4 -y -fs 100K moments_fs_100k.mp4


總結一下,本文介紹了幀率與碼率的概念。幀率,一般反映了采集時采集的速度;碼率,是編碼時的概念,反映了單位時間內用多少bit去描述音頻或視頻數據。

幀率與碼率的概念