日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java封装264成flv,将H.264封装为FLV格式-Go语言中文社区

發布時間:2025/3/15 编程问答 8 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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语言中文社区的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。