全稱FLASHVIDEO,是一種新的視頻格式,主要的特點(diǎn)是文件小、加載速度快。
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示例:
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的時(shí)間戳 |
TimestampExtended | 1字節(jié) | 時(shí)間戳擴(kuò)展字節(jié)。當(dāng)24位數(shù)值不夠時(shí),該字節(jié)最高位將時(shí)間戳擴(kuò)展為32位 |
StreamID | 3字節(jié) | 總為0 |
TagData | 不定 | 取決于TagType |
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 的定義如下:
字段 | 大小 | 含義 |
---|---|---|
AVCPacketType | 1字節(jié) | 0:AVC sequence header 1:AVC NALU 2:AVC end of sequence |
CompositionTime | 3字節(jié) | 如果AVCPacketType=1,則為時(shí)間cts偏移量;否則,為0 |
Data | 不定 | 1)AVCPacketType=0,則為AVCDecoderConfigurationRecord 2)AVCPacketType=1,則為NALU(一個(gè)或多個(gè)) 3)AVCPacketType=2,則為空 |
示例:
SoundFormat + 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 | 采樣率,對(duì)AAC來說,永遠(yuǎn)等于3 0:5.5-kHz 1:11-kHz 2:22-kHz 3:44-kHz |
SoundSize | 1 bits | 采樣精度,對(duì)于壓縮過的音頻,永遠(yuǎn)是16位 0:snd8Bit 1:snd16Bit |
SoundType | 1 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的定義如下:
字段 | 大小 | 含義 |
---|---|---|
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 |
示例:
主要用來存放音視頻數(shù)據(jù)的元數(shù)據(jù)信息(MetaData)。采用AMF(Action Message Format)封裝了一系列數(shù)據(jù)類型,比如字符串、數(shù)值、數(shù)組等。
字段 | 大小 | 含義 |
---|---|---|
Objects | SCRIPTDATAOBJECT[] | 任意數(shù)目的 SCRIPTDATAOBJECT |
SCRIPTDATAOBJECTEND | 3字節(jié) | 永遠(yuǎn)是9,標(biāo)識(shí)著Script Data的結(jié)束 |
字段 | 大小 | 含義 |
---|---|---|
ObjectName | SCRIPTDATASTRING | 對(duì)象的名字 |
ObjectData | SCRIPTDATAVALUE | 對(duì)象的值 |
字段 | 字段類型 | 字段含義 |
---|---|---|
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ù)組長(zhǎng)度 |
ScriptDataValue | If Type == 0 DOUBLE If Type == 1 UI8 If Type == 2 SCRIPTDATASTRING …(有點(diǎn)長(zhǎng),可以參考規(guī)范) | 變量的值 |
ScriptDataValueTerminator | 如果Type3,則為SCRIPTDATAOBJECTEND 如果 Type8,則為SCRIPTDATAVARIABLEEND | Object、Array的結(jié)束符 |
MetaData中包含了音視頻相關(guān)的元數(shù)據(jù),封裝在Script Data Tag中,它包含了兩個(gè)AMF。
第一個(gè)AMF:
第二個(gè)AMF:
字段 | 大小 | 含義 |
---|---|---|
duration | DOUBLE | 文件的時(shí)長(zhǎng) |
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海外機(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)
猜你還喜歡下面的內(nèi)容