flv.js 1.0 源碼學(xué)習(三)

整個庫的核心部分之一害捕。
參考:https://blog.csdn.net/g332065255/article/details/71158863

flv-demuxer.js-FLVDemuxer類-FLV解碼器

FLVDemuxer

肯定有個什么mp4-demuxer

  1. 屬性分為基本屬性、媒體信息、事件處理函數(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 }
  2. 工具方法

    • 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 個元素不偏移,最后一起做或運算
  3. 方法
    方法分為獲取狀態(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.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

demux-errors.js-DemuxErrors常量-解碼錯誤

  1. OK 成功
  2. FORMAT_ERROR 格式錯誤
  3. FORMAT_UNSUPPORTED 不支持的格式
  4. CODEC_UNSUPPORTED 不支持的編碼

amf-parser.js-AMF類-AMF解析器

AMF

parseValue 是入口
解析十二選七種二進制數(shù)據(jù)胃榕,將他們序列化格式化:

  1. Number √
  2. Boolean √
  3. String √
  4. Object √
  5. MovieClip (reserved, not supported)
  6. Null
  7. Undefined
  8. Reference
  9. ECMA array √
  10. Object end marker √
  11. Strict array √
  12. Date √
  13. 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解碼器

SPSParser

獲取視頻的寬盛险、高、幀等信息勋又,俗稱序列參數(shù)集
https://zhuanlan.zhihu.com/p/27896239

exp-golomb.js-ExpGolomb類-哥倫布指數(shù)解碼器

ExpGolomb

http://www.cnblogs.com/DwyaneTalk/p/4035206.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末苦掘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子赐写,更是在濱河造成了極大的恐慌鸟蜡,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挺邀,死亡現(xiàn)場離奇詭異揉忘,居然都是意外死亡,警方通過查閱死者的電腦和手機端铛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門泣矛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人禾蚕,你說我怎么就攤上這事您朽。” “怎么了换淆?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵哗总,是天一觀的道長。 經(jīng)常有香客問我倍试,道長讯屈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任县习,我火速辦了婚禮涮母,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘躁愿。我一直安慰自己叛本,他們只是感情好,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布彤钟。 她就那樣靜靜地躺著来候,像睡著了一般。 火紅的嫁衣襯著肌膚如雪样勃。 梳的紋絲不亂的頭發(fā)上吠勘,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天性芬,我揣著相機與錄音,去河邊找鬼剧防。 笑死植锉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的峭拘。 我是一名探鬼主播俊庇,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鸡挠!你這毒婦竟也來了辉饱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拣展,失蹤者是張志新(化名)和其女友劉穎彭沼,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體备埃,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡姓惑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了按脚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片于毙。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖辅搬,靈堂內(nèi)的尸體忽然破棺而出唯沮,到底是詐尸還是另有隱情,我是刑警寧澤堪遂,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布介蛉,位于F島的核電站,受9級特大地震影響溶褪,放射性物質(zhì)發(fā)生泄漏甘耿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一竿滨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捏境,春花似錦于游、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至筷频,卻和暖如春蚌成,著一層夾襖步出監(jiān)牢的瞬間前痘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工担忧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芹缔,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓瓶盛,卻偏偏與公主長得像最欠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子惩猫,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 二芝硬、IO io-controller.js-IOController類-IO控制器 屬性分為基本信息、暫存區(qū)信息轧房、...
    云峰yf閱讀 6,161評論 0 3
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理拌阴,服務(wù)發(fā)現(xiàn),斷路器奶镶,智...
    卡卡羅2017閱讀 134,668評論 18 139
  • 二進制數(shù)組(ArrayBuffer對象迟赃、TypedArray視圖和DataView視圖)是JavaScript操作...
    呼呼哥閱讀 21,312評論 2 12
  • 原文: objective-c常用方法列表(總結(jié))在簡書保存一份 第1章Objective-C學(xué)習環(huán)境準備1.1O...
    14cat閱讀 1,156評論 0 2
  • 周末 去新裝修待散味的房子里打掃衛(wèi)生 陽光甚好 先去二里外的矮山轉(zhuǎn)悠轉(zhuǎn)悠 這還是當年學(xué)過跆拳道爬過泰山的人 但事實...
    秋月_白閱讀 260評論 0 0