mirror of
https://github.com/arcodange-org/mediabunny.git
synced 2026-09-27 02:43:48 +02:00
Mime type & MP3 improvements
This commit is contained in:
@@ -210,7 +210,13 @@ export class IsobmffDemuxer extends Demuxer {
|
||||
override async getMimeType() {
|
||||
await this.readMetadata();
|
||||
|
||||
let string = this.isQuickTime ? 'video/quicktime' : 'video/mp4';
|
||||
const base = this.tracks.some(x => x.info?.type === 'video')
|
||||
? 'video/'
|
||||
: this.tracks.some(x => x.info?.type === 'audio')
|
||||
? 'audio/'
|
||||
: 'application/';
|
||||
|
||||
let string = base + (this.isQuickTime ? 'quicktime' : 'mp4');
|
||||
|
||||
if (this.tracks.length > 0) {
|
||||
const codecMimeTypes = await Promise.all(this.tracks.map(x => x.inputTrack!.getCodecMimeType()));
|
||||
|
||||
@@ -177,7 +177,13 @@ export class MatroskaDemuxer extends Demuxer {
|
||||
override async getMimeType() {
|
||||
await this.readMetadata();
|
||||
|
||||
let string = this.isWebM ? 'video/webm' : 'video/x-matroska';
|
||||
const base = this.segments.some(segment => segment.tracks.some(x => x.info?.type === 'video'))
|
||||
? 'video/'
|
||||
: this.segments.some(segment => segment.tracks.some(x => x.info?.type === 'audio'))
|
||||
? 'audio/'
|
||||
: 'application/';
|
||||
|
||||
let string = base + (this.isWebM ? 'webm' : 'x-matroska');
|
||||
|
||||
const tracks = await this.getTracks();
|
||||
if (tracks.length > 0) {
|
||||
|
||||
+8
-3
@@ -46,8 +46,13 @@ export type FrameHeader = {
|
||||
emphasis: number;
|
||||
};
|
||||
|
||||
export const computeMp3FrameSize = (bitrate: number, sampleRate: number, padding: number) => {
|
||||
return Math.floor((144 * bitrate / sampleRate) + padding);
|
||||
export const computeMp3FrameSize = (layer: number, bitrate: number, sampleRate: number, padding: number) => {
|
||||
if (layer === 3) {
|
||||
// Layer 1
|
||||
return Math.floor((12 * bitrate / sampleRate + padding) * 4);
|
||||
} else {
|
||||
return Math.floor((144 * bitrate / sampleRate) + padding);
|
||||
}
|
||||
};
|
||||
|
||||
export const getXingOffset = (mpegVersionId: number, channel: number) => {
|
||||
@@ -102,7 +107,7 @@ export const readFrameHeader = (word: number, reader: { pos: number; fileSize: n
|
||||
return null;
|
||||
}
|
||||
|
||||
const frameLength = computeMp3FrameSize(bitrate, sampleRate, padding);
|
||||
const frameLength = computeMp3FrameSize(layer, bitrate, sampleRate, padding);
|
||||
|
||||
if (reader.fileSize !== null && reader.fileSize - startPos < frameLength) {
|
||||
// The frame doesn't fit into the rest of the file
|
||||
|
||||
@@ -56,7 +56,7 @@ export class Mp3Writer {
|
||||
|
||||
// Let's find the lowest bitrate for which the frame size is sufficiently large to fit all the data
|
||||
const bitrateIndex = bitrates.findIndex((kbr) => {
|
||||
return computeMp3FrameSize(1000 * kbr, sampleRate, padding) >= neededBytes;
|
||||
return computeMp3FrameSize(data.layer, 1000 * kbr, sampleRate, padding) >= neededBytes;
|
||||
});
|
||||
if (bitrateIndex === -1) {
|
||||
throw new Error('No suitable bitrate found.');
|
||||
@@ -98,7 +98,7 @@ export class Mp3Writer {
|
||||
this.writeU32(data.fileSize ?? 0);
|
||||
this.writer.write(data.toc ?? new Uint8Array(100));
|
||||
|
||||
const frameSize = computeMp3FrameSize(1000 * bitrates[bitrateIndex]!, sampleRate, padding);
|
||||
const frameSize = computeMp3FrameSize(data.layer, 1000 * bitrates[bitrateIndex]!, sampleRate, padding);
|
||||
this.writer.seek(startPos + frameSize);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user