真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

音視頻學(xué)習(十三)——flv詳解-創(chuàng)新互聯(lián)

簡介

全稱FLASHVIDEO,是一種新的視頻格式,主要的特點是文件小、加載速度快。

專注于為中小企業(yè)提供網(wǎng)站設(shè)計制作、成都做網(wǎng)站服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)綏化免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上1000+企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。結(jié)構(gòu)

flv的結(jié)構(gòu)相對簡單,可以通過下圖來初步了解其組成:

在這里插入圖片描述

flv = flv header(9字節(jié)) + flv body

flv header = Signature(3字節(jié)) + Version(1字節(jié)) + Flags(1字節(jié)) + DataOffset(4字節(jié))

flv body = PreviousTagSize0 + Tag1 + PreviousTagSize1 + Tag2 + ... + PreviousTagSizeN-1 + TagN
flv header
  • Signature:固定字符(“flv”);
  • Version:flv的版本號;
  • Flags:標識。第0位和第2位分別表示視頻和音頻,若為0x05,則表示既有音頻,也有視頻;
  • DataOffset:flv header的長度;

示例:
在這里插入圖片描述

flv body

flv body主要由PreviousTagSize和Tag組成,有以下約定:

  • PreviousTagSize0固定為0;
  • tag = tag header + tag data;
  • 若flv的版本為1,則tag header固定為11個字節(jié);
  • PreviousTagSize(除第一個)= 11 + 前一個tag的tag data的大?。?/li>

flv tag分為3種類型:

  • vedio tag:存儲視頻數(shù)據(jù);
  • audio tag:存儲音頻數(shù)據(jù);
  • script tag:存儲音視頻元數(shù)據(jù);
flv tag tag header
字段大小含義
TagType1字節(jié)tag類型。
音頻:0x08
視頻:0x09
script data:0x12
Datasize3字節(jié)tag data的大小
Timestamp3字節(jié)該tag的時間戳
TimestampExtended1字節(jié)時間戳擴展字節(jié)。當24位數(shù)值不夠時,該字節(jié)最高位將時間戳擴展為32位
StreamID3字節(jié)總為0
TagData不定取決于TagType
tag data video tag data

FrameType + CodecID總共為1個字節(jié)。

字段大小含義
FrameType前4位幀類型
1:key frame (如h264的I幀)
2:inter frame(如h264普通幀)
3:disposable inter frame
4:generated keyframe
5:video info/command frame
CodecID后四位編碼id
1:JPEG (currently unused)
2:Sorenson H.263
3:Screen video
4:On2 VP6
5:On2 VP6 with alpha channel 6: Screen video version 2
7:AVC
VideoData不定視頻數(shù)據(jù),與CodecID相關(guān)。
2:H263VIDEOPACKET
3:SCREENVIDEOPACKET
4:VP6FLVVIDEOPACKET
5:VP6FLVALPHAVIDEOPACKET
6:SCREENV2VIDEOPACKET
7:AVCVIDEOPACKE(h264媒體數(shù)據(jù))

AVCVIDEOPACKE

當 CodecID 為 7 時,VideoData 為 AVCVIDEOPACKE,為H.264媒體數(shù)據(jù)。

AVCVIDEOPACKE 的定義如下:

字段大小含義
AVCPacketType1字節(jié)0:AVC sequence header
1:AVC NALU
2:AVC end of sequence
CompositionTime3字節(jié)如果AVCPacketType=1,則為時間cts偏移量;否則,為0
Data不定1)AVCPacketType=0,則為AVCDecoderConfigurationRecord
2)AVCPacketType=1,則為NALU(一個或多個)
3)AVCPacketType=2,則為空

示例:

在這里插入圖片描述

audio tag data

SoundFormat + SoundRate + SoundSize + SoundType = 1字節(jié)

字段大小含義
SoundFormat4 bits音頻格式。
0:Linear PCM, platform endian
1:ADPCM
2:MP3
3:Linear PCM, little endian
4:Nellymoser 16-kHz mono
5:Nellymoser 8-kHz mono
6:Nellymoser
7:G.711 A-law logarithmic PCM
8 = G.711 mu-law logarithmic PCM
9 = reserved
10:AAC
11:Speex
14:MP3 8-Khz
15:Device-specific sound
SoundRate2 bits采樣率,對AAC來說,永遠等于3
0:5.5-kHz
1:11-kHz
2:22-kHz
3:44-kHz
SoundSize1 bits采樣精度,對于壓縮過的音頻,永遠是16位
0:snd8Bit
1:snd16Bit
SoundType1 bits聲道類型,對Nellymoser來說,永遠是單聲道;對AAC來說,永遠是雙聲道;
0:sndMono 單聲道
1:sndStereo 雙聲道
SoundData不定如果是AAC,則為 AACAUDIODATA;

AACAUDIODATA

當 SoundFormat 為10時,表示音頻采AAC進行編碼,此時,SoundData的定義如下:

字段大小含義
AACPacketType1 bits0:AAC sequence header
1:AAC raw
Data不定如果AACPacketType為0,則為AudioSpecificConfig
如果AACPacketType為1,則為AAC幀數(shù)據(jù)

AudioSpecificConfig

字段大小含義
AudioObjectType5 bits編碼器類型,比如2表示AAC-LC
SamplingFrequencyIndex4 bits采樣率索引值,比如4表示44100
SamplingFrequencyIndex4 bits采樣率索引值,比如4表示44100
ChannelConfiguration4 bits聲道配置,比如2代表雙聲道,front-left, front-right

示例:

在這里插入圖片描述

script tag data 定義

主要用來存放音視頻數(shù)據(jù)的元數(shù)據(jù)信息(MetaData)。采用AMF(Action Message Format)封裝了一系列數(shù)據(jù)類型,比如字符串、數(shù)值、數(shù)組等。

字段大小含義
ObjectsSCRIPTDATAOBJECT[]任意數(shù)目的 SCRIPTDATAOBJECT
SCRIPTDATAOBJECTEND3字節(jié)永遠是9,標識著Script Data的結(jié)束
SCRIPTDATAOBJECT
字段大小含義
ObjectNameSCRIPTDATASTRING對象的名字
ObjectDataSCRIPTDATAVALUE對象的值
SCRIPTDATAVALUE
字段字段類型字段含義
TypeSCRIPTDATASTRING變量類型: 0 = Number type 1 = Boolean type 2 = String type 3 = Object type 4 = MovieClip type 5 = Null type 6 = Undefined type 7 = Reference type 8 = ECMA array type 10 = Strict array type 11 = Date type 12 = Long string type
ECMAArrayLength如果Type為8(數(shù)組),則為UI32數(shù)組長度
ScriptDataValueIf Type == 0 DOUBLE If Type == 1 UI8 If Type == 2 SCRIPTDATASTRING …(有點長,可以參考規(guī)范)變量的值
ScriptDataValueTerminator如果Type3,則為SCRIPTDATAOBJECTEND 如果 Type8,則為SCRIPTDATAVARIABLEENDObject、Array的結(jié)束符
MetaData

MetaData中包含了音視頻相關(guān)的元數(shù)據(jù),封裝在Script Data Tag中,它包含了兩個AMF。

第一個AMF:

  • 第1個字節(jié):0x02,表示字符串類型;
  • 第2-3個字節(jié):值為0x000A,表示字符串的長度為10(MetaData的長度);
  • 第4-13個字節(jié):字符串MetaData對應(yīng)的16進制數(shù)字(0x6F 0x6E 0x4D 0x65 0x74 0x61 0x44 0x61 0x74 0x61);

第二個AMF:

  • 第1個字節(jié):0x08,表示數(shù)組類型;
  • 第2-5個字節(jié):表示數(shù)組的長度,onMetaData中具體包含哪些屬性是不固定的。
  • 第6個字節(jié)+:比如duration,則:
    • 第6-9個字節(jié):0x0008,表示長度為8個字節(jié);
    • 第10-17個字節(jié):0x6475 7261 7469,表示 duration 這個字符串;
    • 第18個字節(jié):0x00,表示為數(shù)值類型;
    • 第19-26個字節(jié):0x…,表示具體的時長;
字段大小含義
durationDOUBLE文件的時長
widthDOUBLE視頻寬度(px)
heightDOUBLE視頻高度(px)
videodatarateDOUBLE視頻比特率(kb/s)
framerateDOUBLE視頻幀率(幀/s)
videocodecidDOUBLE視頻編解碼器ID(參考Video Tag)
audiosamplerateDOUBLE音頻采樣率
audiosamplesizeDOUBLE音頻采樣精度(參考Audio Tag)
stereoBOOL是否立體聲
audiocodecidDOUBLE音頻編解碼器ID(參考Audio Tag)
filesizeDOUBLE文件總得大?。ㄗ止?jié))
示例

在這里插入圖片描述

示例 解析flv header
struct flv_header_t
{
	unsigned char FLV[3];
	unsigned char version;
	unsigned char audio;
	unsigned char video;
	unsigned int  offset; // data offset
};

static inline uint32_t be_read_uint32(const uint8_t* ptr)
{
	return (ptr[0]<< 24) | (ptr[1]<< 16) | (ptr[2]<< 8) | ptr[3];
}

static inline void be_write_uint32(uint8_t* ptr, uint32_t val)
{
	ptr[0] = (uint8_t)((val >>24) & 0xFF);
	ptr[1] = (uint8_t)((val >>16) & 0xFF);
	ptr[2] = (uint8_t)((val >>8) & 0xFF);
	ptr[3] = (uint8_t)(val & 0xFF);
}

int flv_header_read(struct flv_header_t* flv, const uint8_t* buf, size_t len)
{
	if (len< 9 || 'F' != buf[0] || 'L' != buf[1] || 'V' != buf[2])
	{
		assert(0);
		return -1;
	}

	flv->FLV[0] = buf[0];
	flv->FLV[1] = buf[1];
	flv->FLV[2] = buf[2];
	flv->version = buf[3];

	assert(0x00 == (buf[4] & 0xF8) && 0x00 == (buf[4] & 0x20));
	flv->audio = (buf[4] >>2) & 0x01;
	flv->video = buf[4] & 0x01;
	flv->offset = be_read_uint32(buf + 5);

	return FLV_HEADER_SIZE;
}

其他解析可參考ireader開源庫,github: https://github.com/ireader

解析工具

推薦一款解析flv格式碼流的工具:FlvAnalyzer.exe,解析效果如圖所示:

在這里插入圖片描述

部分參考:

https://www.cnblogs.com/chyingp/p/flv-getting-started.html

https://blog.51cto.com/u_13861442/5169955

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧


網(wǎng)站題目:音視頻學(xué)習(十三)——flv詳解-創(chuàng)新互聯(lián)
標題來源:http://weahome.cn/article/eoigp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部