Add WebMInputFormat, add OutputFormat.getFileExtension()

This commit is contained in:
Vanilagy
2025-01-12 16:52:28 +01:00
parent aea808ca0c
commit 9c501808b1
4 changed files with 50 additions and 7 deletions
+1 -1
View File
@@ -174,5 +174,5 @@ Testing... <00:17.350>One... <00:18.125>Two...
await output.finalize();
console.log(target);
download(new Blob([target.buffer]), 'test.webm');
download(new Blob([target.buffer]), 'test' + format.getFileExtension());
</script>
+2 -1
View File
@@ -52,8 +52,9 @@ export {
InputFormat,
IsobmffInputFormat,
Mp4InputFormat,
QuickTimeInputFormat as MovInputFormat,
QuickTimeInputFormat,
MatroskaInputFormat,
WebMInputFormat,
WaveInputFormat,
ALL_FORMATS,
MP4,
+26 -5
View File
@@ -81,7 +81,7 @@ export class QuickTimeInputFormat extends IsobmffInputFormat {
/** @public */
export class MatroskaInputFormat extends InputFormat {
/** @internal */
async _canReadInput(input: Input) {
protected async isSupportedEBMLOfDocType(input: Input, desiredDocType: string) {
const sourceSize = await input._mainReader.source._getSize();
if (sourceSize < 8) {
return false;
@@ -89,7 +89,7 @@ export class MatroskaInputFormat extends InputFormat {
const ebmlReader = new EBMLReader(input._mainReader);
const varIntSize = ebmlReader.readVarIntSize();
if (varIntSize < 1 || varIntSize > 6) {
if (varIntSize < 1 || varIntSize > 8) {
return false;
}
@@ -124,7 +124,7 @@ export class MatroskaInputFormat extends InputFormat {
}; break;
case EBMLId.DocType: {
const docType = ebmlReader.readString(size);
if (docType !== 'matroska' && docType !== 'webm') {
if (docType !== desiredDocType) {
return false;
}
}; break;
@@ -142,6 +142,11 @@ export class MatroskaInputFormat extends InputFormat {
return true;
}
/** @internal */
_canReadInput(input: Input) {
return this.isSupportedEBMLOfDocType(input, 'matroska');
}
/** @internal */
_createDemuxer(input: Input) {
return new MatroskaDemuxer(input);
@@ -156,6 +161,22 @@ export class MatroskaInputFormat extends InputFormat {
}
}
/** @public */
export class WebMInputFormat extends MatroskaInputFormat {
/** @internal */
override _canReadInput(input: Input) {
return this.isSupportedEBMLOfDocType(input, 'webm');
}
override getName() {
return 'WebM';
}
override getMimeType() {
return 'video/webm';
}
}
/** @public */
export class WaveInputFormat extends InputFormat {
async _canReadInput(input: Input) {
@@ -196,9 +217,9 @@ export const QTFF = new QuickTimeInputFormat();
/** @public */
export const MATROSKA = new MatroskaInputFormat();
/** @public */
export const WEBM = MATROSKA;
export const WEBM = new WebMInputFormat();
/** @public */
export const WAVE = new WaveInputFormat();
/** @public */
export const ALL_FORMATS: InputFormat[] = [MP4, QTFF, MATROSKA, WAVE];
export const ALL_FORMATS: InputFormat[] = [MP4, QTFF, MATROSKA, WEBM, WAVE];
+21
View File
@@ -12,6 +12,7 @@ export abstract class OutputFormat {
/** @internal */
abstract _getName(): string;
abstract getFileExtension(): string;
abstract getSupportedCodecs(): MediaCodec[];
getSupportedVideoCodecs() {
@@ -69,6 +70,10 @@ export class Mp4OutputFormat extends IsobmffOutputFormat {
return 'MP4';
}
getFileExtension() {
return '.mp4';
}
getSupportedCodecs() {
return Mp4OutputFormat.getSupportedCodecs();
}
@@ -98,6 +103,10 @@ export class MovOutputFormat extends IsobmffOutputFormat {
return 'MOV';
}
getFileExtension() {
return '.mov';
}
getSupportedCodecs() {
return MovOutputFormat.getSupportedCodecs();
}
@@ -152,6 +161,10 @@ export class MkvOutputFormat extends OutputFormat {
return 'Matroska';
}
getFileExtension() {
return '.mkv';
}
getSupportedCodecs() {
return MkvOutputFormat.getSupportedCodecs();
}
@@ -181,6 +194,10 @@ export class WebMOutputFormat extends MkvOutputFormat {
return 'WebM';
}
override getFileExtension() {
return '.webm';
}
static override getSupportedCodecs(): MediaCodec[] {
return [
'vp8', 'vp9', 'av1',
@@ -211,6 +228,10 @@ export class WaveOutputFormat extends OutputFormat {
return 'WAVE';
}
getFileExtension() {
return '.wav';
}
getSupportedCodecs() {
return WaveOutputFormat.getSupportedCodecs();
}