From 25d5db8db6f63d5a5263de5c9ee0d5323bc9b533 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Thu, 27 Feb 2025 20:06:23 -0600 Subject: [PATCH] transcode: use a structured object for ffmpeg options --- packages/ditto/utils/transcode.ts | 37 +++++++++++++------------------ 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/packages/ditto/utils/transcode.ts b/packages/ditto/utils/transcode.ts index 8062f85a..3d8d8162 100644 --- a/packages/ditto/utils/transcode.ts +++ b/packages/ditto/utils/transcode.ts @@ -1,26 +1,19 @@ -export async function transcodeVideoStream( - inputStream: ReadableStream, -): Promise> { +export async function transcodeVideoStream(input: ReadableStream): Promise> { + const opts = { + 'i': 'pipe:0', // Read input from stdin + 'c:v': 'libx264', // Convert to H.264 + 'preset': 'veryfast', // Encoding speed + 'loglevel': 'fatal', // Suppress logs + 'crf': '23', // Compression level (lower = better quality) + 'c:a': 'aac', // Convert to AAC audio + 'b:a': '128k', // Audio bitrate + 'movflags': 'frag_keyframe+empty_moov', // Ensures MP4 streaming compatibility + 'f': 'mp4', // Force MP4 format + }; + const command = new Deno.Command('ffmpeg', { args: [ - '-i', - 'pipe:0', // Read input from stdin - '-c:v', - 'libx264', // Convert to H.264 - '-preset', - 'veryfast', // Encoding speed - '-loglevel', - 'fatal', // Suppress logs - '-crf', - '23', // Compression level (lower = better quality) - '-c:a', - 'aac', // Convert to AAC audio - '-b:a', - '128k', // Audio bitrate - '-movflags', - 'frag_keyframe+empty_moov', // Ensures MP4 streaming compatibility - '-f', - 'mp4', // Force MP4 format + ...Object.entries(opts).flatMap(([k, v]) => [`-${k}`, v]), 'pipe:1', // Output to stdout ], stdin: 'piped', @@ -38,7 +31,7 @@ export async function transcodeVideoStream( // Pipe the input stream into FFmpeg stdin and ensure completion const writer = process.stdin.getWriter(); - const reader = inputStream.getReader(); + const reader = input.getReader(); async function pumpInput() { try {