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

簡(jiǎn)介

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

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

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

在這里插入圖片描述

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的版本號(hào);
  • Flags:標(biāo)識(shí)。第0位和第2位分別表示視頻和音頻,若為0x05,則表示既有音頻,也有視頻;
  • DataOffset:flv header的長(zhǎng)度;

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

flv body

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

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

flv tag分為3種類型:

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

FrameType + CodecID總共為1個(gè)字節(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

當(dāng) CodecID 為 7 時(shí),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,則為時(shí)間cts偏移量;否則,為0
Data不定1)AVCPacketType=0,則為AVCDecoderConfigurationRecord
2)AVCPacketType=1,則為NALU(一個(gè)或多個(gè))
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采樣率,對(duì)AAC來說,永遠(yuǎn)等于3
0:5.5-kHz
1:11-kHz
2:22-kHz
3:44-kHz
SoundSize1 bits采樣精度,對(duì)于壓縮過的音頻,永遠(yuǎn)是16位
0:snd8Bit
1:snd16Bit
SoundType1 bits聲道類型,對(duì)Nellymoser來說,永遠(yuǎn)是單聲道;對(duì)AAC來說,永遠(yuǎn)是雙聲道;
0:sndMono 單聲道
1:sndStereo 雙聲道
SoundData不定如果是AAC,則為 AACAUDIODATA;

AACAUDIODATA

當(dāng) SoundFormat 為10時(shí),表示音頻采AAC進(jìn)行編碼,此時(shí),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é)永遠(yuǎn)是9,標(biāo)識(shí)著Script Data的結(jié)束
SCRIPTDATAOBJECT
字段大小含義
ObjectNameSCRIPTDATASTRING對(duì)象的名字
ObjectDataSCRIPTDATAVALUE對(duì)象的值
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ù)組長(zhǎng)度
ScriptDataValueIf Type == 0 DOUBLE If Type == 1 UI8 If Type == 2 SCRIPTDATASTRING …(有點(diǎn)長(zhǎng),可以參考規(guī)范)變量的值
ScriptDataValueTerminator如果Type3,則為SCRIPTDATAOBJECTEND 如果 Type8,則為SCRIPTDATAVARIABLEENDObject、Array的結(jié)束符
MetaData

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

第一個(gè)AMF:

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

第二個(gè)AMF:

  • 第1個(gè)字節(jié):0x08,表示數(shù)組類型;
  • 第2-5個(gè)字節(jié):表示數(shù)組的長(zhǎng)度,onMetaData中具體包含哪些屬性是不固定的。
  • 第6個(gè)字節(jié)+:比如duration,則:
    • 第6-9個(gè)字節(jié):0x0008,表示長(zhǎng)度為8個(gè)字節(jié);
    • 第10-17個(gè)字節(jié):0x6475 7261 7469,表示 duration 這個(gè)字符串;
    • 第18個(gè)字節(jié):0x00,表示為數(shù)值類型;
    • 第19-26個(gè)字節(jié):0x…,表示具體的時(shí)長(zhǎng);
字段大小含義
durationDOUBLE文件的時(shí)長(zhǎng)
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海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

本文名稱:音視頻學(xué)習(xí)(十三)——flv詳解-創(chuàng)新互聯(lián)
網(wǎng)站網(wǎng)址:http://m.kartarina.com/article18/eoigp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站網(wǎng)站建設(shè)品牌網(wǎng)站設(shè)計(jì)網(wǎng)站改版定制網(wǎng)站App設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
主站蜘蛛池模板: 亚洲av片不卡无码久久| 18禁无遮挡无码网站免费| 日韩AV高清无码| 成在人线av无码免费高潮喷水| 无码aⅴ精品一区二区三区浪潮| 麻豆精品无码国产在线果冻| 久久久无码精品亚洲日韩蜜桃| 无码成人AAAAA毛片| 日韩亚洲AV无码一区二区不卡 | 精品人妻中文无码AV在线| 国产精品无码无片在线观看| 日韩乱码人妻无码中文视频| 久久久久久无码Av成人影院| 潮喷无码正在播放| 成人免费无遮挡无码黄漫视频| 久久亚洲AV成人无码国产| 日日摸夜夜爽无码毛片精选| 好爽毛片一区二区三区四无码三飞| 亚洲成AV人在线播放无码| 精品无码久久久久久久久水蜜桃| 久久久无码精品亚洲日韩京东传媒| 亚洲日韩精品A∨片无码| 本免费AV无码专区一区| 亚洲AV永久无码精品放毛片| 久热中文字幕无码视频| 秋霞无码一区二区| 国产午夜无码视频在线观看| 亚洲日韩中文无码久久| 中文无码日韩欧免费视频| 国模无码一区二区三区不卡| 一本大道久久东京热无码AV| 日韩经典精品无码一区| 一本大道无码日韩精品影视 | 亚洲AV永久无码精品成人| 国产成人麻豆亚洲综合无码精品| 亚洲成?v人片天堂网无码| 国产精品无码永久免费888| 国产精品无码素人福利不卡| 亚洲精品无码Av人在线观看国产| 亚洲中文字幕无码一区二区三区 | 亚洲精品无码久久一线|