1. 程式人生 > >rtmp 協議中對視訊格式的封裝

rtmp 協議中對視訊格式的封裝

前面有一篇文章 http://blog.csdn.net/ddr77/article/details/52680120

分析了對音訊的封裝。最近做專案,發現需要對視訊做一些比較深的理解。


這段資料代表了什麼?

04 表示0型別的chunk ,04表示音訊或者視訊資料。具體看下面

000000 三個自己的時間戳

00002f 資料長度,表示後面的msg長度,不包括這個頭。

09 表示是視訊資料。

01000000 表示流id,小段表示

17 換成二進位制位 00010111

0001 表示關鍵幀。

其他值位

0010 p幀

其他都不用

0111 表示是avc編碼器。

rtmp 對於h264有自己的封裝格式表示,具體為

wkiom1qjxgtxhxcgaahivqstyqy918.jpg

在這個包裡面,第一個位元組為0 ,後三個位元組也是0 ,那麼這四個表示後面的資料上一個配置

具體如下


一共是7個位元組,跳過這其他位元組,就是真正264s資料。

具體分析“avcvideopacket”的圖片搜尋結果

根據 AVCDecoderConfigurationRecord 結構的定義:

  • configurationVersion = 01
  • AVCProfileIndication = 4D
  • profile_compatibility = 40
  • AVCLevelIndication = 29
  • lengthSizeMinusOne = FF <- 非常重要,是 H.264 視訊中 NALU 的長度,計算方法是 1 + (lengthSizeMinusOne & 3),實際計算結果一直是4
  • numOfSequenceParameterSets = E1
     <- SPS 的個數,計算方法是 numOfSequenceParameterSets & 0x1F,實際計算結果一直為1
  • sequenceParameterSetLength = 00 1b <- SPS 的長度 27個位元組
  • sequenceParameterSetNALUnits = 67 4D 40 29 ec a0 50 1e d3 50 10 d0 63 00 00 03 00 04 00 00 03 00 7a 3c 60 c6 58 <- SPS
  • numOfPictureParameterSets = 01 <- PPS 的個數,一直為1
  • pictureParameterSetLength = 00 04 <- PPS 的長度
  • pictureParameterSetNALUnits = 68 Ef bc 80 <- PPS
推薦一篇文章 點選開啟連結

下面分析264的sps  pps 

67  == 011 00111 

011 基本不管,

00111=7 表示sps 的意思

其他含義如下

#define NALU_TYPE_SLICE    1
#define NALU_TYPE_DPA      2
#define NALU_TYPE_DPB      3
#define NALU_TYPE_DPC      4
#define NALU_TYPE_IDR      5
#define NALU_TYPE_SEI      6
#define NALU_TYPE_SPS      7
#define NALU_TYPE_PPS      8
#define NALU_TYPE_AUD      9
#define NALU_TYPE_EOSEQ    10
#define NALU_TYPE_EOSTREAM 11
#define NALU_TYPE_FILL     12

接下來表示如下

profile_idc = 4d
constraint_set0_flag
constraint_set1_flag
constraint_set2_flag
constraint_set3_flag
constraint_set4_flag
constraint_set5_flag
reserved_zero_2bits =40
level_idc = 29

都是解碼器的配置,但一般我們主要關心的是活的長度和高度,那麼在哪裡呢?

前三個位元組的意思如上,從第四個位元組開始分析

具體分析看連線吧,好複雜

對於普通的視訊包的分析,也就是是說avpackettype= 1的情況的分析情況如下


和非關鍵幀資料


呢?