huazi

huazi

音視頻相關知識總結

封裝格式#

我們經常看到有不同後綴表示的視頻:avi,rmvb,mp4,flv,mkv 等等。這些格式代表的是封裝格式。何為封裝格式?就是把視頻數據和音頻數據打包成一個文件的規範。僅僅靠看文件的後綴,很難能看出具體使用了什麼視音頻編碼標準。

我們可以通過視頻的屬性查看該視頻文件採用的視音頻技術。或者 MediaInfo 軟件查看。

封裝格式的主要作用是把視頻碼流和音頻碼流按照一定的格式存儲在一個文件中。
主要的封裝格式:

audio_video_table.png

視頻播放器原理#

視音頻技術主要包含以下幾點:封裝技術,視頻壓縮編碼技術以及音頻壓縮編碼技術。如果考慮到網絡傳輸的話,還包括流媒體協議技術。

視頻播放器播放一個互聯網上的視頻文件,需要經過以下幾個步驟:
解協議,解封裝,解碼視音頻,視音頻同步。
如果播放本地文件則不需要解協議,為以下幾個步驟:
解封裝,解碼視音頻,視音頻同步。

audio_video_play_1.jpeg

解協議的作用,就是將流媒體協議的數據,解析為標準的相應的封裝格式數據。視音頻在網絡傳播的時候,常常採用各種流媒體協議,例如 HTTP,RTMP,HLS, 或是 MMS 等等。這些協議在傳輸視音頻數據的同時,也會傳輸一些信令數據。這些信令數據包括對播放的控制(播放,暫停,停止),或者對網絡狀態的描述等。解協議的過程中會去除掉信令數據而只保留視音頻數據。例如,採用 RTMP 協議傳輸的數據,經過解協議操作後,輸出 FLV 格式的數據。

解封裝的作用,就是將輸入的封裝格式的數據,分離成為音頻流壓縮編碼數據和視頻流壓縮編碼數據。封裝格式種類很多,例如 MP4,MKV,RMVB,TS,FLV,AVI 等等,它的作用就是將已經壓縮編碼的視頻數據和音頻數據按照一定的格式放到一起。例如,FLV 格式的數據,經過解封裝操作後,輸出 H.264 編碼的視頻碼流和 AAC 編碼的音頻碼流。

解碼的作用,就是將視頻 / 音頻壓縮編碼數據,解碼成為非壓縮的視頻 / 音頻原始數據。音頻的壓縮編碼標準包含 AAC,MP3,AC-3 等等,視頻的壓縮編碼標準則包含 H.264,MPEG2,VC-1 等等。解碼是整個系統中最重要也是最複雜的一個環節。通過解碼,壓縮編碼的視頻數據輸出成為非壓縮的顏色數據,例如 YUV420P,RGB 等等;壓縮編碼的音頻數據輸出成為非壓縮的音頻抽樣數據,例如 PCM 數據。

視音頻同步的作用,就是根據解封裝模塊處理過程中獲取到的參數信息,同步解碼出來的視頻和音頻數據,並將視頻音頻數據送至系統的顯卡和聲卡播放出來。

視頻編碼#

視頻編碼的主要作用是將視頻像素數據(RGB,YUV 等)壓縮成為視頻碼流,從而降低視頻的數據量。如果視頻不經過壓縮編碼的話,體積通常是非常大的,一部電影可能就要上百 G 的空間。視頻編碼是視音頻技術中最重要的技術之一。視頻碼流的數據量佔了視音頻總數據量的絕大部分。高效率的視頻編碼在同等的碼率下,可以獲得更高的視頻質量。

主要的視頻編碼有:HEVC (H.265),H.264,MPEG4,MPEG2,VP9,VP8 等。
目前的主流編碼標準:H.264
H.264 僅僅是一個編碼標準,而不是一個具體的編碼器,H.264 只是給編碼器的實現提供參照用的。

目前支持 H.265 的及其也越來越多。

音頻編碼#

音頻編碼的主要作用是將音頻採樣數據(PCM 等)壓縮成為音頻碼流,從而降低音頻的數據量。音頻編碼也是互聯網視音頻技術中一個重要的技術。但是一般情況下音頻的數據量要遠小於視頻的數據量,因而即使使用稍微落後的音頻編碼標準,而導致音頻數據量有所增加,也不會對視音頻的總數據量產生太大的影響。

主要的音頻編碼:AAC,MP3,WMA 等

Android 平台提供的媒體編解碼器,容器和網絡協議支持:
https://developer.android.com/guide/topics/media/media-formats

比如,Android 機把 AudioRecord 采集的到的 PCM 音頻數據編碼壓縮為 AAC 格式的音頻數據,然後解碼為 PCM 通過 AudioTrack 來播放

視頻轉碼 / 壓縮#

視頻轉碼其實可以理解為,一個視頻先解碼,然後再按一定格式編碼。
壓縮視頻其實就是在轉碼,重新編碼,獲取相對較小的,視頻質量可接受的視頻。

音視頻壓縮的基本原理:https://blog.csdn.net/leixiaohua1020/article/details/28114081

那視頻的大小跟什麼有關呢?

決定因素是碼率(常用單位 kbps ),即 “每秒有多少數據”,碼率越大視頻越大,不管你是 1080p 還是 720p 還是什麼其他尺寸,同樣碼率的 720p 視頻和 1080p 視頻文件大小是一樣的,只是畫質不一樣。

而影響碼率的因素有很多:

1、其他條件不變,畫面尺寸(1080p、720p、480p...)越大碼率越大;
2、其他條件不變,幀率(25 幀 / 秒、30 幀 / 秒 、60 幀 / 秒……)越高碼率也越大;
3、還有一個是編碼算法,優秀的算法能在畫質損失較小的情況下降低碼率從而減小視頻文件的體積。

一個簡單的計算視頻大小的公式:

碼率(kbps)x 視頻時間(秒)÷8 = 視頻文件大小(kb)

目前我們項目中視頻壓縮使用的庫:https://github.com/ypresto/android-transcoder

Android MediaCodec:https://developer.android.com/reference/android/media/MediaCodec

MediaCodec 是 API 16 之後 Google 推出的用於音視頻編解碼的一套偏底層的 API,可以直接利用硬件加速進行視頻的編解碼。調用的時候需要先初始化 MediaCodec 作為視頻的編碼器,然後只需要不停傳入原始的 YUV 數據進入編碼器就可以直接輸出編碼好的 h264 流,整個 API 設計模型來看,就是同時包含了輸入端和輸出端的兩條隊列:

audio_video_image2.png

作為編碼器,輸入端隊列存放的就是原始 YUV 數據,輸出端隊列輸出的就是編碼好的 h264 流,作為解碼器則對應相反。

transcode_img.png

參考:https://me.csdn.net/leixiaohua1020

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。