爲何說音視頻開發入門較難,由於涉及到不少概念,以前還專門講「媒體格式」、「h264概念」的東西。如今又來,「幀率」跟「碼率」,這也是兩個常見的概念。你應該常常聽到「刷新的幀率是多少」或「碼率比較高因此網速要比較快」的表達吧。算法
本文介紹音視頻的幀率與碼率的概念。緩存
幀率,表示的是頻率,也就是在一段時間,操做的頻度。幀率的具體含義,須要分兩個場景來介紹,一個是採集時的場景,另外一個是顯示時的場景。這是視頻的概念(幀就是圖像的意思),聲音沒有「幀率」的概念,聲音「一秒鐘取多少個樣本」,對應的是「採樣率」。網絡
對於天然界的聲音或圖像來講,要轉換成爲計算機裏面的物件,採集是必須的。編碼
對於圖像的採集,通常以攝像頭或屏幕做爲輸入,按必定的規則拍攝圖片或截取圖片(小程以前介紹過錄制視頻的哇)。視頻
這個獲取圖片的規則中,有一項指標,能夠稱爲「取圖速度」。明顯,取圖越快,就越能把變化的細節捕捉到,但圖片的總數量也越多,若是這些圖片存放在磁盤或在網絡上傳輸,那存儲空間與佔用的帶寬就是要考慮的因素,而這個跟「取圖速度」有關。blog
「取圖速度」,通常用單位時間(好比一秒鐘)內取幾張圖來界定,也就是一秒鐘有多少幀,單位爲fps,好比「個人這個電影是25fps」,就是1秒內我取了25張圖。圖片
小程以前介紹「從視頻中提取圖片」時,傳給ffmepg的參數-r,就是一秒鐘拿幾張圖,也是「取圖速度」的概念,但這個是從已有視頻中提取,而不是從攝像頭或屏幕提取。開發
採集到圖片,通過編碼壓縮、存儲或傳輸、解碼,最終被展現出來。同步
展現圖片時,也有一些展現的規則,這些規則中有一項指標,能夠稱爲「畫圖速度」。it
「畫圖速度」,就是一秒畫出幾張圖,單位一樣爲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),對應的視頻的效果是這樣的:
你會感受到,1秒拿一張圖,是會嚴重影響你看美女的心情的。
碼率也叫比特率,是音頻或視頻在編碼壓縮時使用的概念。音視頻數據,最終用二制數(bit)來表示,1秒鐘的數據量,就是碼率。單位爲bps,或者kbps,好比「我用128kbps來編碼mp3文件」。
1秒鐘的比特量越多,能表達的細節就越多(好比聲音的高頻段信息等),佔用的磁盤空間越大,若是傳輸則佔用的帶寬也越大。
碼率涉及兩個信息,一個是壓縮率,另外一個是傳輸方面。從壓縮的角度,壓縮算法決定碼率與質量;從傳輸角度來看,碼率表示我1秒鐘要表達這麼多bit,若是你網絡在1秒鐘內不能傳輸這麼多bit(好比要下1秒才能傳遞完),那播放就必定會卡頓(沒有緩存處理的狀況下),而能不能傳輸這麼多bit,跟帶寬直接相關。好比128kbps的歌曲,就要求你的帶寬達到128kbps,對應網速就是16KB/s,若是16K都達不到,那你聽歌都會卡。
一樣,這裏演示一下,用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去描述音頻或視頻數據。這裏的知識點有點零散,適當地使用吧。