美文网首页
H5直播 —— 从入门到放弃(进阶篇)

H5直播 —— 从入门到放弃(进阶篇)

作者: 闪闪发光的狼 | 来源:发表于2019-07-18 16:38 被阅读0次

不知不觉竟半年过去了,是时候把坑填了
——————————————————华丽的分割线————————————————
接上篇,本篇的目的是讲解如何把视频数据封装成BOX。
本篇更为枯燥,无关人员赶紧撤退。
啥是Box?

MP4

MP4由若干Box组成的。

上图是MP4的格式,我们用到的是FMP4。
图片上的每个小方块就是一个Box。Box可以理解为一个类,由Header和Data组成。

class Box{
  Header = new Header() //Box头部
  Data= new ArrayBuffer() //Box数据
}

Header又由type和Size组成

class Header{
  Type = new ArrayBuffer(4) //表示Box类型,如ftyp。4个字节分别存储的是字符的ASCII码值
  Size = new ArrayBuffer(4) 
 //一般size由4个字节保存,
//但是会出现较大的BOX,当size为1时,通过额外的四个字节来表示size。
}

简单BOX的结构示意图

size type data
4 4 n

到这里可以创建一个Box类。

class Box{
  constructor(type,...arr){
    let len = 8;
    let size = arr.reduce((total,num)=>total+num.byteLength,0);
    let buffer = new Uint8Array(size);
    //将BOX的长度设在最开始的4个字节
    buffer [0] = (size >> 24) & 0xff;
    buffer [1] = (size >> 16) & 0xff;
    buffer [2] = (size >> 8) & 0xff;
    buffer [3] = size & 0xff;
    buffer.set(type,4); //开始设置4位的类型字节,字符的ASCII码值。
    let offset = 8;  //到此8个字节已经用掉
    buffer.forEach(val => {  //设置数据
      buffer.set(val, offset);
      offset += val.byteLength;
    })
    return buffer;
  }
}

再写个根据类型转ascii码的函数

function _type(str){
  return [
  str.charCodeAt(0),
  str.charCodeAt(1),
  str.charCodeAt(2),
  str.charCodeAt(3)]
}

那我们用的时候就简单了

new Box(_type('moov'),new Box(_type('mvhd'),data1),new Box(_type('track'),data2))

然后就是跟着MP4文档去封装BOX了。

相关文章

网友评论

      本文标题:H5直播 —— 从入门到放弃(进阶篇)

      本文链接:https://www.haomeiwen.com/subject/wzideqtx.html