1. 程式人生 > >H264包解析

H264包解析

在H.264/AVC標準中,整個系統框架被分為了兩個層面:視訊編碼層面(VCL)和網路抽象層面(NAL)。

VCL負責表示視訊資料的內容,NAL則負責格式化資料並提供頭資訊,以保證資料適合各種通道和儲存介質上的傳輸。

在VCL資料傳輸或儲存之前,這些編碼的VCL資料,先被對映或封裝進NAL單元中。

NAL單元是NAL的基本語法結構,它包含一個位元組的頭資訊和一系列來自VCL的稱為原始位元組序列載荷的位元組流(RBSP)。

H264碼流結構圖:


起始碼:如果NALU對應的slice為一幀的開始,NAL則用4位元組表示,即0x00 00 00 01,負責用3位元組表示:0x00 00 01。

NAL Header:forbidden_bit,nal_reference_bit(優先順序),nal_unit_type(型別)。

脫殼操作:為了使NALU主體不包括起始碼,在編碼時每遇到兩個位元組(連續)的0,就插入一位元組0x03,以和起始碼區別。

NAL單元解碼流程:


流程為:首先從NAL單元中提取出RBSP結構流,然後根據NALU型別處理RBSP資料。

從h264原檔案中分離出NAL資料,用c程式碼的一種實現方式:

int FindStartCode (unsigned char *Buf, int zeros_in_startcode)
{
  int info;
  int i;

  info = 1;
  for (i = 0; i < zeros_in_startcode; i++)
    if(Buf[i] != 0)
      info = 0;

  if(Buf[i] != 1)
    info = 0;
  return info;
}

int getNextNal(FILE* inpf, unsigned char* Buf)//開啟的檔案控制代碼,和將讀取的位元組儲存到Buf中
{
	int pos = 0;
	int StartCodeFound = 0;
	int info2 = 0;
	int info3 = 0;
	int i = 0;
	while (!feof(inpf) && (Buf[pos++] = fgetc(inpf)) == 0);//跳過NAL頭

<span style="white-space:pre">	</span>/*通過查詢下一次的NAL頭來計算本次的NAL的長度,根據長度來讀取NAL資料包*/
	while (!StartCodeFound)
	{
		if (feof (inpf))
		{
			return pos-1;
		}
		Buf[pos++] = fgetc (inpf);
		printf("%02X\n", Buf[pos - 1]);
		info3 = FindStartCode(&Buf[pos-4], 3);
		if(info3 != 1)
			info2 = FindStartCode(&Buf[pos-3], 2);
		StartCodeFound = (info2 == 1 || info3 == 1);
	}
	fseek (inpf, -4, SEEK_CUR);
	return pos - 4;//返回的就是一個NAL的長度
}

得到NAL就可以去做相應的解碼處理了。X264提供的僅是對於h264的編碼操作,FFMPEG有解碼的實現,具體的請看我的另一篇博文,

相關推薦

H264解析

在H.264/AVC標準中,整個系統框架被分為了兩個層面:視訊編碼層面(VCL)和網路抽象層面(NAL)。 VCL負責表示視訊資料的內容,NAL則負責格式化資料並提供頭資訊,以保證資料適合各種通道和儲

H264 NAL解析

earch 劃分 格式 -i ren 框架 ade 編碼 適合 NAL全稱Network Abstract Layer,即網絡抽象層。在H.264/AVC視頻編碼標準中,整個系統框架被分為了兩個層面:視頻編碼層面(VCL)和網絡抽象層面(NAL)。其中,前者負責有效表示視頻

C++版的網絡數據解析策略(升級版)

bfd sum between protocol log class pro cli 分享 初版:http://www.cnblogs.com/wjshan0808/p/6580638.html 說明:在實現了對應的接口後該策略可以適合絕大多數的網絡數據包結構 首先,是

(七)turtlebot3導航解析

地圖導航需要啟動amcl節點和move_base節點,rviz節點。 1.amcl節點 (1)amcl接收從rviz中傳送過來的初始化位置。 initial_pose_sub_ = nh_.subscribe("initialpose", 2, &AmclNode::

Java原始碼分析——java.lang.reflect反射解析(三) 動態代理、Proxy類、WeakCache類

    代理模式是一個經常被各種框架使用的模式,比如Spring AOP、Mybatis中就經常用到,當一個類訪問另外一個類困難時,可通過一個代理類來間接訪問,在Java中,為了保證程式的簡單性,代理類與目標類需要實現相同的介面。也就是說代理模式起

Java原始碼分析——java.lang.reflect反射解析(二) Array類,陣列的建立

    在Java中,引用型別中有那麼幾個特殊的類,Object類是所有類的起源、Class類定義所有類的抽象與行為、ClassLoader類實現了類從.class檔案中載入進jvm,而Array陣列類,則實現了陣列手動的建立。  &

Java原始碼分析——java.lang.reflect反射解析(一) AccessibleObject、ReflectionFactory、Filed、Method、Constructor類

    Java的反射機制一直是被人稱讚的,它的定義是:程式在執行中時,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性。簡單的來說就是可以通過Java的反射機制知道自己想知道的類的一切資訊。

Java8 java.util.function解析(Function,Consumer,Predicate,Supplier)

Java8的工具包新增了function包,裡面主要包含了Function,Consumer,Predicate,Supplier四種類。 一、Function類 Function類包含四種方法,其中一個抽象方法apply(),兩個default方法andThen()和compose()

ble Peripheral 角色 5 種廣播解析

cc2541 協議棧: ------------------------------------------------------------------------------------------ /** @defgroup GAP_ADVERTISEMENT_REPORT

華為手機 android8.0APP更新時出現安裝解析異常的提示及安裝閃退(無反應)問題

apk span nload sdk add ati lag 正常 activit 在做android app升級更新時遇到幾個問題,我用的測試機是華為V10 系統為8.0 一、安裝閃退(無反應) 解決辦法: 只要在Mainfest.xml 中加入權限編碼即可解決 &

C++實現tar解析

原文地址:https://blog.csdn.net/fengbingchun/article/details/54773586?utm_source=copy tar(tape archive)是Unix和類Unix系統上檔案打包工具,可以將多個檔案合併為一個檔案,使用tar工具打出來的包稱為

Java原始碼分析——java.util工具解析(五)——UUID、Base64、內建觀察者模式Observer介面、EventListener、RandomAccess

UUID     關於UUID,我們需要知道它最重要的一點,就是它會生成全地球唯一的一個id,它可以作為資料庫的主鍵存在,標識各個元組。 UUID保證對在同一時空中的所有機器都是唯一的,利用機器的當前日期和時間、時鐘序列、全域性唯一的IEEE機

Java原始碼分析——java.util工具解析(四)——四大引用型別以及WeakHashMap類解析

    WeakHashMap是Map的一種很獨特的實現,從它的名字可以看出,它是存貯弱引用的對映的,先來複習一下Java中的四大引用型別: 強引用:我們使用的大部分引用實際上都是強引用,這是使用最普遍的引用。強引用的物件垃圾回收器絕不

Java原始碼分析——java.util工具解析(三)——HashMap、TreeMap、LinkedHashMap、Hashtable類解析

    Map,中文名字對映,它儲存了鍵-值對的一對一的關係形式,並用雜湊值來作為存貯的索引依據,在查詢、插入以及刪除時的時間複雜度都為O(1),是一種在程式中用的最多的幾種資料結構。Java在java.util工具包中實現了Map介面,來作為各大

Java原始碼分析——java.util工具解析(二)——HashSet、TreeSet、LinkedHashSet類解析

    Set,即集合,與數學上的定義一樣,集合具有三個特點: 無序性:一個集合中,每個元素的地位都是相同的,元素之間是無序的。 互異性:一個集合中,任何兩個元素都認為是不相同的,即每個元素只能出現一次。 確定性:給定一個集

Java原始碼分析——java.util工具解析(一)——ArrayList、LinkedList、Vector類解析

    Java中,List列表類與Set集合類的共同源頭是Collection介面,而Collection的父介面是Iterable介面,在Collection介面下又實現了三個常用的介面以及一個抽象方法,分別為Queue介面、List介面、Se

HTTP抓解析

HTTP抓包 * Http請求部分: * 請求行:請求方式 請求路徑 協議版本. * 請求方式: * 請求有很多.常用的是GET和POST. * 區別:get引數會顯示到位址列,post引數

Go語言判斷檔案是否存在與常用解析

一、判斷檔案是否存在: package main import ( "fmt" "os" ) /* 判斷檔案是否存在:存在,返回true,否則返回false */ //方法1 func IsFileExist(filename string) bool { info, err := os

單通道ECG資料解析

print('-------------單通道ECG 資料包 解析!--------------------') with open('C:/Users/Liu/Desktop/abcd.txt','r') as file: list = file.readlines

FFMPEG.H264解碼解析-轉自雷神

本文分析FFmpeg的H.264解碼器的主幹部分。“主幹部分”是相對於“熵解碼”、“巨集塊解碼”、“環路濾波”這些細節部分而言的。它包含了H.264解碼器直到decode_slice()前面的函式呼叫關係(decode_slice()後面就是H.264解碼器的細節部分