全稱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示例:
flv body主要由PreviousTagSize和Tag組成,有以下約定:
flv tag分為3種類型:
字段 | 大小 | 含義 |
---|---|---|
TagType | 1字節(jié) | tag類型。 音頻:0x08 視頻:0x09 script data:0x12 |
Datasize | 3字節(jié) | tag data的大小 |
Timestamp | 3字節(jié) | 該tag的時間戳 |
TimestampExtended | 1字節(jié) | 時間戳擴展字節(jié)。當24位數(shù)值不夠時,該字節(jié)最高位將時間戳擴展為32位 |
StreamID | 3字節(jié) | 總為0 |
TagData | 不定 | 取決于TagType |
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 的定義如下:
字段 | 大小 | 含義 |
---|---|---|
AVCPacketType | 1字節(jié) | 0:AVC sequence header 1:AVC NALU 2:AVC end of sequence |
CompositionTime | 3字節(jié) | 如果AVCPacketType=1,則為時間cts偏移量;否則,為0 |
Data | 不定 | 1)AVCPacketType=0,則為AVCDecoderConfigurationRecord 2)AVCPacketType=1,則為NALU(一個或多個) 3)AVCPacketType=2,則為空 |
示例:
audio tag dataSoundFormat + SoundRate + SoundSize + SoundType = 1字節(jié)
字段 | 大小 | 含義 |
---|---|---|
SoundFormat | 4 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 |
SoundRate | 2 bits | 采樣率,對AAC來說,永遠等于3 0:5.5-kHz 1:11-kHz 2:22-kHz 3:44-kHz |
SoundSize | 1 bits | 采樣精度,對于壓縮過的音頻,永遠是16位 0:snd8Bit 1:snd16Bit |
SoundType | 1 bits | 聲道類型,對Nellymoser來說,永遠是單聲道;對AAC來說,永遠是雙聲道; 0:sndMono 單聲道 1:sndStereo 雙聲道 |
SoundData | 不定 | 如果是AAC,則為 AACAUDIODATA; |
AACAUDIODATA
當 SoundFormat 為10時,表示音頻采AAC進行編碼,此時,SoundData的定義如下:
字段 | 大小 | 含義 |
---|---|---|
AACPacketType | 1 bits | 0:AAC sequence header 1:AAC raw |
Data | 不定 | 如果AACPacketType為0,則為AudioSpecificConfig 如果AACPacketType為1,則為AAC幀數(shù)據(jù) |
AudioSpecificConfig
字段 | 大小 | 含義 |
---|---|---|
AudioObjectType | 5 bits | 編碼器類型,比如2表示AAC-LC |
SamplingFrequencyIndex | 4 bits | 采樣率索引值,比如4表示44100 |
SamplingFrequencyIndex | 4 bits | 采樣率索引值,比如4表示44100 |
ChannelConfiguration | 4 bits | 聲道配置,比如2代表雙聲道,front-left, front-right |
示例:
script tag data 定義主要用來存放音視頻數(shù)據(jù)的元數(shù)據(jù)信息(MetaData)。采用AMF(Action Message Format)封裝了一系列數(shù)據(jù)類型,比如字符串、數(shù)值、數(shù)組等。
字段 | 大小 | 含義 |
---|---|---|
Objects | SCRIPTDATAOBJECT[] | 任意數(shù)目的 SCRIPTDATAOBJECT |
SCRIPTDATAOBJECTEND | 3字節(jié) | 永遠是9,標識著Script Data的結(jié)束 |
字段 | 大小 | 含義 |
---|---|---|
ObjectName | SCRIPTDATASTRING | 對象的名字 |
ObjectData | SCRIPTDATAVALUE | 對象的值 |
字段 | 字段類型 | 字段含義 |
---|---|---|
Type | SCRIPTDATASTRING | 變量類型: 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ù)組長度 |
ScriptDataValue | If Type == 0 DOUBLE If Type == 1 UI8 If Type == 2 SCRIPTDATASTRING …(有點長,可以參考規(guī)范) | 變量的值 |
ScriptDataValueTerminator | 如果Type3,則為SCRIPTDATAOBJECTEND 如果 Type8,則為SCRIPTDATAVARIABLEEND | Object、Array的結(jié)束符 |
MetaData中包含了音視頻相關(guān)的元數(shù)據(jù),封裝在Script Data Tag中,它包含了兩個AMF。
第一個AMF:
第二個AMF:
字段 | 大小 | 含義 |
---|---|---|
duration | DOUBLE | 文件的時長 |
width | DOUBLE | 視頻寬度(px) |
height | DOUBLE | 視頻高度(px) |
videodatarate | DOUBLE | 視頻比特率(kb/s) |
framerate | DOUBLE | 視頻幀率(幀/s) |
videocodecid | DOUBLE | 視頻編解碼器ID(參考Video Tag) |
audiosamplerate | DOUBLE | 音頻采樣率 |
audiosamplesize | DOUBLE | 音頻采樣精度(參考Audio Tag) |
stereo | BOOL | 是否立體聲 |
audiocodecid | DOUBLE | 音頻編解碼器ID(參考Audio Tag) |
filesize | DOUBLE | 文件總得大?。ㄗ止?jié)) |
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)查看詳情吧