多媒體開發(16):幀率與碼率的概念

為什么說音視頻開發入門較難,因為涉及到很多概念,之前還專門講“媒體格式”、“h264概念”的東西。現在又來,“幀率”跟“碼率”,這也是兩個常見的概念。你應該經常聽到“刷新的幀率是多少”或“碼率比較高所以網速要比較快”的表達吧。

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

(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),對應的視頻的效果是這樣的:
不同的采集幀率

你會感覺到,1秒拿一張圖,是會嚴重影響你看美女的心情的。

(2)碼率

碼率也叫比特率,是音頻或視頻在編碼壓縮時使用的概念。音視頻數據,最終用二制數(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去描述音頻或視頻數據。這里的知識點有點零散,適當地使用吧。


hello

posted on 2019-06-17 11:19 廣州小程 閱讀(...) 評論(...) 編輯 收藏

導航

統計

公告

四川金7乐历史开奖号码查询