diff --git a/src/components/video-editor/VideoEditor.tsx b/src/components/video-editor/VideoEditor.tsx index ea4ae6a7..9c99b88d 100644 --- a/src/components/video-editor/VideoEditor.tsx +++ b/src/components/video-editor/VideoEditor.tsx @@ -4454,7 +4454,7 @@ export default function VideoEditor() {

{isRenderingAudio ? (

- Processing audio with speed/overlay edits + {t("editor.export.processingAudioEdits", "Processing audio with speed/overlay edits")}

) : exportRenderSpeedLabel ? (

diff --git a/src/lib/exporter/audioEncoder.ts b/src/lib/exporter/audioEncoder.ts index 8a2eec61..154b0e4b 100644 --- a/src/lib/exporter/audioEncoder.ts +++ b/src/lib/exporter/audioEncoder.ts @@ -1149,17 +1149,8 @@ export class AudioProcessor { const source = await resolveMediaElementSource(url); try { const media = document.createElement("video"); - media.src = source.src; media.preload = "metadata"; - - if ( - Number.isFinite(media.duration) && - media.readyState >= HTMLMediaElement.HAVE_METADATA - ) { - const duration = media.duration; - media.src = ""; - return duration; - } + media.src = source.src; return await new Promise((resolve, reject) => { const timeout = setTimeout(() => { diff --git a/src/lib/exporter/modernVideoExporter.ts b/src/lib/exporter/modernVideoExporter.ts index 275b7500..e2cf013e 100644 --- a/src/lib/exporter/modernVideoExporter.ts +++ b/src/lib/exporter/modernVideoExporter.ts @@ -434,6 +434,11 @@ export class ModernVideoExporter { "muxing queued video chunks", ); + // Surface muxing errors before proceeding with finalization + if (this.encoderError) { + throw this.encoderError; + } + if (nativeAudioPlan.audioMode !== "none" && !shouldUseFfmpegAudioFallback && !this.cancelled) { const demuxer = this.streamingDecoder.getDemuxer(); if ( @@ -1399,8 +1404,9 @@ export class ModernVideoExporter { } } catch (error) { console.error("Muxing error:", error); + const muxingError = error instanceof Error ? error : new Error(String(error)); if (!this.encoderError) { - this.encoderError = error instanceof Error ? error : new Error(String(error)); + this.encoderError = muxingError; } this.cancelled = true; } diff --git a/src/lib/exporter/videoExporter.ts b/src/lib/exporter/videoExporter.ts index 0202da9e..43d345c3 100644 --- a/src/lib/exporter/videoExporter.ts +++ b/src/lib/exporter/videoExporter.ts @@ -293,6 +293,11 @@ export class VideoExporter { "muxing queued video chunks", ); + // Surface muxing errors before proceeding with finalization + if (this.encoderError) { + throw this.encoderError; + } + if (hasAudio && !shouldUseFfmpegAudioFallback && !this.cancelled) { const demuxer = this.streamingDecoder.getDemuxer(); if (demuxer || hasAudioRegions || hasSourceAudioFallback) { @@ -979,6 +984,11 @@ export class VideoExporter { } } catch (error) { console.error("Muxing error:", error); + const muxingError = error instanceof Error ? error : new Error(String(error)); + if (!this.encoderError) { + this.encoderError = muxingError; + } + this.cancelled = true; } }); this.encodeQueue--;