H.264的碼率控制算法

H.264的碼率控制算法采用了多種技術,其中包括自適應基本單元層(Adaptive Basic Unit Layer)、流量往返模型(Fluid Traffic Model)、線性MAD模型、二次率失真模型等。并且采用了分層碼率控制策略,共分為三層:GOP層、幀層和基本單元層。在JVT的提案中,采用的是JVT-G012碼率控制算法,該算法提出了基本單元的概念,將一幀劃分為若干個基本單元,基本單元可能是一宏塊、一行宏塊、一場或一幀。幀層碼率控制根據網絡帶寬、緩存占用量、緩存大小及剩余比特來分配每一幀的目標比特;在基本單元層碼率控制中,目標比特由該幀的剩余目標比特平均得到。這些技術的采用成功地解決了傳統碼率控制算法與H.264的率失真優化技術之間存在的因果矛盾,能較準確地控制輸出碼率,輸出視頻質量較好。

H.264中的JVT.G012算法采用的二次R—Q模型如下:

??????? 這一模型用于基本單元的量化參數計算,其中R代表編碼量化系數所需的碼字位數,Q指基本單元的量化步長,MAD通過以下線性預測模型進行預測:

??????? 其中MADcb和MADpb代表當前基本單元和前一幀相應位置處的MAD,a1,a2是模型系數,在每一個基本單元的最后一個宏塊處理中通過線性回歸的方法進行更新。

??????? JVT的碼率控制比以往的標準更加困難。因為量化參數不僅在碼率控制算法中使用而且在率失真優化中應用,從而導致一種稱為“雞與蛋"的悖論(Chicken and Egg Dilemma):為了在當前幀的宏塊中應用率失真優化,首先要有一個量化參數,這個量化參數通過計算當前幀的MAD(Mean Absolute Difference)得到。然而,只有在率失真優化以后才能得到當前幀的MAD。并且編碼處理所使用的信道帶寬可能是恒定的,也可能是可變的。必須同時考慮恒定比特率(Constant Bit Rate,CBR)和可變比特率(Variable Bit Rate,VBR)兩種情況。目前的碼率控制機制大多針對恒定碼率的情況.

??????? 率失真理論是視頻編碼的一個基本部分。率失真優化(RDO)在給定的碼率限制下最小化解碼失真,Lagrangian方法可以在碼率和失真之間有效地進行折中。在H.264標準中,Lagrangian方法用于運動補償的模式選擇和幀內預測。換言之,它可以在給定的碼率限制下,最小化失真,尋找到塊的最佳運動向量和編碼模式。然而,Lagrangian方法的應用使碼率控制變得更困難,因為QP涉及到碼率控制和失真計算。換言之,碼率控制方案在調整QP后將影響塊的運動和模式選擇。在MPEG.4碼率控制中,可以在估計QP前通過執行二次R—D模型來獲得X1,X2、MAD和目標比特數。但在H.264標準中,QP在碼率控制和RDO中都指定了,因此在執行RC時就存在一個問題:對MB執行RDO,要先通過MB的MAD決定MB的QP,然而MB的MAD只有在RDO運行后才能獲得。這就是一個蛋雞悖論


如上所述,在H.264標準的碼率控制中存在兩個問題:
1.在執行RDO之前,MAD是未知的。
2.雖然在運動補償后可以獲得每個編碼模式的MAD,但最佳編碼模式仍然未知,所以不能決定哪個MAD可以用于估計QP。
Ma等人提出了一個新的H.264碼率控制方案,該方案沒有考慮QP與MAD之間的相關性,但它不是single—pass碼率控制算法。雖然該算法可以實現目標比特數且沒有明顯的比特變動,但執行RDO要花費2倍的時間,對宏塊而言這樣的時I司復雜度是不可接受的。

??????? H.264中的碼率控制方法是以提案JVT—G012為藍本的。JVT.G012提案通過引入基本單元和線形模型的概念,提出一種自適應基本單元層碼率控制方案。基本單元可能是一幀、片或宏塊。并提出了一種線性模型,通過前一幀相應位置的基本單元預測當前基本單元MAD。為闡述G012提案,本文首先對其中的關鍵技術進行分析。

1。基本單元的定義

?????? 假設某一幀由Nmbpic個宏塊組成,那么定義基本單元為一個由Nmbpic個宏塊中連續的Nmbunit個宏塊所組成的組。那么在該幀中的總的基本單元的個數為:

Nunit=Nmbpic/Nmbunit

??????? 需要注意的是,如果采用了比較大的基本單元,那么PSNR可以達到一個較高的值,同時比特的波動也會增大。另一方面,如果采用了比較小的基本單元,比特的波動會比較的小,但是相應的會帶來PSNR的損失。

2.流量往返模型(Fluid Tramc Model)


3.MAD的線性預測模型
?????? 這里,該算法一個線性模型來預測當前幀中的基本單元的MAD值,它的參

?

?

?

預測模型參數a1和a2更新方法分為三步,如下所述:
????? 第一步一數據點選擇:數據點是用于更新模型參數,數據點的數量以及質量對于模型的準確性有著重要的影響。通常而言,數據點越多,模型越準確。在JM86模型中,采用滑動窗口機制進行數據點的選擇,窗口大小通常為20。
??????第二步一計算模型參數:根據選中的數據點,算法收集預測的MAD和實際MAD的值,采用線性回歸的方法,計算得到a1和a2。
????? 第三步一去除壞的數據點:在得到al和a2之后,根據滑動窗口中數據點的參考值,用a1和a2形成的預測模型計算數據點的預測值,然后將得到的值與數據點的原始預測值比較,計算誤差,如果誤差大于一定的值(JM中取誤差的均值),則將該數據點去除,用更新后的數據點重新計算模型參數al和a2。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455663.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455663.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455663.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

消息中間件Client模塊劃分

上圖是之間討論確定的系統架構(后續內容會按照這個架構來敘述),其中: 客戶端包含Producer和Consumer兩大塊 客戶端需要和NameServer交互來獲取元數據 客戶端需要和Broker交互來讀寫消息 Client模塊劃分 1. 網絡模塊 第一個仍然是…

詳解HashMap數據結構實現

HashMap的設計是由數組加鏈表的符合數據結構,在這里用自己的語言以及結合源碼去總結一下,如果有不對的地方希望評論指正,先拱手謝謝。 HashMap是日常中非常常用的一種數據結構,我們要想深入了解學習任何一門技術,都是要…

java web開發學習手冊_Java 人必備學習手冊開發下載!

今天給大家分享一套 5000 頁的 Java 學習手冊,新鮮出爐!此手冊內容專注 Java技術,包括 JavaWeb,SSM,Linux,Spring Boot,MyBatis,MySQL,Nginx,Git,…

Django初次體驗

Django初次體驗 關于django的安裝,寶寶們可以參考django簡介以及安裝 Django框架的搭建 在終端中進入需要建立項目的目錄 執行: django-admin startproject mysite其中,mysite是項目目錄名,可以自定義 我們來看看startprojec…

【LeetCode-面試算法經典-Java實現】【002-Add Two Numbers (單鏈表表示的兩個數相加)】...

【002-Add Two Numbers (單鏈表表示的兩個數相加)】 原題 You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked…

關鍵幀 關于decode_one_frame函數

田克平(94338047) 16:57:34能自己設置某幀為關鍵幀嗎? 抱柱者(86311414) 16:57:59to 田克平可以 田克平(94338047) 17:00:00呵呵,把丟包后的下一幀設置為I幀可以嗎?來處理丟幀現象 ☆雪天/kf☆(279373002) 17:00:42這個難度大了 田克平(94338…

不出現php version網頁_php冷知識 - 從命令行參數列表中獲取選項

分享一個php的冷知識 - ,從命令行參數列表中獲取選項用到的函數是getopt 說明函數簽名是這樣的getopt ( string $options [, array $longopts [, int &$optind ]] ) : array|bool false解析傳入腳本的選項,成功返回數組,解析失敗返回fals…

【機器學習】opencv-攝像頭中的人臉采集

本次在視頻識別的程度上增添了攝像頭實時識別, 區別在于: # v cv2.VideoCapture(./dzd2.mp4) v cv2.VideoCapture(0) import numpy as npimport cv2face_detector cv2.CascadeClassifier(./haarcascade_frontalface_alt2.xml) # v cv2.VideoCapt…

[計算機視覺][神經網絡與深度學習]Faster R-CNN配置及其訓練教程2

faster-rcnn分為matlab版本和python版本,首先記錄弄python版本的環境搭建過程.matlab版本見另一篇:faster-rcnn(testing): ubuntu14.04caffecuda7.5cudnn5.1.3opencv3.0matlabR2014a環境搭建記錄 首先,進入官方github網站:https://github.com/rbgirshick/py-faster-…

modbus從站模擬軟件_作為工控電氣人,你知道我們必備的軟件有哪些嗎?

作為工控電氣人,你知道我們必備的軟件有哪些嗎?今天我就來給大家介紹一下,工控電氣人常用的幾款軟件,有了它們,我們的工作學習將會更易上手,效率翻倍。以下介紹主要是分為電工常用軟件,PLC編程軟…

錯誤檢測dP-bitstream-ei_flag runRestrictRef

JM86模型,對于錯誤檢測,dP->bitstream->ei_flag在什么情況下置1?還是無錯的時候dP->bitstream->ei_flag0,有錯時dP->bitstream->ei_flag等于一個較大的無效值? 看下所有給 dP->bitstream->ei_…

【數據分析】豆瓣電影Top250爬取的數據的可視化分析

豆瓣Top250網址 將之前爬取到的豆瓣電影進行簡單的可視化: 數據列表保存為CSV格式,如圖 導入數據 做好準備 #!-*- coding:utf-8 -*- import pandas as pd import numpy as np import matplotlib.pylab as plt import re from numpy import rank from bu…

sqlmap的二次開發

1、sqlmapapi的幫助信息。 -s 啟動sqlmap作為服務器 -h 指定sqlmap作為服務器的IP地址,默認127.0.0.1 -p 指定sqlmap服務器的端口,默認端口為8775 2、啟動服務 瀏覽器訪問: 3、api介紹:sqlmap項目下的api.py文件含有所有的api adm…

Django創建第一個應用

Django創建第一個應用 1,創建應用 Django自帶一個實用程序,可以自動生成應用程序的基本目錄結構,因此您可以專注于編寫代碼而不是創建目錄。 要創建您的應用程序,請確保您與目錄位于同一目錄,manage.py 并鍵入以下命令&#xff1…

docker nginx配置_docker隨手筆記第十二節 jenkins+docker+nginx+純靜態頁面配置

docker隨手筆記第一節 docker概念及安裝docker隨手筆記第二節 docker常用命令解析docker隨手筆記第三節 docker構建java鏡像docker隨手筆記第四節 docker安裝mysql5.7docker隨手筆記第五節 docker安裝redis4.0docker隨手筆記第六節 docker安裝jenkinsdocker隨手筆記第七節 jenk…

【機器學習】邏輯斯蒂回歸原理

邏輯斯蒂函數 引入: 在線性感知器算法中,我們使用了一個f(x)x函數,作為激勵函數,而在邏輯斯蒂回歸中,我們將會采用sigmoid函數作為激勵函數,所以它被稱為sigmoid回歸也叫對數幾率回歸(logistic …

。。。。。etc 時域錯誤隱藏個人理解

三個文件名以 erc 開頭的文件就是 EC 相關的文件。EC 的入口在 exit_picture 函數中,從 ercStartSegment 開始到 ercConcealInterFrame 結束。你自己做一個丟包之后的碼流,把程序跑起來跟蹤一下 EC 過程,慢慢分析代碼。 錯誤隱藏過程在整個幀…

手機影音第十一天,顯示視頻緩沖,顯示卡頓時的網速,播放系統視頻時調用播放器的選擇...

代碼已經托管到碼云,有興趣的小伙伴可以下載看看https://git.oschina.net/joy_yuan/MobilePlayer一、設置視頻緩沖進度顯示視頻播放進度的效果圖如下:灰色的是緩沖的進度。原理:只有播放網絡視頻時,才有緩沖這個說法,所…

Django之創建應用以及配置路由

Django之創建應用以及配置路由 配置所有IP都可以訪問你的項目 1.進入manage.py同級的my_web里面的settings.py的文件 2.在文件的第28行把ALLOWED_HOSTS []改成ALLOWED_HOSTS [*] 注意:*代表的是所有IP都可以訪問 創建一個app應用 在終端中,結束項目…

python中opencv是什么_python-opencv的用法

#!/usr/bin/env python # -*- coding:utf-8 -*- # author:love_cat import cv2 # 接收兩個參數,一個是文件名,一個值,如果值為1,接收的是彩色圖片,如果值為零,接受的是灰度圖片。會有一個返回值&#xff0c…