A. 視頻編碼-CRF模式
Constant Rate Factor(CRF)是一種碼率控制模式,最早是X264提出來的,後面的X265和libvpx也都有類似的模式。這種碼控模式可以達到基本恆定的質量,不過碼率會隨著內容的不同而波動。如果使用ffmpeg,可以通過下面的命令來設置crf:
x264和x265裡面crf的設置范圍是0-51,crf越高, 質量越差。CRF越低,質量越好。一般CRF低於18的時候,人眼感知不到明顯的質量差異。
CQP也就是Constant QP,也就是對於同樣的幀類型(I幀,P幀,B幀),使用相同的QP進行量化。編碼器的失真是由量化引起的,相同的量化參數可以保證對於同樣的殘差信號可以實現大概相同的損失。
而CRF則是Constant Quality,這里的Quality是感知到的quality。CRF會對不同復雜度的幀使用不同的QP進行編碼,從而達到一個恆定的感知到的質量。那麼感知到的質量和信號層面的質量有什麼差異?信號層面的質量可以使用PSNR來衡量,而感知到的質量和人眼的特性有關。一般來說,對於高復雜度(草地)或者劇烈運動的場景,細節的損失人眼是很難感知到的,而對於平坦區域的細節損失人眼很容易感知到(如平坦區域的馬賽克或者banding)。
舉一個例子,Constant QP在QP=18的時候編碼,會把每幀的QP都設置為18(實際中不同類型的幀可能會有不同,暫時忽略);而CRF則可能對於復雜的幀,使用QP=20來編碼,對於簡單的幀,使用QP=18來編碼。
CRF是保證質量的碼控模式,對於最終的碼率大小沒有保證,在實際應用場景裡面,很多時候需要一個最大碼率的限制,此時就可以使用CRF+VBV的模式。這種模式一般需要設置三個參數,對應的參數名和意義如下:
crf : 期望的質量,越低越好
bufsize : 一個slide window的bit buffer,編碼器需要保證這個buffer沒有overflow。
maxrate : 最大的local bitrate 。
舉個例子:
怎麼設置bufsize的大小?bufsize一般是和maxrate的成一定的比例關系,譬如2x, 1x, 5x等。bufsize越大,對碼控的約束越小,允許的碼率波動越大。bufsize越小,對碼控的約束越大,允許的碼率波動就越小。所有這個值的設定取決於應用對於碼率波動大小的要求。