mediabunny
Version:
Pure TypeScript media toolkit for reading, writing, and converting media files, directly in the browser.
166 lines • 5.64 kB
TypeScript
/*!
* Copyright (c) 2026-present, Vanilagy and contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { Muxer } from '../muxer.js';
import { Output, OutputAudioTrack, OutputSubtitleTrack, OutputTrack, OutputVideoTrack } from '../output.js';
import { Rational } from '../misc.js';
import { IsobmffOutputFormat } from '../output-format.js';
import { SubtitleConfig, SubtitleCue, SubtitleMetadata } from '../subtitles.js';
import { EncodedPacket, PacketType } from '../packet.js';
export declare const GLOBAL_TIMESCALE = 57600;
export type Sample = {
timestamp: number;
decodeTimestamp: number;
duration: number;
data: Uint8Array | null;
size: number;
type: PacketType;
timescaleUnitsToNextSample: number;
};
type Chunk = {
/** The lowest presentation timestamp in this chunk */
startTimestamp: number;
samples: Sample[];
offset: number | null;
moofOffset: number | null;
};
export type IsobmffTrackData = {
muxer: IsobmffMuxer;
timescale: number;
samples: Sample[];
sampleQueue: Sample[];
timestampProcessingQueue: Sample[];
timeToSampleTable: {
sampleCount: number;
sampleDelta: number;
}[];
compositionTimeOffsetTable: {
sampleCount: number;
sampleCompositionTimeOffset: number;
}[];
lastTimescaleUnits: number | null;
lastSample: Sample | null;
startTimestampOffset: number | null;
finalizedChunks: Chunk[];
currentChunk: Chunk | null;
compactlyCodedChunkTable: {
firstChunk: number;
samplesPerChunk: number;
}[];
closed: boolean;
} & ({
track: OutputVideoTrack;
type: 'video';
info: {
width: number;
height: number;
pixelAspectRatio: Rational;
decoderConfig: VideoDecoderConfig;
/**
* The "Annex B transformation" involves converting the raw packet data from Annex B to
* "MP4" (length-prefixed) format.
* https://stackoverflow.com/questions/24884827
*/
requiresAnnexBTransformation: boolean;
};
} | {
track: OutputAudioTrack;
type: 'audio';
info: {
numberOfChannels: number;
sampleRate: number;
decoderConfig: AudioDecoderConfig;
/**
* The "PCM transformation" is making every sample in the sample table be exactly one PCM audio sample long.
* Some players expect this for PCM audio.
*/
requiresPcmTransformation: boolean;
expectedNextPcmPacketTimestamp: number | null;
/**
* The "ADTS stripping" involves removing the ADTS header from each AAC packet. SOBMFF stores raw AAC data, not
* ADTS-wrapped data.
*/
requiresAdtsStripping: boolean;
firstPacket: EncodedPacket;
};
} | {
track: OutputSubtitleTrack;
type: 'subtitle';
info: {
config: SubtitleConfig;
};
lastCueEndTimestamp: number;
cueQueue: SubtitleCue[];
nextSourceId: number;
cueToSourceId: WeakMap<SubtitleCue, number>;
});
export type IsobmffVideoTrackData = IsobmffTrackData & {
type: 'video';
};
export type IsobmffAudioTrackData = IsobmffTrackData & {
type: 'audio';
};
export type IsobmffSubtitleTrackData = IsobmffTrackData & {
type: 'subtitle';
};
export type IsobmffMetadata = {
name?: string;
};
export declare const getTrackMetadata: (trackData: IsobmffTrackData) => IsobmffMetadata;
export declare const intoTimescale: (timeInSeconds: number, timescale: number, round?: boolean) => number;
export declare class IsobmffMuxer extends Muxer {
format: IsobmffOutputFormat;
private writer;
private boxWriter;
private initWriter;
private initBoxWriter;
private fastStart;
isFragmented: boolean;
isQuickTime: boolean;
isCmaf: boolean;
private auxTarget;
private auxWriter;
private auxBoxWriter;
private mdat;
private ftypSize;
trackDatas: IsobmffTrackData[];
private allTracksKnown;
creationTime: number;
private finalizedChunks;
private nextFragmentNumber;
private maxWrittenTimestamp;
minWrittenTimestamp: number;
maxWrittenEndTimestamp: number;
private minimumFragmentDuration;
private segmentHeaderSize;
constructor(output: Output, format: IsobmffOutputFormat);
start(): Promise<void>;
private allTracksAreKnown;
getMimeType(): Promise<string>;
private getVideoTrackData;
private getAudioTrackData;
private getSubtitleTrackData;
addEncodedVideoPacket(track: OutputVideoTrack, packet: EncodedPacket, meta?: EncodedVideoChunkMetadata): Promise<void>;
addEncodedAudioPacket(track: OutputAudioTrack, packet: EncodedPacket, meta?: EncodedAudioChunkMetadata): Promise<void>;
private padWithSilence;
addSubtitleCue(track: OutputSubtitleTrack, cue: SubtitleCue, meta?: SubtitleMetadata): Promise<void>;
private processWebVTTCues;
private createSampleForTrack;
private processTimestamps;
private registerSample;
private addSampleToTrack;
private finalizeCurrentChunk;
private interleaveSamples;
private finalizeFragment;
private registerSampleFastStartReserve;
private computeSampleTableSizeUpperBound;
onTrackClose(track: OutputTrack): Promise<void>;
/** Finalizes the file, making it ready for use. Must be called after all video and audio chunks have been added. */
finalize(): Promise<void>;
}
export {};
//# sourceMappingURL=isobmff-muxer.d.ts.map