整個庫的核心部分之一害捕。
參考:https://blog.csdn.net/g332065255/article/details/71158863
flv-demuxer.js-FLVDemuxer類-FLV解碼器
肯定有個什么mp4-demuxer
-
屬性分為基本屬性、媒體信息、事件處理函數(shù),構(gòu)造函數(shù)傳 probeData 和 config
- 1.1 基本屬性
- 1.1.1 TAG 構(gòu)造器名稱
- 1.1.2 _config 全局配置,初始化為 conifg
- 1.1.3 _littleEndian 判斷當前是否支持小端
- 1.2 媒體信息
- 1.2.1 _dataOffset 數(shù)據(jù)偏移量,初始化為 probeData.dataOffset
- 1.2.2 _firstParse 是否首次解析,初始化為 true
- 1.2.3 _dispatch 是否已分發(fā)玫坛,初始化為 false
- 1.2.4 _hasAudio 是否有音軌,初始化為 probeData.hasAudioTrack
- 1.2.5 _hasVideo 是否有視軌包晰,初始化為 probeData.hasVideoTrack
- 1.2.6 _audioInitialMetadataDispatched 音頻初始元數(shù)據(jù)是否分發(fā)湿镀,初始化為 false
- 1.2.7 _videoInitialMetadataDispatched 視頻初始元數(shù)據(jù)是否分發(fā),初始化為 false
- 1.2.8 _mediaInfo 媒體信息伐憾,初始化為 MediaInfo 的實例勉痴,并合并視頻的是否有音軌和是否有視軌屬性
- 1.2.9 _metadata 元數(shù)據(jù),初始化為 null
- 1.2.10 _audioMetadata 音頻元數(shù)據(jù)树肃,初始化為 null
- 1.2.11 _videoMetadata 視頻元數(shù)據(jù)蒸矛,初始化為 null
- 1.2.12 _naluLengthSize nalu 長度,初始化為 4
- 1.2.13 _timestampBase 基本時間戳,初始化為 0雏掠,關(guān)聯(lián)了實例的 timestampBase 屬性
- 1.2.14 _timescale 時間步長斩祭,初始化為 1000
- 1.2.15 _duration 持續(xù)時間,初始化為 0
- 關(guān)聯(lián)了實例的 overridedDuration 屬性乡话,set 的時候除了改變實例持續(xù)時間還會改變實例持續(xù)時間是否覆蓋屬性為 true摧玫、實例媒體信息的持續(xù)時間為它
- 1.2.16 _durationOverrided 持續(xù)時間是否覆蓋,初始化為 false
- 1.2.17 _referenceFrameRate 參考幀率蚊伞,初始化為
{ fixed: true, fps: 2- 3.976, fps_num: 23976, fps_den: 1000 }
- 1.2.18 _videoTrack 視軌席赂,初始化為
{type: 'video', id: 1, sequenceNumber: 0, samples: [], length: 0}
- 1.2.19 _audioTrack 音軌,初始化為
{type: 'audio', id: 2, sequenceNumber: 0, samples: [], length: 0}
- 1.3 事件處理函數(shù)时迫,初始化都為 null,都關(guān)聯(lián)了實例的對應(yīng)屬性
- 1.3.1 _onError 出錯事件處理函數(shù)
- 1.3.2 _onMediaInfo 媒體信息事件處理函數(shù)
- 1.3.3 _onTrackMetadata 軌道元數(shù)據(jù)事件處理函數(shù)
- 1.3.4 _onDataAvailable 數(shù)據(jù)可用事件處理函數(shù)
- 1.4 靜態(tài)屬性方法
- 1.4.1 probe(buffer) 探測數(shù)據(jù)能不能解析
- 1.4.1.1 創(chuàng)建 data 作為 buffer 的視圖谓晌,類型為 Uint8Array
- 1.4.1.2 如果 data 前四位不是 0x464c5601(flv頭)掠拳,說明不能解析,結(jié)束
- 1.4.1.3 探測是否有音軌纸肉,依據(jù)是將 data 的第五位和 4 與運算再有符號右移 2 位不為 0
- 1.4.1.4 探測是否有視軌溺欧,依據(jù)是將 data 的第五位和 1 與運算不為 0
- 1.4.1.5 如果既沒有音軌也沒有視軌,說明不能解析柏肪,結(jié)束
- 1.4.1.6 通過大端 32 位法讀 data姐刁,index 傳 5,獲取 offset
- 1.4.1.7 如果 offset 小于 9烦味,說明不能解析聂使,結(jié)束
- 1.4.1.8 返回一個對象:
{ match: true, consumed: offset, dataOffset: offset, hasAudioTrack: hasAudio, hasVideoTrack: hasVideo }
- 1.4.1 probe(buffer) 探測數(shù)據(jù)能不能解析
- 1.1 基本屬性
-
工具方法
- 2.1 Swap16(src) 16位二進制數(shù)據(jù)交換,得到先右移 8 位再和 256 做與運算的結(jié)果谬俄,再得到先和 256 做與運算再左移 8 位的結(jié)果柏靶,最后一起做或運算
- 2.2 Swap32(src) 32位二進制數(shù)據(jù)交換,得到先和 2的32次方 做與運算再右移 24 位溃论,再得到先和 2的24次方 做與運算再右移 8 位屎蜓,再得到內(nèi)的數(shù) 先和 2的16次方 做與運算再左移 24 位,再得到內(nèi)的數(shù) 先和 256 做與運算再左移 24 位钥勋,最后一起做或運算
- 2.3 ReadBig32(array, index) 大端 32 位法讀數(shù)據(jù)炬转,將二進制數(shù)組的第 1 個元素向左偏移 24 位,第 2 個元素向左偏移 16 位算灸,第 3 個元素向左偏移 8 位扼劈,第 4 個元素不偏移,最后一起做或運算
-
方法
方法分為獲取狀態(tài)的方法乎婿、操作數(shù)據(jù)的方法测僵、解析的方法- 3.1 獲取狀態(tài)的方法
-
3.1.1 _isInitialMetadataDispatched() 是否是分配的初始元數(shù)據(jù),根據(jù)實例是否有音軌和視軌來返回相應(yīng)的分發(fā)元數(shù)據(jù)
3.1.1
-
- 3.2 操作數(shù)據(jù)的方法
-
3.2.1 destroy() 銷毀實例,將若干屬性設(shè)為 null
3.2.1 - 3.2.2 bindDataSource(loader) 綁定數(shù)據(jù)源
- 3.2.2.1 將 loader 的數(shù)據(jù)抵達事件處理函數(shù)設(shè)為實例的 parseChunks 方法
- 3.2.2.2 返回實例
-
- 3.3 解析的方法
- 3.3.1 parseChunks(chunk, byteStart)
- 3.3.1.1 如果實例沒有四個事件處理函數(shù)捍靠,報錯
- 3.3.1.2 如果 byteStart 為 0
- 3.3.1.2.1 如果 chunk 的字節(jié)長度大于 13
- 3.3.1.2.1.1 探測 chunk沐旨,將探測結(jié)果保存到 probeData 中
- 3.3.1.2.1.2 將 probeDatadataOffset 保存在 offset 中
- 3.3.1.2.1.3 設(shè)置 byteStart 為 probeDatadataOffset
- 3.3.1.2.2 否則,返回 0
- 3.3.1.2.1 如果 chunk 的字節(jié)長度大于 13
- 3.3.1.3 如果實例的首次解析為 true
- 3.3.1.3.1 設(shè)置實例的首次解析為 false
- 3.3.1.3.2 校驗 byteStart 的有效性
- 3.3.1.3.3 創(chuàng)建 chunk 和 offset 的 DataView
- 3.3.1.3.4 獲取這個視圖的 Uint32 數(shù)據(jù)榨婆,即 prevTagSize0磁携,期望為 0
- 3.3.1.3.5 略過開頭這 4 個字節(jié)的 tag size(prevTagSize0)
- 3.3.1.4 只要 chunk 還沒有解析完
- 3.3.1.4.1 設(shè)置實例的分發(fā)標志位為 true
- 3.3.1.4.2 創(chuàng)建 chunk 和 offset 的 DataView
- 3.3.1.4.3 如果數(shù)據(jù)不足以解析 flv 標簽,跳出循環(huán)
- 3.3.1.4.4 從視圖中獲取 tagType良风,通過 getUint8(0)
- 3.3.1.4.5 從視圖中獲取 dataSize谊迄,通過 getUint32(0, !le) & 0x00FFFFFF
- 3.3.1.4.6 如果數(shù)據(jù)不足以解析實際的數(shù)據(jù)體,跳出循環(huán)
- 3.3.1.4.7 如果 tagType 不是 8烟央、9统诺、18,直接略過 11 + dataSize + 4 個字節(jié)疑俭,重新循環(huán)
- 3.3.1.4.8 讀取視圖的第 4粮呢、5、6钞艇、7 個元素,獲取 ts2挺物、ts1、ts0识藤、ts3
- 3.3.1.4.9 通過上一步獲取時間戳
- 3.3.1.4.10 通過視圖獲取流 ID,期望為 0
- 3.3.1.4.11 創(chuàng)建 dataOffset 為 offset + 11
-
3.3.1.4.12 根據(jù) tagType 進入相應(yīng)的解析子程序:8-音頻学少、9-視頻版确、18-腳本
3.3.1.4.12 - 3.3.1.4.13 獲取這個視圖的 Uint32 數(shù)據(jù)扣囊,即 prevTagSize0,期望為 11 + dataSize
- 3.3.1.4.14 將 offset 加上 11 + dataSize + 4
- 3.3.1.5 將分析后的幀分發(fā)給消費者(通常是remuxer)
- 3.3.1.5.1 如果實例是初始化元數(shù)據(jù)分發(fā)且實例分發(fā)屬性為 true 且存在視軌或音軌绒疗,調(diào)用實例的數(shù)據(jù)可用事件處理函數(shù)侵歇,傳入實例視軌和實例音軌
- 3.3.1.6 返回 offset
- 3.3.2 _parseScriptData(arrayBuffer, dataOffset, dataSize) 解析腳本數(shù)據(jù)
- 3.3.2.1 通過 AMF 的 parseScriptData 獲取 scriptData
- 3.3.2.2 將 scriptData 填充進實例的屬性里去
- 3.3.2.2.1 簡單地將 scriptData 賦值給實例的元數(shù)據(jù)
- 3.3.2.2.2 將實例元數(shù)據(jù)的 onMetaData 屬性單獨拿出來作為數(shù)據(jù)源,填充前還要判斷數(shù)據(jù)類型..
- 3.3.2.2.3 hasAudio->實例是否有音頻吓蘑,hasAudio->實例媒體信息是否有音頻
- 3.3.2.2.4 hasVideo->實例是否有視頻惕虑,hasAudio->實例媒體信息是否有視頻
- 3.3.2.2.5 audiodatarate->實例媒體信息音率
- 3.3.2.2.6 videodatarate->實例媒體信息視率
- 3.3.2.2.7 width->實例媒體信息寬
- 3.3.2.2.8 height->實例媒體信息高
- 3.3.2.2.9 duration->實例媒體信息持續(xù)時間和實例持續(xù)時間坟冲,要處理一下時間步長
- 3.3.2.2.10 framerate->實例引用幀率和實例媒體信息 fps
- 3.3.2.2.11 keyframes->實例是否有幀索引和實例幀索引
- 3.3.2.2.12 設(shè)置實例分發(fā)屬性為 false
- 3.3.2.2.13 onMetaData->實例元數(shù)據(jù)
- 3.3.2.2.14 如果實例媒體信息是完成狀態(tài),調(diào)用媒體信息事件處理函數(shù)溃蔫,傳入實例媒體信息
- 3.3.3 _parseKeyframesIndex(keyframes) - 3.3.2 的子程序健提,用于解析幀索引
- 3.3.3.1 遍歷 [1,keyframestimes],忽略實際上是AVC Sequence Header(AVCDecoderConfigurationRecord)的第一個關(guān)鍵幀伟叛,并且對 times 取了整
- 3.3.3.2 返回一個對象私痹,有 times 和 filepositions 兩個屬性
- 3.3.4 _parseAudioData(arrayBuffer, dataOffset, dataSize, tagTimestamp) 解析音頻數(shù)據(jù)
- 3.3.4.1 如果 dataSize <= 1,結(jié)束
- 3.3.4.2 獲取實例音頻元數(shù)據(jù)统刮,保存到 meta
- 3.3.4.3 獲取實例音軌紊遵,保存到 track
- 3.3.4.4 如果需要初始化 meta
-
3.3.4.4.1 設(shè)置 meta 的 type、id侥蒙、timescale暗膜、duration
3.3.4.4 - 3.3.4.4.2 獲取 arrayBuffer、dataOffset辉哥、dataSize 的視圖
- 3.3.4.4.3 從視圖中獲取 soundSpec(第一個 Uint8 字節(jié))
- 3.3.4.4.4 從 soundSpec 獲得 soundFormat桦山,預(yù)期是 10,也就是 AAC 格式
- 3.3.4.4.5 從 soundSpec 獲得 soundRateIndex
- 3.3.4.4.6 根據(jù) soundRateTable 和 soundRateIndex 獲得 soundRate
- 3.3.4.4.7 根據(jù) soundSpec 獲得 soundSize
- 3.3.4.4.8 根據(jù) soundSpec 獲得 soundType
-
3.3.4.4.9 設(shè)置 meta 的 audioSampleRate醋旦、channelCount、refSampleDuration会放、codec
3.3.4.4.9
-
- 3.3.4.5 調(diào)用 _parseAACAudioData 獲取 aacData饲齐,傳參數(shù)的時候偏移量加 1,大小 - 1
- 3.3.4.6 如果 aacData 為空咧最,結(jié)束
- 3.3.4.7 如果 AAC 序列頭存在(aacData.packetType 為 0)
- 3.3.4.7.1 如果 meta 有 config 屬性捂人,提示沖突
- 3.3.4.7.2 從 aacDatadata 獲得 misc
-
3.3.4.7.3 設(shè)置 meta 的 audioSampleRate、channelCount矢沿、codec滥搭、config、refSampleDuration
3.3.4.7.3 - 3.3.4.7.4 如果實例是初始化元數(shù)據(jù)分發(fā)且實例分發(fā)屬性為 true 且有音軌或者視軌捣鲸,調(diào)用實例的數(shù)據(jù)可用事件處理函數(shù)瑟匆,傳入實例視軌和實例音軌
- 3.3.4.7.4 否則,設(shè)置實例的音頻初始化元數(shù)據(jù)分發(fā)屬性為 true
- 3.3.4.7.5 通知新的元數(shù)據(jù)栽惶,設(shè)置實例的分發(fā)屬性為 false
- 3.3.4.7.6 調(diào)用軌道元數(shù)據(jù)處理函數(shù)愁溜,傳入 'audio' 和 meta
- 3.3.4.7.7 從實例媒體信息獲取 mi,設(shè)置 mi 的 audioCodec外厂、audioSampleRate冕象、audioChannelCount
- 3.3.4.7.8 如果 mi 有視軌且 mi 的視頻編碼不為空,設(shè)置 mi 的 mimeType 為
video/x-flv; codecs=
打頭 - 3.3.4.7.8 否則汁蝶,設(shè)置 mi 的mimeType 為
video/x-flv; codecs=
打頭 - 3.3.4.7.9 如果 mi 已完成渐扮,調(diào)用實例的媒體信息事件處理函數(shù)
- 3.3.4.7.10 結(jié)束
- 3.3.4.7 如果是 AAC 原幀數(shù)據(jù)
- 3.3.4.7.1 將 dts 設(shè)置為實例基本時間戳 + tagTimestamp
- 3.3.4.7.2 獲取 aacSample
- 3.3.4.7.3 往 tracksamples 里推入 aacSample
- 3.3.4.7.4 給 track 的長度加上 aacDatadata 的長度
- 3.3.4.7 否則打印不支持的 AAC 數(shù)據(jù)信息
- 3.3.5 _parseAACAudioData(arrayBuffer, dataOffset, dataSize) 解析 AAC 音頻數(shù)據(jù)
- 3.3.5.1 如果 dataSize 小于 1,說明 AAC 數(shù)據(jù)無效,結(jié)束
- 3.3.5.2 創(chuàng)建一個 array墓律,Uint8Array 類型膀估,指向 arrayBuffer,起點為 dataOffset只锻,大小為 dataSize
- 3.3.5.3 如果 array[0] 為 0玖像,通過調(diào)用 _parseAACAudioSpecificConfig 獲取 data
- 3.3.5.3 否則,data 為 arraysubarray(1)
- 3.3.5.4 返回一個對象齐饮,鍵為 packetType(array[0])和 data
- 3.3.6 _parseAACAudioSpecificConfig(arrayBuffer, dataOffset, dataSize) 獲取 AAC 數(shù)據(jù)描述
- 3.3.6.1 創(chuàng)建 array捐寥,實例化一個 Uint8Array,傳入 arrayBuffer, dataOffset, dataSize
- 3.3.6.2 創(chuàng)建 audioObjectType 和 originalAudioObjectType祖驱,初始值是 array[0] 右移三位
- 3.3.6.3 創(chuàng)建 samplingIndex握恳,期望是有效的 AAC 采樣頻率指數(shù)
- 3.3.6.4 創(chuàng)建 samplingFrequence 為 mpeg 采樣率
- 3.3.6.5 創(chuàng)建 channelConfig,期望是有效的信道配置
- 3.3.6.6 如果 audioObjectType 為 5捺僻,即 HE-AAC乡洼,設(shè)置 extensionSamplingIndex 和 audioExtensionObjectType
- 3.3.6.7 如果是火狐瀏覽器
- 3.3.6.7.1 如果頻率小于24kHz,則使用 SBR(HE-AAC)
- 3.3.6.7.2 否則匕坯,使用 LC-AAC
- 3.3.6.7 如果是安卓瀏覽器束昵,使用 LC-AAC
- 3.3.6.7 否則,使用 HE-AAC
- 3.3.6.8 裝填 config
-
3.3.6.9 返回一個描述對象
3.3.6.9
- 3.3.7 _parseVideoData(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition) 解析視頻數(shù)據(jù)
- 3.3.7.1 如果 dataSize <= 1葛峻,結(jié)束
- 3.3.7.2 創(chuàng)建一個 Uint8Array 數(shù)組锹雏,指向 arrayBuffer,起點為 dataOffset术奖,大小為 dataSize礁遵,創(chuàng)建 spec 為它的第一個元素
- 3.3.7.3 創(chuàng)建 frameType、codecId采记,期望 codecId 為 7
- 3.3.7.4 調(diào)用 _parseAVCVideoPacket佣耐,略過一位偏移量
- 3.3.8 _parseAVCVideoPacket(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, framType) 解析 AVC 視頻數(shù)據(jù)包
- 3.3.8.1 如果 dataSize <= 4,結(jié)束
- 3.3.8.2 創(chuàng)建一個視圖唧龄,指向 arrayBuffer兼砖,起點為 dataOffset,大小為 dataSize
- 3.3.8.3 從視圖中獲取 packetType选侨,為第一個 Uint8 數(shù)據(jù)
- 3.3.8.4 從視圖中獲取 cts
- 3.3.8.5 如果 AVCDecoderConfigurationRecord(packetType 是 0)掖鱼,調(diào)用 _parseAVCDecoderConfigurationRecord,傳入 arrayBuffer, dataOffset + 4, dataSize - 4
- 3.3.8.5 如果有一個或多個 Nalus(packetType 是 1)援制,傳入 arrayBuffer, dataOffset + 4, dataSize - 4, tagTimestamp, tagPosition, frameType, cts
- 3.3.8.5 如果為空的 AVC 序列結(jié)束戏挡,什么也不做
- 3.3.8.5 否則,調(diào)用出錯事件處理函數(shù)
- 3.3.9 _parseAVCDecoderConfigurationRecord(arrayBuffer, dataOffset, dataSize) 解析 AVC 解碼器配置記錄
- 3.3.9.1 如果 dataSize <= 7晨仑,結(jié)束
- 3.3.9.2 創(chuàng)建一個視圖褐墅,指向 arrayBuffer拆檬,起點為 dataOffset,大小為 dataSize
- 3.3.9.3 獲取實例視頻元數(shù)據(jù)妥凳,保存到 meta
- 3.3.9.4 獲取實例視軌竟贯,保存到 track
- 3.3.9.5 如果需要初始化 meta
-
3.3.9.5.1 設(shè)置 meta 的 type、id逝钥、timescale屑那、duration
3.3.9.5.1
-
- 3.3.9.6 從視圖中獲取 version(第一個 Uint8 字節(jié)),期望為 1
- 3.3.9.7 從視圖中獲取 avcProfile(第二個 Uint8 字節(jié))艘款,期望為 0
- 3.3.9.8 從視圖中獲取 profileCompatibility(第三個 Uint8 字節(jié))
- 3.3.9.9 從視圖中獲取 avcLevel(第四個 Uint8 字節(jié))
- 3.3.9.10 從視圖中獲取 nalu 長度放進實例 nalu 長度屬性中持际,期望為 3 或者 4
- 3.3.9.11 從視圖中獲取 spsCount,期望為 1
- 3.3.9.12 創(chuàng)建 offset哗咆,初始化為 6
- 3.3.9.13 循環(huán) spsCount 次
- 3.3.9.13.1 從視圖中獲取 len
- 3.3.9.13.2 offset 加 2
- 3.3.9.13.3 如果 len 為 0蜘欲,繼續(xù)循環(huán)
- 3.3.9.13.4 創(chuàng)建 sps 為一個 Uint8Array 數(shù)組,指向 arrayBuffer晌柬,起點是 dataOffset + offset姥份,長度是 len
- 3.3.9.13.5 offset 加 len
- 3.3.9.13.6 創(chuàng)建 config,值是 SPSParserparseSPS(sps) 得到的
-
3.3.9.13.7 設(shè)置 meta 的基本視頻描述信息
3.3.9.13.7 -
3.3.9.13.8 校正 metaframeRate
3.3.9.13.8 -
3.3.9.13.9 校正 metarefSampleDuration
3.3.9.13.9 -
3.3.9.13.10 拼接出來 metacodec
3.3.9.13.10 -
3.3.9.13.11 設(shè)置實例媒體信息的基本視頻描述信息
3.3.9.13.11 - 3.3.9.13.12 拼接實例媒體信息的 mimeType 屬性
- 3.3.9.13.13 如果實例媒體信息已完成年碘,調(diào)用媒體信息事件處理函數(shù)
- 3.3.9.14 從視圖獲取 ppsCount(圖片參數(shù)集合)澈歉,預(yù)期是 1,從 offset 開始算
- 3.3.9.15 offset 加 1
- 3.3.9.16 循環(huán) offset 次
- 3.3.9.16.1 從視圖中獲取 len
- 3.3.9.16.2 offset 加 2
- 3.3.9.16.3 如果 len 為 0屿衅,繼續(xù)循環(huán)
- 3.3.9.16.4 offset 加 len
- 3.3.9.17 設(shè)置 meta 的 avcc
- 3.3.9.18 如果實例是初始化元數(shù)據(jù)分發(fā)且實例分發(fā)屬性為 true 且存在視軌或音軌闷祥,調(diào)用實例的數(shù)據(jù)可用事件處理函數(shù),傳入實例視軌和實例音軌
- 3.3.9.18 否則設(shè)置實例的視頻初始化元數(shù)據(jù)分發(fā)屬性為 true
- 3.3.9.19 通知新的元數(shù)據(jù)傲诵,設(shè)置實例的分發(fā)屬性為 false
- 3.3.9.20 調(diào)用軌道元數(shù)據(jù)事件處理函數(shù),傳入
'video'
和meta
- 3.3.10 _parseAVCVideoData(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType, cts) 解析 AVC 視頻數(shù)據(jù)
- 3.3.10.1 創(chuàng)建一個視圖箱硕,指向 arrayBuffer拴竹,起點為 dataOffset,大小為 dataSize
- 3.3.10.2 創(chuàng)建 units剧罩、length栓拜、offset
-
3.3.10.3 獲取 lengthSize、dts惠昔、keyframe
3.3.10.3 - 3.3.10.4 只要 offset < dataSize幕与,循環(huán)
- 3.3.10.4.1 如果 offset + 4 >= dataSize,結(jié)束
- 3.3.10.4.2 獲取 naluSize镇防,并根據(jù) lengthSize 校正
- 3.3.10.4.3 獲取 unitType啦鸣,如果是 5,設(shè)置 keyframe 為 true
- 3.3.10.4.4 獲取 data来氧,是一個 Uint8Array 的數(shù)組诫给,指向 arrayBuffer香拉,起點是 dataOffset + offset,長度是 lengthSize + naluSize
- 3.3.10.4.5 創(chuàng)建 unit中狂,初始化為
{type: unitType, data: data}
- 3.3.10.4.6 往 units 推入 unit
- 3.3.10.4.7 給 length 加上 data 的字節(jié)長度
- 3.3.10.4.8 給 offset 加上 lengthSize + naluSize
- 3.3.10.5 如果 units 不為空
- 3.3.10.5.1 創(chuàng)建 track凫碌,初始化為實例視軌
-
3.3.10.5.2 創(chuàng)建 avcSample,填充 avc 的采樣數(shù)據(jù)
3.3.10.5.2 - 3.3.10.5.3 在 tracksamples 里推入 avcSample
- 3.3.10.5.4 給 tracklength 加上 length
- 3.3.1 parseChunks(chunk, byteStart)
- 3.1 獲取狀態(tài)的方法
demux-errors.js-DemuxErrors常量-解碼錯誤
- OK 成功
- FORMAT_ERROR 格式錯誤
- FORMAT_UNSUPPORTED 不支持的格式
- CODEC_UNSUPPORTED 不支持的編碼
amf-parser.js-AMF類-AMF解析器
parseValue 是入口
解析十二選七種二進制數(shù)據(jù)胃榕,將他們序列化格式化:
- Number √
- Boolean √
- String √
- Object √
- MovieClip (reserved, not supported)
- Null
- Undefined
- Reference
- ECMA array √
- Object end marker √
- Strict array √
- Date √
- Long string √
二進制->對象描述信息
utf8-conv-decodeUTF8函數(shù)-UTF8轉(zhuǎn)Unicode器
移植自c++的一個庫:https://github.com/m13253/libWinTF8
可以將一個 TypeArray 二進制數(shù)組的內(nèi)容轉(zhuǎn)成 Unicode 碼
sps-parser.js-SPSParser類-SPS解碼器
獲取視頻的寬盛险、高、幀等信息勋又,俗稱序列參數(shù)集
https://zhuanlan.zhihu.com/p/27896239