1. 程式人生 > >多媒體開發(16):幀率與位元速率的概念

多媒體開發(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去描述音訊或視訊資料。這裡的知識點有點零散,適當地使用吧。


相關推薦

多媒體開發16位元速率概念

為什麼說音視訊開發入門較難,因為涉及到很多概念,之前還專門講“媒體格式”、“h264概念”的東西。現在又來,“幀率”跟“位元速率”,這也是兩個常見的概念。你應該經常聽到“重新整理的幀率是多少”或“位元速率比較高所以網速要比較快”的表達吧。 本文介紹音視訊的幀率與位元速率的概念。 (1)幀率 幀率,表示的是頻率

多媒體開發7編譯AndroidiOS平臺的FFmpeg

編譯FFmpeg,一個古老的話題,但我還是介紹一遍,就當記錄。之前介紹怎麼給視訊新增水印時,就已經提到FFmpeg的編譯,並且在編譯時指定了濾鏡的功能。 但是,在手機盛行的時代,你可能更需要的是能在iOS或Android平臺上執行的FFmpeg,而對於命令列的ffmpeg,你可以在個人電腦上面使用(因為它簡

多媒體開發3直播

特點 nss ams 測試的 方式 input cat nginx 成功 之前介紹了如何錄制音視頻,以及相關的多媒體的概念。對於已經錄制的多媒體進行“就地”播放(參考前文),就是回放,除了“回放”這個流程,還有一個流程也會經常遇到,那就是“直播”。 本文介紹直播的實現。 “

多媒體開發6濾鏡實現各種圖片效果 | Video-Filters | 變色

命令行 let img 很多 保持 yuv 黑白 多媒體 ati 之前講過使用FFmpeg的drawtext濾鏡(把圖片或文字加到視頻上),而實際上,FFmpeg的濾鏡很強大,遠不止加字幕或加圖片的功能。濾鏡是很有趣的,可以把圖片變模糊、變色、縮放旋轉,等等。 本文介紹FF

多媒體開發8調試FFmpeg

run 包括 啟用 return tar.bz2 %d 參考 efi turn 編譯FFmpeg得到二進制文件,之後就是對二進制庫的調用,這時FFmpeg就像一個黑盒子。作為程序員,難道不想研究一下FFmpeg的具體實現?比如是怎麽拿到歌曲信息的、怎麽解碼的、怎麽推流的,等

多媒體開發9聲音采集的概念 | 振幅 | 頻率 | 共振 | 電平化

坐標 波形 上下 樣本 形狀 多少 為什麽不使用 dsd 運動 之前介紹通過ffmpeg程序來錄制聲音或圖像,這個辦法是一個操作的過程,很少涉及到概念上的東西。 而本文,要介紹的是聲音采集的一些流程與概念。 聲音的采集流程與概念,是枯燥的,你如果不想了解的話,到這裏就可以退

多媒體開發10從視訊中提取圖片

小白:提取視訊中的圖片嗎?那很簡單,播放視訊再截圖就行啦。 播放視訊再截圖的做法,當然也可以。但是,手動地截圖會太累而且無法保證準確度,特別是需要反覆提取圖片時,或者需要提取“105秒那一瞬間的美女圖片”時,或者我需要每秒出一張圖片時,那有別的辦法嗎? 本文介紹,如何使用FFmpeg實現從視訊中提取圖片的

多媒體開發11Android平臺上裁剪m4a

Android手機上設定鈴聲的操作比較靈活,你聽到一首喜歡的歌曲,馬上就可以對這首歌曲進行裁剪,裁剪到片段後,再通過系統的介面設定為鈴聲(電話鈴聲、鬧鐘鈴聲等)。前提是,播放這首歌的APP,需要提供裁剪歌曲的功能。 那麼,怎麼樣實現擷取音訊檔案的功能呢? 基於之前的介紹,你可能很自然就想到使用FFmpeg命令

多媒體開發12解碼aac到wav檔案

簡單來說,aac是一種音訊編碼格式,需要解碼後才能用於音訊輸出。aac編碼格式,已經是一種很常見的音訊編碼格式,以至於很多系統都支援aac的編解碼,比如iOS上的AudioConverterRef介面、Android上的MediaCodec介面等。 但是,不要以為用了系統的介面就是用了硬體解碼,因為,這個系統

多媒體開發14媒體格式的概念

之前講了一些音視訊的錄製操作,還有聲音採集的概念。採集只是多媒體操作流程中的一個環節,更多的環節可以看看這個圖: 聲音或視訊採集後,就是編碼、寫檔案或推流。不管是編碼還是寫“檔案”,你都能找到相應的程式(比如FFmpeg)來完成,一般加上自己的業務程式碼就能實現自己的功能需求。那就沒有東西好說的了? 沒東

多媒體開發15H264的常見概念

H264,是你常見的技術術語了吧。 那h264是什麼東西呢? H.264是視訊編碼標準,又是標準,得標準得天下啊。 在術語的拼寫上,小程以能理解為準。 本文介紹H264的常見概念。 預警,本文相對枯燥,你可隨時放棄閱讀。 (1)H264從哪裡來? 之前介紹媒體格式的概念時,有提到過國際標準化組織(ISO)

多媒體開發18FFmpeg的常見結構體

除了之前講的avpacket跟avframe,FFmpeg還有其它一些結構經常在流程中出現。FFmpeg還有哪些常見的結構呢?先來看一下這個截圖: 這張圖中的主角,是AVFormatContext。AVFormatContext是FFmpeg的基本結構之一,對應於封裝格式(或容器格式)。 圍繞FFmpeg

多媒體開發2錄製視訊

上一節介紹了用ffplay來播放檔案(或url),這裡有一個概念,如果是播放已經存在的檔案,那叫“回放”,也就是Playback(從流媒體的角度也叫點播),如果播放的是正在錄製的資料(邊錄邊播),那叫直播。 不管是回放還是直播,都需要有媒體資料,那這個媒體資料是怎麼來的呢?從已有的檔案編輯而來是一個辦法,但

多媒體開發6用濾鏡實現各種圖片效果

之前講過使用FFmpeg的drawtext濾鏡(把圖片或文字加到視訊上),而實際上,FFmpeg的濾鏡很強大,遠不止加字幕或加圖片的功能。濾鏡很有趣,可以把圖片變模糊、變色、縮放旋轉,等等。 **本文介紹FFmpeg濾鏡的使用。目的是讓你感受一下FFmepg的濾鏡效果,這樣在實際需要某種效果時,可以考慮使用

多媒體開發8除錯FFmpeg

編譯FFmpeg得到二進位制檔案,之後就是對二進位制庫的呼叫,這時FFmpeg就像一個黑盒子。作為程式設計師,難道不想研究一下FFmpeg的具體實現?比如是怎麼拿到歌曲資訊的、怎麼解碼的、怎麼推流的,等等。 看原始碼是理解程式碼實現的一個辦法,而單步除錯能從另一個維度去幫到你。**本文介紹如何單步除錯FFm

多媒體開發9我是聲音

之前介紹通過ffmpeg程式來錄製聲音或影象,這個辦法是一個操作的過程,很少涉及到概念上的東西。而**本文,要介紹的是聲音採集的一些流程與概念。** 聲音的採集流程與概念,是枯燥的,但是,我也會盡量說一些有趣的現象來緩解這種枯燥。 聽得到的,或聽不到的聲音,抽象來說,都是模擬訊號,也可以形象一點,叫能量波

多媒體開發10提取圖片以及點陣圖儲存

> 小白:提取視訊中的圖片嗎?那很簡單,播放視訊再截圖就行啦。 播放視訊再截圖的做法,當然可以。但是,手動截圖會太累而且無法保證準確度,特別是需要反覆提取圖片時,或者需要提取“105秒那一瞬間的美女圖片”時,或者我需要每秒出一張圖片時,那有別的辦法嗎? **本文介紹,如何使用FFmpeg實現從視訊中

Android二維碼掃描開發實現思路原理

【 回覆“ 1024 ”,送你一個特別推送 】 現在二維碼已經非常普及了,那麼二維碼的掃描與處理也成為了Android開發中的一個必要技能。網上有很多關於Android中二維碼處理的帖子,大都是在講開源框架zxing用法,然後貼貼程式碼就完了,並沒有一個系統的分析和

Qt移動應用開發使用精靈圖片實現動畫

       上一篇博文講到了Qt Quick對於動畫的一般支援,動畫的形式多樣,配合不同的插值函式,可以幾乎實現所有想要的動畫效果,而對於遊戲的一些特殊的效果比如說幀動畫,Qt更是有專門的類來實現。下面我們就來看看Qt Quick中究竟是對幀動畫是如何實現的吧。 原

多媒體開發5&音訊特徵聲音可以調大一點嗎?

基本上,現在常用的聲音取樣辦法是pcm,而對於壓縮音訊的解碼,得到的也pcm資料。這個pcm資料,只是一堆數值,有正有負,看這個值看不出什麼花樣。 聲音採集,採的是什麼呢? 採的是聲音的強度變化,也是聲音這種能量的強弱變化,這種強弱用分貝來表示,即dB。所以,pcm資料跟這個dB就一定有關係,這個關係是這