當前位置:首頁 » 操作系統 » dpc演算法

dpc演算法

發布時間: 2023-03-01 13:01:28

A. 音視頻壓縮:H264碼流層次結構和NALU詳解

前言:
為什麼需要編碼呢?比如當前屏幕是1280*720.一秒24張圖片.那麼我們一秒的視頻數據是
1280*720(位像素)*24(張) / 8(1位元組8位)(結果:B) / 1024(結果:KB) / 1024 (結果:MB) = 2.64MB
一秒的數據有2.64MB數據量。1分鍾就會有100多MB。這對用戶來說真心是災難。所以現在我們需要一種壓縮方式減小數據的大小.在更低 比特率(bps)的情況下依然提供清晰的視頻。
H264: H264/AVC是廣泛採用的一種編碼方式。我們這邊會帶大家了解。從大到小排序依次是 序列,圖像,NALU,片,宏塊,亞宏塊,塊,像素。

問題背景:

前面在講封裝格式過程中,都有一個章節講解如何將H.264的NALU單元如何打包到TS、FLV、RTP中,解裝剛好相反,怎麼從這些封裝格式裡面解析出一個個NALU單元。NALU即是編碼器的輸出數據又是解碼器的輸入數據,所以在封裝和傳輸時,我們一般處理對象就是NALU,至於NALU內部到底是什麼則很少關心。甚至我們在編解碼時,我們只需要初始化好x264編碼庫,然後輸入YUV數據,它就會給你經過一系列壓縮演算法後輸出NALU,或者將NALU輸入到x264解碼庫就會輸出YUV數據。

這篇文章就初步帶你看下NALU能傳輸那些數據,NALU的類型和結構以及H264碼流的層次,最後通過分析工具分析下裸碼流記性驗證,你可以選擇感興趣章節閱讀。

NALU結構:

H.264的基本流(elementary stream),也叫裸流(沒有加格式封裝),就是一系列NALU的集合,如下圖所示:

用Notepad十六進制形式打開,以annexb格式存儲的h264裸流文件內容:

NALU結構分為兩層,包含了視頻編碼層(VCL)和網路適配層(NAL):

視頻編碼層(VCL即Video Coding Layer) :負責高效的視頻內容表示,這是核心演算法引擎,其中對宏塊、片的處理都包含在這個層級上,它輸出的數據是SODB;

網路適配層(NAL即Network Abstraction Layer) :以網路所要求的恰當方式對數據進行打包和發送,比較簡單,先報VCL吐出來的數據SODB進行位元組對齊,形成RBSP,最後再RBSP數據前面加上NAL頭則組成一個NALU單元。

分層目的:

這樣做的目的:VCL只負責視頻的信號處理,包含壓縮,量化等處理,NAL解決編碼後數據的網路傳輸,這樣可以將VCL和NAL的處理放到不同平台來處理,可以減少因為網路環境不同對VCL的比特流進行重構和重編碼;

NLAU結構:

其實NALU的承載數據真實並不是RBSP(Raw Byte Sequence Playload)而是EBSP即(Extent Byte Sequence Payload),EBSP和RBSP的區別就是在 RBSP裡面加入防偽起始碼位元組(0x03),因為H.264規范規定,編碼器吐出來的數據需要在每個NALU添加起始碼:0x00 00 01或者0x00 00 00 01,用來指示一個NALU的起始和終止位置,那麼RBSP數據內部是有可能含有這種位元組序列的,為了防止解析錯誤,所以在RBSP數據流裡面碰到0x 00 00 00 01的0x01前面就會加上0x03,解碼時將NALU的EBSP中的0x03去掉成為RBSP,稱為脫殼操作。

原始位元組序列負載 RBSP即Raw Byte Sequence Playload,因為VCL輸出的 原始數據比特流 SODB即String Of Data Bits,其長度不一定是8bit的整數倍,為了湊成整數個位元組,往往需要對SODB最後一個位元組進行填充形成RBSP,所以從SODB到RBSP的示意圖如下:

填充方式就是對VCL的輸出數據進行8bit進行切分,最後一個不滿8bit的位元組第一bit位置1,然後後面預設的bit置0即可
具體填充語法見下文:

原來文檔中的解釋:

主要的意思我的理解如下:

其中H.264規范規定,編碼器吐出來的數據需要在每個NALU添加起始碼:0x00 00 01或者0x00 00 00 01,用來指示一個NALU的起始和終止位置。

所以H.264編碼器輸出的碼流中每個幀開頭3-4位元組的start code起始碼為0x00 00 01或者0x00 00 00 01。

上面我們分析了NALU的結構以及每層輸出數據的處理方法,但是對於NALU的RBSP數據二進製表示的什麼含義並不清楚,下面分析下NALU的類型。

1. NALU Header

頭信息協議如上圖。

舉例說明:

這其中NALU的RBSP除了能承載真實的視頻壓縮數據,還能傳輸編碼器的配置信息,其中能傳輸視頻壓縮數據的為slice。

那麼如果NLAU傳輸視頻壓縮數據時,編碼器沒有開啟DP(數據分割)機制,則一個片就是一個NALU,一個 NALU 也就是一個片。否則,一個片由三個 NALU 組成,即DPA、DPB和DPC,對應的nal_unit_type 類型為 2、3和4。

通常情況我們看到的NLAU類型就是SPS、PPS、SEI、IDR的slice、非IDR這幾種。

上面站在NALU的角度看了NALU的類型、結構、數據來源、分層處理的原因等,其中NLAU最主要的目的就是傳輸視頻數據壓縮結果。那麼站在對數據本身的理解上,我們看下H.264碼流的層次結構。

H.264層次結構:

其實為了理解H.264是如何看待視頻數據,先要了解下視頻的形成過程。其實你把多副連續的有關聯圖像連續播就可以形成視頻,這主要利用了人視覺系統的暫留效應,當把連續的圖片以每秒25張的速度播放,人眼基本就感覺是連續的視頻了。動畫片就是這個原理:一張圖像裡面相鄰的區域或者一段時間內連續圖像的相同位置,像素、亮度、色溫差別比較小,所以視頻壓縮本質就是利於這種空間冗餘和時間上冗餘進行編碼,我們可以選取一段時間第一幅圖像的YUV值,後面的只需要記錄和這個的完整圖像的差別即可,同時即使記錄一副圖像的YUV值,當有鏡頭完全切換時,我們又選取切換後的第一張作為基本圖像,後面有一篇文章回講述下目前視頻壓縮的基本原理。

所以從這裡面就可以引申以下幾個概念:

所以視頻流分析的對象可以用下面的圖片描述:

如果站在數據的角度分析NALU的層次關系,如下圖:

這里視頻幀被劃分為一個片或者多個片,其中slice數據主要就是通過NLAU進行傳輸,其中slice數據又是由:

一個Slice = Silce + Slice Data

一幀圖片跟 NALU 的關聯 :

一幀圖片經過 H.264 編碼器之後,就被編碼為一個或多個片(slice),而裝載著這些片(slice)的載體,就是 NALU 了,我們可以來看看 NALU 跟片的關系(slice)。

引用自: https://www.jianshu.com/p/9522c4a7818d

Slice片類型:

設置片的目的是限制誤碼的擴散和傳輸,也就是一幀圖像中它們的編碼片是互相獨立的,這樣假設其中一張圖像的某一個片有問題導致解碼花屏,但是這個影響范圍就控制在這個片中,這就是我們平時看視頻發現只有局部花屏和綠屏的原因。

Slice Data裡面傳輸的是一個個宏塊,宏塊中的數據承載各個像素點YUV的壓縮數據。一個圖像通常被我們劃分成宏塊來研究,通常有16 16、16 8等格式。我們解碼的過程也就是恢復這些像素陣列的過程,如果知道了每個像素點的亮度和色度,就能渲染出一張完整的圖像,圖像的快速播放即是視頻。
剛才提到了宏塊.那麼什麼是宏塊呢?
宏塊是視頻信息的主要承載者。一個編碼圖像通常劃分為多個宏塊組成.包含著每一個像素的亮度和色度信息。視頻解碼最主要的工作則是提供高效的方式從碼流中獲得宏塊中像素陣列。
一個宏塊 = 一個16*16的亮度像素 + 一個8×8Cb + 一個8×8Cr彩色像素塊組成。(YCbCr 是屬於 YUV 家族的一員,在YCbCr 中 Y 是指亮度分量,Cb 指藍色色度分量,而 Cr 指紅色色度分量)
其中宏塊MB的類型:

宏塊的結構:

H.264碼流示例分析:

這里我們分析一下H.264的NLAU數據,其中包括了非VCL的NALU數據和VCL的NALU。

H.264碼流的NLAU單元:

4. 這里由於沒有數據分割機制,所以一個NALU承載一個片,同時一個片就是一個視頻幀;

4.至於NALU的非VCL數據SPS、PPS、SEI各個欄位的含義具體解析放到下篇文章,這個信息對於解碼器進行播放視頻很重要,很多播放問題都是這個數據有問題導致的;

上面看了視頻的GOP序列,視頻幀信息和片的組成,下面分析片中的宏塊信息;

H.264的層次結構:

總結:

本文主要講述了平時研究和分析視頻流對象的層次,然後這些視頻數據通過NALU傳輸時,NALU的類型和層次關系,以及NALU數據在不同層次的輸出。最後用視頻分析工具分析了H.264裸碼流驗證了上述層次關系。

所以對H.264數據分析時,一定要了解你現在分析的層次和框架,因為每個層次我們關心的數據處理對象是不一樣的,這個非常重要。

一般H.264的分析工具都是收費的,也有一些免費和裁剪版本供大家學習和使用。推薦幾個:Elecard StreamEye、CodecVisa、VideoEye、H264Analyzer、H264Visa等,有時需要交叉使用才能完成對你關心信息的分析,這些都放到我的Git上了,大家獲取使用即可。

引用原文

25fps i幀間隔50 用分析軟體查看可以看出每50幀一個i幀,並發送sps、pps、sei

sps、pps、sei、I幀綁在一起發送

B. 一鍵轉換訂閱免流參數

普通訂閱轉免流訂閱 原理 將原來的訂閱解析後添加免流host 使用方法 伺服器域名/&&訂閱鏈接&&免流host&&轉換後伺服器前綴 我這里已經在伺服器上搭建好了 jttp://jklist.ml:888 白嫖黨專屬鏈接 解釋 jklist.ml:888/ 為伺服器域名 為訂閱鏈接 m.iqiyi.com為免流host iqiyi 為轉換後手機上顯示的伺服器名稱前綴可為空則不修(如軟體支持中文可使用中文) 更新記錄 20210222 更新 鑒於有些訂閱裡麵包含有一個&符號 導致不可用 現更改為兩個&&符號來進行分割 20210304 更新 埠篩選+後端http多線程處理 從訂閱池或者機場的訂閱裡面篩選 、 多線程避免因某訂閱鏈接響應過慢導致整個程序等待超時響應 白嫖鏈接 ws+443較多 適合電信不限埠 訂閱池 什麼都有 訂閱池

你可能感興趣的資源
newsletter_sub_svc:通訊訂閱服務
項目:CN通訊訂閱服務 2014-05-20 英里 Poindexter ... 服務網址: 服務將接受 XML 或 JSON 格式的請求。... 如果您的 Content-Type 標頭是 json,則響應將採用 JSON。... 訂閱/取消訂閱服務: URL: 獲取新訂閱的 xml
subconverter-vercel:在vercel上部署訂閱轉換
subconverter-vercel 本項目核心是tindy2013的。 本項目只是提供一個自動、免費、無需額外設備的腳本運行方式。 項目說明 利用github action實現每隔7天或在修改項目時獲取最新版本的subconverter,並在vercel上進行部署。 需要設置personal access tokens(名稱為GITHUB_TOKEN & 需要設置 repo、 admin:repo_hook、 workflow)
w3_MRI_clean_sub_list:為主題列表清洗w3 MRI完整列表以進行預處理
w3_MRI_clean_sub_list:為主題列表清洗w3 MRI完整列表以進行預處理
qtcreator_sub_dir_example:具有多個子目錄的QT Creator項目的示例項目
qtcreator_sub_dir_example:具有多個子目錄的QT Creator項目的示例項目
...機器人,它將通過簡單HTTP調用發送的推送消息轉換為您可以訂閱...
TeleTelegram機器人,它將通過簡單HTTP調用發送的推送消息轉換為您可以訂閱的Telegram消息。-Golang開發 我將簡單的JSONHTTP請求轉換為Telegram推送消息,您將getelegram-middleman-bot我是@MiddleMan機器人! 我坐在您想發送的任何消息和電報之間...
clash-conf:在您的沖突訂閱中創建組、負載平衡、自動伺服器選擇...
本項目將解析vmess、ss、trojan訂閱鏈接,並將其內容轉換為clash配置文件config.yaml 所有代碼均為python 使用環境 python 3.0 需額外安裝的庫:requests 使用方法 打開並運行 按提示輸入相關信息即可 文件介紹 log... ...
Study-SUB:網路和資料庫:middle_finger_light_skin_tone:
Study-SUB-master.zip,Study-SUB-master,README.md,Study-NetWork,Day1 :: IP에 대하여.md,Day1 :: NetWork 기본용어.md,Day6 :: 프로토콜에 대하여 .md,Day5 :: Network 토폴로지 lan wan 순서.md,Day2 :: 계층별 ...
SubConfig:subconverter外部配置以及利用動作自動更新訂閱轉換
子配置 subconverter外部配置以及利用動作自動更新訂閱轉換 重點在利用動作更新訂閱轉換並發布到自己的伺服器, 入門 fork後點擊右上角的Star星星按鈕即可試用,需要使用發布功能的話需要配置幾個秘密 SUBSCRIBE訂閱鏈接,一行一個訂閱,支持tg格式的http代理socks5代理, tg://http?server=1.2.3.4&port=233&user=user&pass=pass&remarks=Example UPLOAD_SECRET配置生成打包壓縮後加密時用的aes密鑰,由如下命令生成的單行的base64字元串, head -c 32 /dev/urandom | base64 > upload_secret DEPLOY_URL發布的上傳地址,腳本目錄中有php寫的接收端,作用是接收加密的配置解密解壓後發布到內部伺服器上, https://host/u
TeleTelegram機器人,它將通過簡單HTTP調用發送的推送消息轉換為您...
webhook2telegram:Tele一個Telegram機器人,它將通過簡單HTTP調用的推送消息轉換為您可以訂閱的Telegram消息 webhook2電報 (以前是電報-中間人-機器人) 可將簡單的JSONHTTP請求轉換為Telegram推送消息,您將在智能手機,PC或任何擁有的Telegram客...
mqttwarn:訂閱MQTT主題(帶有通配符)和可通知的可插拔服務
關於 mqttwarn-訂閱MQTT主題並通知可插拔服務。 描述 mqttwarn訂閱任意數量的MQTT主題,並在可選地應用復雜的轉換之後將接收到的有效負載發布到一個或多個通知服務。 它帶有70多個通知處理程序插件,可用於各種通知服務,並且對進一步的貢獻...
聯通安卓免流
聯通安卓免流
免流專用移動電信聯通免費流量
來自承諾的更新:免流多線程工具 v2.0 (去除更新優化版) 這款工具的最大亮點在於掃描的速度非常之快,相信大家會喜歡的。
Menu_Sub_Menu_Template:Menu Sub菜單控制台應用程序系統。 在C ++中
Menu_Sub_Menu_Template:Menu Sub菜單控制台應用程序系統。 在C ++中
提取均值信號特徵的matlab代碼-CHALL_21_SUB_A1B:CHALL_21_SUB_A1B
CHALL_21_SUB_A1B-main.zip,CHALL_21_SUB_A1B-main,cre_TAB_labels.m,my_test_model.m,test_model.m,train_model.m,NEW_NET_06L.mat,my_train_model.m,extract_data_from_header.m,last_ECG_preproc.m,get_12ECG_...
MADA_DPC_sub_supfinal_.mdl_sub_dtc_brainod
MADA_DPC_sub_supfinal_.mdl_sub_dtc_brainodl_INDUCTIONGENERATOR_源碼.rar.rar
sub_1.rar_1X18"SUB_sub_vhdl
sub_1 subtractor 1 bit xxxxxxxxxxxx
MADA_DPC_sub_supfinal_.mdl_sub_dtc_brainodl_INDUCTIONGENERATOR_源
MADA_DPC_sub_supfinal_.mdl_sub_dtc_brainodl_INDUCTIONGENERATOR_源碼.zip
sub_circuit_test_sub_sub-circuit_proteus_
proteus project file to create sub circuit
adder_sub_struct.rar_adder_adder_sub_struct_sub_vhd_vhdl
adder sub struct by vhdl
ClashToV2:把Clash的訂閱轉換為一行一個分享鏈接
ClashToV2 把Clash的訂閱轉換為一行一個分享鏈接 使用
子轉換器:在各種訂閱格式之間轉換的實用程序
子轉換器:在各種訂閱格式之間轉換的實用程序
手機訂閱問題
根據測試用例整理出來的測試問題.大首頁與所有留學國家頻道公告區,NEW的標志去掉,城市名稱與第一排對齊 測試
AutoLabel:網路威脅情報自動標注系統
10:「 counter_measure」, 11:「 sub_activity」, 12:「 IP_evil」, 13:「 IP」, 14:「 domain_evil」, 15:「域」, 16:「 attack_goal」, 17:「時間」, 18:「工具」, 19:「功能」, 20:「 ...
Exploratory_data_analysis_week1:第1周的作業
Exploratory_data_analysis_week1 第1周的作業 介紹 該分配使用來自數據, 庫是機器學習數據集的流行存儲庫。 特別是,我們將使用我在課程網站上提供的「個人家庭... Sub_metering_1 :能量子計量1號(以有功電能的瓦
Exploratory_Data_Analysis_week1:Coursera Hopkins探索性數據分析課程工作的回購(第1周)
*此文件是從rdpeng的README.md復制而來的介紹該...電壓:分鍾平均電壓(伏特) Global_intensity :家庭全球分鍾平均電流強度(以安培為單位) Sub_metering_1 :1號能量子計量表(有功電能的瓦特小時)。 它對應於廚房
博客園安卓客戶端
這是一款博客園安卓客戶端,能幫助喜歡用博客園的用戶更快捷的使用博客員。
一個注冊碼的演算法反編
Sub cmdReg_Click() 'N * ref: __vbaExceptHandler 'N * ref: __vbaObjSet 'N * ref: __vbaHresultCheckObj 'N * ref: __vbaFreeObj 'N * ref: __vbaObjSet 'N * ref: __vbaHresultCheckObj 'N * ref: __vbaFreeObj ...
樂曲演奏器vhdl設計
q <= sub_wire0(3 DOWNTO 0); lpm_rom_component : lpm_rom GENERIC MAP ( intended_device_family => "ACEX1K", lpm_address_control => "REGISTERED", lpm_file => "music.hex", lpm_outdata => ...
網站banner圖輪播效果 js
.sub_nav{width:663px; height:25px; bottom:0px; position:absolute; color:#999999; z-index:200;} .sub_no{height:25px; float:right;} .sub_no li{display:block; width:25px; height:25px; float:left; ...
ZeroMQ-XOP:ZeroMQ XOP使Igor Pro可以使用ZeroMQ消息傳遞層和JSON作為消息格式通過網路進行介面
:cpp:func:zeromq_sub_add_filter :cpp:func:`zeromq_sub_connect` :cpp:func:zeromq_sub_recv :cpp:func:zeromq_sub_remove_filter 安裝 視窗 退出Igor Pro 將vcredist軟體包安裝在「 output / ...
評論
立即下載 vip 低至0.43元/次送3個月+抽豪禮

C. php代碼加密怎麼解密

$key="Thisissupposedtobeasecretkey!!!";
functionkeyED($txt,$encrypt_key)
{
$encrypt_key=md5($encrypt_key);
$ctr=0;
$tmp="";
for($i=0;$i<strlen($txt);$i++){
if($ctr==strlen($encrypt_key))$ctr=0;
$tmp.=substr($txt,$i,1)^substr($encrypt_key,$ctr,1);
$ctr++;
}
return$tmp;
}
functionencrypt($txt,$key)
{
srand((double)microtime()*1000000);
$encrypt_key=md5(rand(0,32000));
$ctr=0;
$tmp="";
for($i=0;$i<strlen($txt);$i++){
if($ctr==strlen($encrypt_key))$ctr=0;
$tmp.=substr($encrypt_key,$ctr,1).
(substr($txt,$i,1)^substr($encrypt_key,$ctr,1));
$ctr++;
}
returnkeyED($tmp,$key);
}
functiondecrypt($txt,$key)
{
$txt=keyED($txt,$key);
$tmp="";
for($i=0;$i<strlen($txt);$i++){
$md5=substr($txt,$i,1);
$i++;
$tmp.=(substr($txt,$i,1)^$md5);
}
return$tmp;
}
$string="HelloWorld!!!";
//encrypt$string,andstoreitin$enc_text
$enc_text=encrypt($string,$key);
//decrypttheencryptedtext$enc_text,andstoreitin$dec_text
$dec_text=decrypt($enc_text,$key);

//加密
functionstr2hex($s)
{
$r="";
$hexes=array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f");
for($i=0;$i<strlen($s);$i++)=""$r.=($hexes[(ord($s{$i})>>4)].$hexes[(ord($s{$i})&0xf)]);
return$r;
}

//解密
functionhex2str($s)
{
$r="";
for($i=0;$i<strlen($s);$i=""+="2)"{
$x1=ord($s{$i});
$x1=($x1>=48&&$x1<58)?$x1-48:$x1-97+10;
$x2=ord($s{$i+1});
$x2=($x2>=48&&$x2<58)?$x2-48:$x2-97+10;
$r.=chr((($x1<<4)&0xf0)|($x2&0x0f));
}
return$r;
}
echostr2hex("山東");
echo"
";
echohex2str("c9bdb6ab");
?>

熱點內容
平板拷貝如何緩存 發布:2025-08-16 23:19:05 瀏覽:599
繽越混動有哪些配置 發布:2025-08-16 23:17:57 瀏覽:247
刪除linux文件後 發布:2025-08-16 23:09:04 瀏覽:648
采訪時的采訪問題 發布:2025-08-16 23:07:27 瀏覽:110
電腦客戶端登錄伺服器怎麼清除 發布:2025-08-16 22:55:46 瀏覽:525
壓縮小木條 發布:2025-08-16 22:55:41 瀏覽:20
存款利率演算法 發布:2025-08-16 22:48:44 瀏覽:588
php開發api介面 發布:2025-08-16 22:47:48 瀏覽:839
將ssd轉化為hdd的高速緩存 發布:2025-08-16 22:39:04 瀏覽:910
行程碼伺服器異常什麼時候能好 發布:2025-08-16 22:38:58 瀏覽:517