前言
在摸索一段時間的音視頻開發后,越來越發現這個坑的深度真是特別的深. 除了了解Android自帶的音視頻處理API以外,還得了解一些視頻與音頻方面的知識.這篇博客就是主要講解這方面的專業術語.內容較多,如果你需要進行音視頻開發是必需靜下心來了解這些.
術語目錄
- MIME類型
- 分辨率
- sample-rate采樣率
- bitrate比特率
- frame-rate幀速率
- capture-rate捕獲率
- Data Rate碼率
- 視頻編碼格式/解碼格式
- 音頻編碼格式/解碼格式
MIME類型
MIME是什么?截取一段百度百科的解釋,偷偷懶...


MIME類型跟音視頻開發有什么關聯?
有些小伙伴在了解過MIME下一個疑問肯定是這個.
首先在Android開發中我們可以通過MediaExtractor方法獲取到多媒體文件MIME的類型.其中的各種 video/avc video/mp4v-es 格式是我們在開發音視頻中一直需要時刻關注的東西.如果你的項目對視頻格式要求嚴格,那么就需要在這方面做很多文章.
其次重點!視頻文件,其實是圖像文件與音頻文件合並的一個文件.所以它會包含2個甚至多個MIME類型.圖像一個類型音頻一個類型,如果多聲道可能還會有多個音頻.這時候你就明白了MIME的主要作用,就是在視頻文件多個管道里找到圖像類型的管道,將圖像的流與音頻剝離開.這樣你就可以獲得純圖像的流了. 看如下代碼,獲取一個視頻里的MIME類型:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_media_extractor); mFile = new File(getExternalCacheDir(),"demo.mp4"); mediaExtractor(); } private void mediaExtractor(){ try { MediaExtractor extractor = new MediaExtractor(); extractor.setDataSource(mFile.getAbsolutePath()); for (int i = 0; i < extractor.getTrackCount(); i++){ MediaFormat mediaFormat = extractor.getTrackFormat(i);//獲取多媒體格式 String mimeFormat = mediaFormat.getString(MediaFormat.KEY_MIME);//獲取MIME格式內容 Log.e(TAG, "mediaExtractor: mimeFormat="+mimeFormat); } } catch (IOException e) { e.printStackTrace(); } }
最終結果:
2019-07-19 21:12:14.021 13202-13202/demo.yt.com.demo E/測試Demo: mediaExtractor: mimeFormat=video/mp4v-es
2019-07-19 21:12:14.023 13202-13202/demo.yt.com.demo E/測試Demo: mediaExtractor: mimeFormat=audio/3gpp
我們可以看到這個叫demo.mp4的文件,包含了2個通道,分別是視頻的MP4與音頻的3gpp
分辨率
分辨率則是單位英寸中所包含的像素點數,分辨率也是視頻的尺寸(寬高).分辨率越高視頻就越清晰,並且視頻尺寸就會越大.
以上是很簡單的描述,但是也足夠描述清楚分辨率的知識了,但是肯定有很多人會有一些誤區,下面我們來一一解答你可能理解錯誤的誤區.
為什么我分辨率高了,視頻還是不清晰? ---設備屏幕原因
視頻的分辨率高的確是視頻是否清晰的重要標准,但是別忘記了你的播放設備屏幕是否支持這么高的分辨率?否則就是視頻分辨率再高屏幕不支持,你依然無法看到高清視頻.
為什么我分辨率高了,視頻還是不清晰? ---比特率原因
視頻是否清晰,可不是只有分辨率一個屬性決定的,其中也包括比特率.當然比特率將在下面講解.比特率低你的分辨率再高也沒有用.
明明我的視頻是低分辨率,但是播放起來尺寸還是很大! 有一些高分辨率的視頻為什么播放起來這么小啊?
尺寸問題.我在上面說到分辨率等於視頻的尺寸, 但是所有的播放器(包括你以后可能自己寫的視頻播放器),都需要重新適配視頻的播放大小.你想想你拿一個1920*1080的視頻到一個1280*720的設備上播放,屏幕怎么可能放的下你的視頻.所以需要改變你的視頻播放尺寸,按照比例改變了播放大小尺寸不等於壓縮了視頻分辨率.另外這里引入2個分辨率概念的理解分別是:
1.屏幕分辨率
設備的屏幕的尺寸與屏幕的分辨率無關,這里拿蘋果手機舉例子.以前的iPhone4的手機屏幕很小,但是又是十分清晰.原因是,在一英寸下iPhone4手機的屏幕塞入了更多更小的像素點.就可以讓畫面更加的清晰,但是尺寸依然還是這么小.
2.視頻分辨率
視頻的分辨率就是等於視頻的尺寸大小,如果你要看到一個視頻的真實尺寸,你只能找到一個對應寬高尺寸的設備來播放.否則,你看到的永遠是播放器處理按比例縮小過的視頻.
在音視頻開發上,我應該注意分辨率的那些東西?
在音視頻開發上,對分辨率的處理永遠是比例適配的難題.因為,我們的手機設備屏幕就這么大,不可能完整顯示視頻.所以需要調整我們播放視頻View的大小,而View的大小是需要按照分辨率的比例進行縮小或者放大的.不按照比例縮小放大,那么你播放的視頻肯定就會出現拉伸或者變形的情況.(關於比例適配的粗淺算法,在我的博客音視頻開發分類里有介紹)
其次,如果你想要壓縮視頻,對按比例縮小分辨率是一個錯誤的方向,因為分辨率的縮小是最毫無保留的壓縮視頻的方法.壓縮后的視頻在播放的時候會需要讓視頻放大,但是放大后的視頻會顯得更加模糊.所以,個人認為視頻最好別修改分辨率來壓縮視頻. 因為還有其他更好的選擇.
sample-rate采樣率
連續信號在時間(或空間)上以某種方式變化着,而采樣過程則是在時間(或空間)上,以T為單位間隔來測量連續信號的值。T稱為采樣間隔。在實際中,如果信號是時間的函數,通常他們的采樣間隔都很小,一般在毫秒、微秒的量級。采樣過程產生一系列的數字,稱為樣本。樣本代表了原來的信號。每一個樣本都對應着測量這一樣本的特定時間點,而采樣間隔的倒數,1/T即為采樣頻率,fs,其單位為樣本/秒,即赫茲(hertz)。
通俗的講采樣頻率是指計算機每秒鍾采集多少個信號樣本,比如聲音信號,此時采樣頻率可以是描述聲音文件的音質、音調,衡量聲卡、聲音文件的質量標准。采樣頻率越高,即采樣的間隔時間越短,則在單位時間內計算機得到的樣本數據就越多,對信號波形的表示也越精確。采樣頻率與原始信號頻率之間有一定的關系,根據奈奎斯特理論,只有采樣頻率高於原始信號最高頻率的兩倍時,才能把數字信號表示的信號還原成為原來信號。在數字音頻領域.
采樣率類似於動態影像的幀數,比如電影的采樣率是24赫茲,PAL制式的采樣率是25赫茲,NTSC制式的采樣率是30赫茲。當我們把采樣到的一個個靜止畫面再以采樣率同樣的速度回放時,看到的就是連續的畫面。同樣的道理,把以44.1kHZ采樣率記錄的CD以同樣的速率播放時,就能聽到連續的聲音。顯然,這個采樣率越高,聽到的聲音和看到的圖像就越連貫。當然,人的聽覺和視覺器官能分辨的采樣率是有限的,基本上高於44.1kHZ采樣的聲音,絕大部分人已經覺察不到其中的分別了。
而聲音的位數就相當於畫面的顏色數,表示每個取樣的數據量,當然數據量越大,回放的聲音越准確,不至於把開水壺的叫聲和火車的鳴笛混淆。同樣的道理,對於畫面來說就是更清晰和准確,不至於把血和西紅柿醬混淆。不過受人的器官的機能限制,16位的聲音和24位的畫面基本已經是普通人類的極限了,更高位數就只能靠儀器才能分辨出來了。比如電話就是3kHZ取樣的7位聲音,而CD是44.1kHZ取樣的16位聲音,所以CD就比電話更清楚。
bitrate比特率
比特率是指每秒傳送的比特(bit)數。單位為 bps(Bit Per Second),比特率越高,傳送的數據越大,音質越好.比特率 =采樣率 x 采用位數 x聲道數.
關於比特率(比特率在音頻或者視頻領域也稱為碼率)的計算,比如,采樣率為44.1KHz,以16bit采樣,聲道數為2,那么它的音頻比特率的計算為:44100*16*2 = 1411200 bps = 1378 kbps,然后我們在除以8,將bit轉化為Byte,所以1秒鍾的數據量就是:1411200/8 = 176400 個字節(B)。
另外,比特率是我們音視頻開發的重要處理對象.比特率的大小關系着文件的大小,當我們需要壓縮一個視頻文件的時候,首先考慮的就是降低比特率.
比特率降低會出現什么效果?
降低比特率,會讓視頻丟失一些像素點的值,而這個時候這個丟失值的像素點會去周圍的的像素點上取到相識顏色的值.在一個較高的比特率下,如果我們一步步的壓縮比特率就觀察到畫面的一些變化之處.
首先,降低一些比特率可能會導致視頻的銳度上升(銳度越高畫面線條和邊界越明顯).在播放視頻的時候因為視頻已經丟失了一些像素點,而一些黑色線條上的灰色部分顏色值丟失后就會向周圍的像素點取值,這個時候會取到黑色的值.就出現畫面中黑色線條更加明顯銳度上升的情況.
然后,我們繼續降低更多比特率,繼續降低比特率會導致丟失的顏色值的像素點更多,這個時候視頻的線條與邊界反而會開始模糊,銳度瞬間下降.因為線條的像素點已經開始丟失顏色值了,在播放視頻的時候他們會向周圍的色塊取中間值,這個時候你會發現線條模糊,畫面模糊.
在繼續,降低更更更更多的比特率,哎,視頻已經丟失了大塊大塊的像素點顏色值,在播放視頻的時候某些殘留的像素點將會成為他們的取值對象.這個取值是動態的會取到中間的隨機顏色值.如果,你降低到這個份上,你的視頻就已經基本上是馬賽克的效果了...
反向操作提高比特率會出現什么效果?
視頻文件會增大,因為比特率增加,導致需多像素點上都會有顏色值.但是!並不會讓更加視頻清晰,反而有可能會讓視頻更模糊.因為,你並沒有告訴那些像素點他們應該取什么值保存到文件里.所以,沒有顏色值的像素點會向周圍隨便取值.但是這個取值后,是會保存到文件里的,所以你會感覺到文件增大.但是視頻更加模糊.....
比特率的取值范圍:
音頻
- 32 kbps —MW(AM) 質量
- 96 kbps —FM質量
- 128 - 160 kbps –相當好的質量,有時有明顯差別
- 192 kbps — 優良質量,偶爾有差別
- 224 - 320 kbps — 高質量
- 800 bps – 能夠分辨的語音所需最低碼率(需使用專用的FS-1015語音編解碼器)
- 8 kbps —電話質量(使用語音編碼)
- 8-500 kbps --Ogg Vorbis和MPEG1 Player1/2/3中使用的有損音頻模式
- 500 kbps–1.4 Mbps —44.1KHz的無損音頻,解碼器為FLAC Audio,WavPack或Monkey's Audio
- 1411.2 - 2822.4 Kbps —脈沖編碼調制(PCM)聲音格式CD光碟的數字音頻
- 5644.8 kbps —SACD使用的Direct Stream Digital格式
視頻
- 16 kbps —可視電話質量(使用者可以接受的"說話的頭"照片的最低要求)
- 128 – 384 kbps — 商業導向的視頻會議系統質量
- 1 Mbps —VHS質量
- 1.25 Mbps–VCD質量(使用MPEG1壓縮)
- 5 Mbps —DVD質量(使用MPEG2壓縮)
- 8 – 15 Mbps —高清晰度電視(HDTV) 質量(使用H.264壓縮)
- 29.4 Mbps –HD DVD質量
- 40 Mbps – 藍光光碟(Blu-ray Disc) 質量(使用MPEG2、H.264或VC-1壓縮)
- 440/880 Mbps – SonyHDCAM SR質量(SQ/HQ)
上面是百度百科上提供的取值參考,是不是還是有一些概念模糊? 對音頻的比特率來說,你可以按照上面的值換算成比特值使用.但是對視頻卻不一定是這樣的固定的取值.上面的視頻取值只是參考,假如你在准備調用相機拍攝視頻,那么怎么才能設置一個合適當前分辨率比特率呢? (注意 ! 我這里說是拍攝視頻的時候,因為已經拍攝完成的視頻對比特率只有降低處理,提高毫無意義)
首先你要記住一個公式: N * width * height
解釋一下上面的公式,比如我們是一個 1920*1080 的分辨率的視頻,這個就是通常的超清視頻1080P的分辨率.那么這么一個分辨率的視頻如何達到超清的要求呢. 一般是 5 * 1920 * 1080 = 10368000 這個值的比特率.如果你要更清晰可以繼續調整N值,但是一般調整到10就是頂點了.(注意! 比特率不是無效大的,這關系到你的設備處理能力和設備的攝像頭), 所以,一般情況下取值范圍就是如下:
- 1 * width * height -到- 10 * width * height
frame-rate幀速率
幀速率是指每秒鍾刷新的圖片的幀數,也可以理解為圖形處理器每秒鍾能夠刷新幾次。對影片內容而言,幀速率指每秒所顯示的靜止幀格數。要生成平滑連貫的動畫效果,幀速率一般不小於8;而電影的幀速率為24fps。捕捉動態視頻內容時,此數字愈高愈好。
另外,我們降低幀率,也可以降低視頻文件的大小.所以,在壓縮視頻的時候也可以考慮降低幀率,但是,過低幀率的下會導致視頻卡頓不流程.所以,在幀率上可以調整的空間並不多....
幀率的取值范圍
一般是8 - 60的取值范圍,在60以后在提高意義不大,因為人眼並辦法在這么高的幀率下感覺到區別. 而我們拍攝視頻一般取值 30 幀率即可.這是一個十分平衡文件大小與視頻流暢度的取值.
Data Rate碼率
碼率是與比特率一樣的東西,雖然我對它只有初步的了解,但是個人認為碼率其實就是比特率...只是叫法不同.
視頻編碼格式/解碼格式
所謂視頻編碼方式就是指通過特定的壓縮技術,將某個視頻格式的文件轉換成另一種視頻格式文件的方式。視頻流傳輸中最為重要的編解碼標准有國際電聯的H.261、H.263、H.264,運動靜止圖像專家組的M-JPEG和國際標准化組織運動圖像專家組的MPEG系列標准,此外在互聯網上被廣泛應用的還有Real-Networks的RealVideo、微軟公司的WMV以及Apple公司的QuickTime等。
視頻最重要的部分就是編解碼,一個視頻在拍攝后保存成文件需要編碼,而播放時則需要解碼.而編解碼最重要的就是編碼格式. 目前最通用最好的視頻編碼格式是: H.264 / AVC. 所以,如果你不了解這些不要緊,直接選擇這個就沒錯.
以下是Android里一般支持的幾種視頻編碼格式.在google源碼MediaRecorder.java 可以看到:
public static final int H263 = 1; public static final int H264 = 2; public static final int MPEG_4_SP = 3; public static final int VP8 = 4; public static final int HEVC = 5;
音頻編碼格式/解碼格式
從信息論的觀點來看,描述信源的數據是信息和數據冗余之和,即:數據=信息+數據冗余。音頻信號在時域和頻域上具有相關性,也即存在數據冗余。將音頻作為一個信源,音頻編碼的實質是減少音頻中的冗余。這是一段百度百科的描述,每次其實所謂的音頻編碼就是壓縮格式,將大量數據壓縮成更小的數據,將重復冗余的信息去除.
音頻最重要的部分也是編解碼,原理跟視頻編解碼一樣.目前配合視頻使用最通用最好的音頻編碼格式是: AAC ,而單純是音頻的文件最好的編碼格式是:AMR_NB
以下是Android里一般支持的幾種音頻編碼格式.在google源碼MediaRecorder.java 可以看到:
/** AMR (Narrowband) audio codec */ public static final int AMR_NB = 1; /** AMR (Wideband) audio codec */ public static final int AMR_WB = 2; /** AAC Low Complexity (AAC-LC) audio codec */ public static final int AAC = 3; /** High Efficiency AAC (HE-AAC) audio codec */ public static final int HE_AAC = 4; /** Enhanced Low Delay AAC (AAC-ELD) audio codec */ public static final int AAC_ELD = 5; /** Ogg Vorbis audio codec */ public static final int VORBIS = 6;
END