java封装264成flv,将H.264封装为FLV格式-Go语言中文社区
本文將介紹如何將H.264封裝成flv格式。
在看本文之間,建議先看一看下面兩篇文章:
首先說一說構建一個FLV文件需要什么?
FLV Header + FLv script tag + FLV Video tag + FLV Audio tag
由于這里只是封裝H.264,所以不包括Audio tag。
下面將通過分析示例來說明FLV Header + FLv script tag + FLV Video tag這三部分如何構建。
1、FLV Header
通過閱讀上面的文章《FLV格式詳解》應該就很清楚FLV Header的內容了。
下面來分析一個實例:
Signature:0x46('F')
Signature:0x4c('L')
Signature:0x56('V')
Version:01
Flags:01
TypeFlagsReserved [Bit 3-7]:0
TypeFlagsAudio [Bit 2]:0
TypeFlagsReserved [Bit 1]:0
TypeFlagsVideo [Bit 0]:1
DataOffset:00 00 00 09
preTagSize:00 00 00 00 // 第一個tag默認為0
2、FLv script tag
又稱Metadata Tag,位于flv header后的第一個tag
下面來分析一個實例
Tag Header:
TagType:12(表示這是一個script tag)
Datasize:00 00 9f(Tag Data 部分的大小)
Timestamp:00 00 00(該Tag的時間戳)
Timestamp_ex:00(時間戳的擴展部分)
StreamID::00 00 00(總是0)
Tag data:
因為TagType為0x12,所以這部分的數據為兩個AMF包
第一個AMF包:
type:02(表示字符串)
stringLen:00 0a(字符串長度為10)
string:6f 6e 4d 65 74 61 44 61 74 61(onMetaData)
第二個AMF包:
type:08(表示數組)
arrayNum:00 00 00 07(數組元素個數)
stringLen:00 08(第一個數組元素字符串長度)
string:64 75 72 61 74 69 6f 6e(duration)
valType:00(數據類型,double型)
val:40 03 70 a3 d7 0a 3d 71(double型)
stringLen:00 05
string:77 69 64 74 68(width)
...
end:00 00 09
preTagSize:00 00 00 aa
3、FLV Video Tag
這部分封裝著圖像數據,也就是H.264的數據封裝在這里。
H.264是由一個一個NALU組成,NALU的類型有(SPS、PPS、I幀的SLICE、非I幀的SLICE)
封裝H.264就是將這些NALU一個一個取出來,然后封裝成Tag。
需要注意的是,SPS與PPS必須封裝在一個Tag中。
下面分別通過實例來分析各種NALU(SPS、PPS、I幀的SLICE、SEI、非I幀的SLICE)是怎么封裝的。
1、SPS與PPS
Tag Header:
TagType:09(Tag的類型,包括音頻(0x08)、視頻(0x09)、script data(0x12))
Datasize:00 00 2e(Tag Data 部分的大小)
Timestamp:00 00 00(時間戳,19ms)
Timestamp_ex:00(時間戳的擴展部分)
StreamID:00 00 00(總是0)
Tag data:
FrameType | CodecID:17(keyframe | AVC)(視頻tag的參數)
AVCVideoPaket:(因為CodecID==7,所以VideoData為AVCVideoPaket)
AVCPaketType:00(ACVPacket的類型,0: AVC sequence header;1: AVC NALU;2: AVC end of sequence)
CompositionTime:00 00 00
(因為ACVPaketType==0,所以Data=AVCDecoderConfigurationRecord)
AVCDecoderConfigurationRecord:
configurationVersion:01
AVCProfileIndication:64
profile_compatibility:00
AVCLevelIndication:1e
lengthSizeMinusOne:ff
numOfSequenceParameterSets:e1(低五位為SPS的個數,計算方法為:numOfSequenceParameterSets & 0x1F=1)
sequenceParameterSetLength:00 18(SPS的長度,24)
sequenceParameterSetNALUnits:67 64 00 1e ac d9 40 a0 33 b0 11 00 00 03 02 47 00 00 6d 34 0f 16 2d 96(SPS)
numOfPictureParameterSets:01(PPS的個數)
pictureParameterSetLength:00 06(PPS的長度)
pictureParameterSetNALUnits:68 eb e3 cb 22 c0(PPS)
previousTagSize:00 00 00 39
2、I幀的SLICE
Tag Header:
TagType:09(Tag的類型,包括音頻(0x08)、視頻(0x09)、script data(0x12))
Datasize:00 35 78(Tag Data 部分的大小)
Timestamp:00 00 0a(時間戳,19ms)
Timestamp_ex:00(時間戳的擴展部分)
StreamID:00 00 00(總是0)
Tag data:
FrameType | CodecID:17(key frame | AVC)(視頻tag的參數)
因為CodecID==7,所以VideoData為AVCVideoPaket
AVCVideoPaket:
AVCPaketType:01(ACVPacket的類型,0: AVC sequence header;1: AVC NALU;2: AVC end of sequence)
CompositionTime:00 00 0a
NaluLen:00 00 35 6f
NaluData:...
preTagSize:00 00 35 83
對于SEI的封裝跟I幀是一樣的。
3、非I幀的SLICE
非I幀的封裝格式和I幀的封裝格式基本一樣,唯一不同的是FrameType | CodecID:部分,應該設置為:
FrameType | CodecID:27(inter frame | AVC)(視頻tag的參數)
總結:以上通過實例講解了FLV的頭部信息,script tag,以及H.264不同類型的NALU如何封裝成tag,下面放出源碼。
總結
以上是生活随笔為你收集整理的java封装264成flv,将H.264封装为FLV格式-Go语言中文社区的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 叶县有没有计算机培训学校,叶县中等专业学
- 下一篇: 网络发现不了计算机 但是输入IP可以看到