static info (buf, pos = 0, maxHole = 0) {
    if (!buf || !buf.length) return { start: 0, end: 0, buffers: [] }

    let start = 0
    let end = 0
    let index = 0
    let nextStart = 0
    let nextEnd = 0
    let prevStart = 0
    let prevEnd = 0
    const buffers = Buffer.buffers(buf, maxHole)

    for (let i = 0, l = buffers.length; i < l; i++) {
      const item = buffers[i]
      if (pos + maxHole >= item[0] && pos <= item[1]) {
        start = item[0]
        end = item[1]
        index = i
      } else if (pos + maxHole < item[0]) {
        nextStart = item[0]
        nextEnd = item[1]
        break
      } else if (pos + maxHole > item[1]) {
        prevStart = item[0]
        prevEnd = item[1]
      }
    }

    return {
      start,
      end,
      index,
      buffers,
      nextStart,
      nextEnd,
      prevStart,
      prevEnd,
      currentTime: pos,
      behind: pos - start,
      remaining: end ? end - pos : 0,
      length: Buffer.totalLength && Buffer.totalLength(buffers)
    }
  }
@param {TimeRanges} buf
@param {number} [pos=0]
@param {number} [maxHole=0]
@returns {{start:number,end:number,buffers:[number,number][],remaining:number,index?:number,nextStart?:number,nextEnd?:number,prevStart?:number,prevEnd?:number}}