解析amf成功

This commit is contained in:
Harvey Zack committed 2018-12-21 11:24:15 +08:00
1 parent 94aaf29da8
commit 3afe2e1640
4 files changed
+204 -102

No files matched your search

@@ -1,40 +1,92 @@
import { getUint8Sum, readUint8, bin2String, bin2Boolean, bin2Float, errorHandle } from '../utils';
import { getUint8Sum, readUint8, bin2String, bin2Boolean, bin2Float } from '../utils';
export default function getMetaData(scripTag) {
const readMetaData = readUint8(scripTag.body);
const readScripTag = 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));
[amf1.type] = readScripTag(1);
amf1.size = getUint8Sum(readScripTag(2));
amf1.string = bin2String(readScripTag(amf1.size));
[amf2.type] = readScripTag(1);
amf2.size = getUint8Sum(readScripTag(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;
function getValue(type) {
let value = null;
if (type !== undefined) {
switch (type) {
case 0:
value = bin2Float(readScripTag(8));
break;
case 1:
value = bin2Boolean(readScripTag(1)[0]);
break;
case 2: {
const valueLength = getUint8Sum(readScripTag(2));
value = bin2String(readScripTag(valueLength));
break;
}
case 3: {
value = Object.create(null);
let endObject = false;
while (!endObject && readScripTag.index < scripTag.body.length) {
const nameLength = getUint8Sum(readScripTag(2));
const name = bin2String(readScripTag(nameLength));
const type = readScripTag(1)[0];
if (name) {
value[name] = getValue(type);
}
if (type === 9) {
endObject = true;
}
}
break;
}
case 8: {
value = Object.create(null);
let endObject = false;
while (!endObject && readScripTag.index < scripTag.body.length) {
const nameLength = getUint8Sum(readScripTag(2));
const name = bin2String(readScripTag(nameLength));
const type = readScripTag(1)[0];
if (name) {
value[name] = getValue(type);
}
if (type === 9) {
endObject = true;
}
}
break;
}
case 10: {
const valueLength = getUint8Sum(readScripTag(4));
value = [];
for (let index = 0; index < valueLength; index += 1) {
const itemType = readScripTag(1)[0];
value.push(getValue(itemType));
}
break;
}
case 12: {
const valueLength = getUint8Sum(readScripTag(4));
value = bin2String(readScripTag(valueLength));
break;
}
default:
console.warn(`AMF: Unknown metaData type: ${type} in ${readScripTag.index - 1}`);
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;
}
return value;
}
while (readScripTag.index < scripTag.body.length) {
const nameLength = getUint8Sum(readScripTag(2));
const name = bin2String(readScripTag(nameLength));
const type = readScripTag(1)[0];
if (name) {
amf2.metaData[name] = getValue(type);
}
}
@@ -5,6 +5,7 @@ import { mergeTypedArrays, getUint8Sum } from '../utils';
export default class FlvParse {
constructor(flv) {
this.flv = flv;
const { url } = flv.options;
this.uint8 = new Uint8Array(0);
this.index = 0;
@@ -42,7 +43,6 @@ export default class FlvParse {
this.parse();
}
flv.emit('parseDone');
this.verify();
});
if (typeof url === 'string') {
@@ -61,6 +61,8 @@ export default class FlvParse {
header.headersize = this.read(4);
this.header = header;
this.read(4);
this.flv.emit('parseHeader', this.header);
console.log(this.header);
}
while (this.index < this.uint8.length) {
@@ -72,10 +74,13 @@ export default class FlvParse {
tag.body = this.read(getUint8Sum(tag.dataSize));
this.tags.push(tag);
this.read(4);
this.flv.emit('parseTag', tag);
}
if (this.tags.length > 1 && this.tags[0].tagType[0] === 18 && !this.metadata) {
this.metadata = getMetaData(this.tags[0]);
this.flv.emit('parseMetadata', this.metadata);
console.log(this.metadata);
}
}
@@ -87,20 +92,4 @@ export default class FlvParse {
}
return tempUint8;
}
verify() {
const types = Object.create(null);
this.tags.forEach(item => {
const tagType = item.tagType[0];
if (types[tagType]) {
types[tagType] += 1;
} else {
types[tagType] = 1;
}
});
console.log(this.header);
console.log(this.metadata);
console.log(this.tags);
console.log(types);
}
}