UNPKG

@mediafish/flv

Version:

A library to read/write FLV file format

202 lines (187 loc) 5.26 kB
import {FLVFile, FLVHeader, FLVTag, Audio, AAC, Video, AVC} from './types.js'; export function print(data) { let obj = null; if (data instanceof FLVFile) { obj = printFile(data); } else if (data instanceof FLVHeader) { obj = printHeader(data); } else if (data instanceof FLVTag) { obj = printTag(data); } else if (data instanceof Audio) { obj = printAudio(data); } else if (data instanceof Video) { obj = printVideo(data); } else { obj = 'Unknown data type'; } console.log(JSON.stringify(obj, null, 4)); } function printFile({header, body}) { const headerObj = printHeader(header); const bodyObj = []; for (const tag of body) { bodyObj.push(printTag(tag)); } return {FLVFile: {FLVHeader: headerObj, body: bodyObj}}; } function printHeader(header) { return {FLVHeader: header}; } function printTag({type, timestamp, data}) { let dataObj = null; if (type === FLVTag.TagType.audio) { dataObj = printAudio(data); } else if (type === FLVTag.TagType.video) { dataObj = printVideo(data); } else { dataObj = {UnknownTag: `Unsupported tag type: ${type}`}; } return {FLVTag: {timestamp, dataObj}}; } function printAudio({format, sampleRate, size, isStereo, packetType, data}) { const obj = { format: printSoundFormat(format), sampleRate: printSampleRate(sampleRate), size: printSampleLength(size), isStereo, data: printBuffer(data), }; if (format === Audio.SoundFormat.AAC) { obj.packetType = printAACPacketType(packetType); return {AAC: obj}; } return {Audio: obj}; } function printSoundFormat(format) { switch (format) { case Audio.SoundFormat.LinearPCM: return 'Linear PCM'; case Audio.SoundFormat.ADPCM: return 'ADPCM'; case Audio.SoundFormat.MP3: return 'MP3'; case Audio.SoundFormat.LinearPCMLE: return 'Linear PCM Little Endian'; case Audio.SoundFormat.Nellymoser16Mono: return 'Nellymoser 16 bit Mono'; case Audio.SoundFormat.Nellymoser8Mono: return 'Nellymoser 8 bit Mono'; case Audio.SoundFormat.Nellymoser: return 'Nellymoser'; case Audio.SoundFormat.G711Alaw: return 'G-711 A-law'; case Audio.SoundFormat.G711Mulaw: return 'G-711 Mu-law'; case Audio.SoundFormat.AAC: return 'AAC'; case Audio.SoundFormat.Speex: return 'Speex'; case Audio.SoundFormat.MP38kHz: return 'MP3 8kHz'; case Audio.SoundFormat.DeviceSpecific: return 'Device Specific'; default: return 'Unknown sound format'; } } function printSampleRate(sampleRate) { switch (sampleRate) { case Audio.SampleRate._5kHz: return '5.5kHz'; case Audio.SampleRate._11kHz: return '11kHz'; case Audio.SampleRate._22kHz: return '22kHz'; case Audio.SampleRate._44kHz: return '44kHz'; default: return 'Unknown sample rate'; } } function printSampleLength(size) { switch (size) { case Audio.SampleLength._8Bit: return '8 bits per sample'; case Audio.SampleLength._16Bit: return '16 bits per sample'; default: return 'Unknown sample length'; } } function printAACPacketType(size) { switch (size) { case AAC.PacketType.SequenceHeader: return 'AAC sequence header'; case AAC.PacketType.Raw: return 'AAC raw data'; default: return 'Unknown packet type'; } } function printBuffer(buf) { if (buf) { return `<Buffer length=${buf.length} >`; } return 'Empty buffer'; } function printVideo({frameType, codec, packetType, compositionTimeOffset, data}) { const obj = { frameType: printFrameType(frameType), sampleRate: printVideoCodec(codec), data: printBuffer(data), }; if (codec === Video.Codec.AVC) { obj.packetType = printAVCPacketType(packetType); obj.compositionTimeOffset = compositionTimeOffset; return {AVC: obj}; } return {Video: obj}; } function printFrameType(frameType) { switch (frameType) { case Video.FrameType.keyframe: return 'keyframe'; case Video.FrameType.interframe: return 'inter frame'; case Video.FrameType.disposable: return 'disposable inter frame'; case Video.FrameType.generated: return 'generated keyframe'; case Video.FrameType.command: return 'video info/command frame'; default: return 'Unknown frame type'; } } function printVideoCodec(codec) { switch (codec) { case Video.Codec.JPEG: return 'JPEG'; case Video.Codec.Sorenson: return 'Sorenson H.263'; case Video.Codec.ScreenVideo: return 'Screen video'; case Video.Codec.On2VP6: return 'On2 VP6'; case Video.Codec.On2VP6WithAlpha: return 'On2 VP6 with alpha channel'; case Video.Codec.ScreenVideo2: return 'Screen video version 2'; case Video.Codec.AVC: return 'AVC'; default: return 'Unknown video codec'; } } function printAVCPacketType(packetType) { switch (packetType) { case AVC.PacketType.SequenceHeader: return 'AVC sequence header'; case AVC.PacketType.NALU: return 'AVC NAL unit'; case AVC.PacketType.EndOfSequence: return 'AVC end of sequence'; default: return 'Unknown packet type'; } }