Files
ArtPlayer/packages/artplayer-plugin-flv/src/flvParse/getMetaData.js
T
2018-12-20 20:17:29 +08:00

45 lines
1.6 KiB
JavaScript

import { getUint8Sum, readUint8, bin2String, bin2Boolean, bin2Float, errorHandle } from '../utils';
export default function getMetaData(scripTag) {
const readMetaData = readUint8(scripTag.body);
const metadata = Object.create(null);
const amf1 = Object.create(null);
const amf2 = Object.create(null);
[amf1.type] = readMetaData(1);
amf1.size = getUint8Sum(readMetaData(2));
amf1.string = bin2String(readMetaData(amf1.size));
[amf2.type] = readMetaData(1);
amf2.size = getUint8Sum(readMetaData(4));
amf2.metaData = Object.create(null);
while (readMetaData.index < scripTag.body.length) {
const nameLength = getUint8Sum(readMetaData(2));
const name = bin2String(readMetaData(nameLength));
const type = readMetaData(1)[0];
switch (type) {
case 0:
amf2.metaData[name] = bin2Float(readMetaData(8));
break;
case 1:
amf2.metaData[name] = bin2Boolean(readMetaData(1)[0]);
break;
case 2: {
const valueLength = getUint8Sum(readMetaData(2));
amf2.metaData[name] = bin2String(readMetaData(valueLength));
break;
}
case 3:
amf2.metaData[name] = Object.create(null);
readMetaData(scripTag.body.length - readMetaData.index);
break;
default:
errorHandle(false, `AMF: Unknown metaData type: ${type}`);
break;
}
}
metadata.amf1 = amf1;
metadata.amf2 = amf2;
return metadata;
}