From 37568aa0d18303c1737bc85da51f2e7c0d0bc109 Mon Sep 17 00:00:00 2001 From: Satakun Utama Date: Mon, 22 Sep 2025 00:24:52 +0700 Subject: [PATCH] Pixel Format & Audio Encoder fix --- solid-src/src/App.tsx | 38 ++++++++++++++++++++++++++++++++++-- solid-src/src/util/ffmpeg.ts | 34 +++++++++++++++++++++++++++++++- 2 files changed, 69 insertions(+), 3 deletions(-) diff --git a/solid-src/src/App.tsx b/solid-src/src/App.tsx index 072985b..476d439 100644 --- a/solid-src/src/App.tsx +++ b/solid-src/src/App.tsx @@ -14,6 +14,7 @@ import { generateOutputCommand, getAvailableCodecs, getLengthMicroseconds, + getPixelFormats, playFile, videoFileExtensions, type CodecInfo, @@ -60,6 +61,8 @@ function App() { const [outputopts, setOutputopts] = createSignal(""); const [audioCodec, setAudioCodec] = createSignal("copy"); const [audioEncoder, setAudioEncoder] = createSignal(""); + const [pixelFormatList, setPixelFormatList] = createSignal([] as string[]); + const [pixelFormat, setPixelFormat] = createSignal(""); const logs: { [id: number]: string[] } = {}; let supportedCodecs: CodecList = { vcodecs: [], acodecs: [] }; let ffmpegParams: FFmpegParams = { @@ -139,6 +142,8 @@ function App() { ffmpegParams.encoder = firstCodec.encoders[0]; setSelectedCodec(firstCodec); setSelectedEncoder(firstCodec.encoders[0]); + + setPixelFormatList(await getPixelFormats()); }); onCleanup(() => { @@ -231,7 +236,7 @@ function App() { function getAudioEncoders() { const codec = audioCodec(); - const encoders = audioCodecList().find( + let encoders = audioCodecList().find( (v) => v.shortName === codec, )?.encoders; @@ -239,6 +244,10 @@ function App() { setAudioEncoder(encoders[0]); } + if (encoders instanceof Array && encoders.length === 0) { + encoders = undefined; + } + return encoders; } @@ -265,10 +274,18 @@ function App() { encoder = undefined; } + let acodec = audioEncoder(); + + if (acodec === "") { + acodec = audioCodec(); + } + + const pixFmt = pixelFormat(); + ffmpegParams = { vcodec: selectedCodec()?.shortName ?? "", encoder, - acodec: audioCodec(), + acodec, abitrate: ffmpegParams.abitrate, crf: ffmpegParams.crf, doNotUseAn: ffmpegParams.doNotUseAn, @@ -283,6 +300,7 @@ function App() { input: inputopts(), output: outputopts(), }, + pixelFormat: pixFmt === "" ? undefined : pixFmt, }; setOutputCommand(generateOutputCommand(ffmpegParams)); @@ -542,6 +560,22 @@ function App() { + + }> { }; } +export async function getPixelFormats(): Promise { + const seperator = "-----"; + const result = await Neutralino.os.execCommand("ffmpeg -pix_fmts"); + const rawFormatList = result.stdOut + .substring(result.stdOut.indexOf(seperator) + seperator.length) + .split("\n"); + let outputFormats = []; + + for (let format of rawFormatList) { + format = format.trim(); + const flags = format.substring(0, 5); + + if (flags[1] !== "O") continue; + + const parts = format.substring(6).split(/ +/); + + outputFormats.push(parts[0]); + } + + return outputFormats; +} + export function playFile(path: string) { Neutralino.os.execCommand(`ffplay "${path}"`); } @@ -114,6 +136,7 @@ export interface FFmpegParams { faststart?: boolean; doNotUseAn?: boolean; speed?: number; + pixelFormat?: string; /** * Extra parameters defined by users */ @@ -156,8 +179,17 @@ export function generateOutputCommand(params: FFmpegParams) { globalopts += " " + params.useropts.global; } + if (params.pixelFormat) { + if (params.outputopts === undefined) { + params.outputopts = {}; + } + + params.outputopts = { + "pix_fmt": params.pixelFormat + }; + } + if (params.outputopts !== undefined) { - console.log(params.outputopts); for (const key of Object.keys(params.outputopts)) { outputopts += ` -${key} ${params.outputopts[key]}`.trimEnd(); }