音視頻及FFMpeg概念篇

音視頻編解碼概念

音視頻格式有很多種,我們所熟知的音頻文件有wav、mp3等 ,視頻格式有mp4、3gp、rmvb、avi、mov等等。這些格式並不是只是文件的後綴不同,而是文件中的內容有很大的不同,哪怕這個媒體文件播放起來我們看起來覺得它們是一模一樣的。
另外,我們看到的電影或者視頻片段,它往往是由兩個或者兩個以上的流組成的,比如聲音流、視頻流、字幕等。甚至聲音也有左聲道、右聲道什麼的。
那麼這些東西是怎麼串聯的呢?編碼、解碼、混流、解複用、過濾器這些都是些啥?爲啥要有這些步驟?

編解碼

我們應該都熟悉RGBA的色彩,用紅綠藍再加上透明度可以組成我們人眼可見的各種色彩,但是實際上許多色彩的差異並不是那麼明顯,就算肉眼去很仔細的比對都不能分辨出來。而通常視頻依照24幀每秒的頻率存儲圖像、甚至以30幀每秒的頻率存儲圖像,如果以rgba的格式存儲,佔用的存儲空間是非常龐大的,而且不利於網絡傳輸。而YUV格式,如果一幀RGBA的圖像數據佔用16份,那麼RGB佔用12份,而YUV420只佔用6份。雖然RGB的圖像變爲YUV格式質量通常會有損失,但是這個損失通常是可以接受的。
雖然轉換成YUV格式,可以節省一些存儲空間,但是情況依舊不容樂觀。人們又發現對於連續的視頻而言,通常連續的幀之間,圖像之間存在大量重複的數據,這樣,就可以在存儲的時候把重複的數據去掉,再需要展示的時候再恢復出來,這樣就可以大大節省存儲空間,網絡傳輸的之後,也同樣把大量重複的去掉,接收端播放的實話再恢復,以達到節省帶寬,加快傳輸速度的目的。這個去除大量重複數據的過程我們可以理解爲音視頻的編碼,把去除的數據恢復回來的過程,我們可以理解爲音視頻的解碼,也就是Codec。

混流、解複用

混流也就是複用,或許更爲標準的叫法應該是複用。混流是什麼?上面說了,我們看到的視頻通常有圖像又有聲音,這些聲音和圖像的數據通常是兩條不同的流,把這兩條流混合在一起的過程就是混流。那麼反之,把混合在一起的音視頻拆分成各自的音頻流、視頻流的過程就是解複用。編解碼的目的很明確,那麼混流和解複用的目的又是什麼呢?拿網絡傳輸來說,在線觀看視頻,總不能先把聲音傳過去再傳圖像,或者說先把所有的圖像傳過去再傳聲音,而是傳一點圖像就傳一點聲音,這就是混流了,也就時Mux,與之對應的就是解複用Demux.

過濾器

我總是覺得這個翻譯,對於Filter來說並不好聽,我更喜歡翻譯它爲濾鏡,更確切的說,應該可以把它理解爲處理器。它並不是真的就是用來過濾,像把渾濁的水過濾成清水那樣。比如我們給視頻圖像加個水印,或者改變視頻的聲音,讓聲音變得尖銳或者低沉等等,這些就是濾鏡的工作了。

音視頻編解碼方式

簡單的來分,我們可以把音視頻的編解碼分爲軟編解碼和硬編解碼,這裏的軟就是指軟件,硬就是指硬件。所謂的軟編解碼,就是依賴軟件,利用CPU進行編解碼。而硬編解碼可以理解爲使用非CPU進行編解碼,更準確的是,依賴音視頻編解碼模塊進行音視頻編解碼。至於使用時到底是使用硬編解碼還是軟編解碼,還是要依賴需求,根據它們各自的特點進行選擇。
通常來說,軟編解碼實現直接簡單,參數調整方便,支持格式廣泛,編碼視頻質量相對硬編碼更爲清晰。但是軟編解碼相對硬編解碼性能略差,會給CPU帶來較重負載。
以Android平臺爲例,Android硬編解碼MediaCodec從Android4.1纔開始支持,混流用的MediaMuxer到Android4.3纔開始支持。在Android4.1以前,如果開發者想要做視頻相關應用通常會選擇FFMpeg之類的開源編解碼框架進行軟編解碼。當然,FFMpeg也可以配置選擇使用硬編碼。一般來說,如果應用只需要支持Android 4.3及以上,只需要做錄製視頻、播放Mp4文件,硬編解碼方案優於軟編解碼方案。但是如果應用需要支持4.1以前的系統,或者要求支持其他音視頻格式,比如rmvb之類的,可能就不得不使用軟編方案了。

FFMpeg

上面提到了FFMpeg,那麼FFMpeg又是什麼呢?從其官網上可以知道,FFMpeg是一個全球領先的多媒體開源框架,用於音視頻的編解碼、混流、解複用、過濾器、轉碼以及播放等。它支持多平臺、多種音視頻格式。而且它便於移植及二次開發,當前有很多軟件都用到了FFMpeg。FFMpeg 既有可以直接使用的工具,也有可以供開發人員使用的庫。
其工具有:

  1. ffmpeg:一個用於多媒體格式轉換的命令行工具
  2. ffserver: 一個用於現場直播的多媒體流服務器
  3. ffplay: 一個基於SDL和FFMpeg庫的簡單的媒體播放器
  4. ffprobe:一個簡單的多媒體分析工具

其開發庫有:

  1. libavutil: 包含簡化編程功能的庫,包括隨機數生成器、數據結構、數學相關的程序、核心多媒體框架等等。
  2. libavcodec:包含用於音視頻編解碼的編碼器和解碼器的庫。
  3. libavformat: 包含多媒體容器格式的解碼器和多路複用器的庫。
  4. libavdevice: 包含輸入輸出設備的庫,用於從許多常見的多媒體輸入輸出軟件框架中獲取和渲染,包括Video4Linux、Video4Linux2、VfW和ALSA。
  5. libavfilter:一個包含媒體過濾器的庫。
  6. libswscale:一個執行高度優化的圖像縮放和色彩空間/像素格式轉換的庫。
  7. libswresample:一個執行高度優化的音頻重採樣、再分頻和採樣格式轉換操作的庫。

值得注意的是,FFMpeg並不是直接就可以用於各種視頻的編解碼工作,它只是一個框架。真正執行編解碼工作的通常會用到其它編解碼器。比如進行h264的編碼,一般會選擇FFMpeg配合x264進行使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章