fix: move LayoutStudio before per-audio section and add ultrafast preset + 1fps output

- LayoutStudio was buried after the per-audio list, making settings invisible
  before submit; moved it right after the Files section so layout/watermark
  settings are always visible in the workflow
- Add -preset ultrafast and -r 1 to both libx264 encode paths; without a
  preset FFmpeg defaults to medium and wastes time on motion estimation for
  still images; -r 1 avoids 25x frame synthesis overhead on 1080p
This commit is contained in:
Atakan Doğan Özban
2026-08-19 17:07:28 +02:00
parent 4c47a052a8
commit a8beabfe36
2 changed files with 33 additions and 25 deletions
+25 -25
View File
@@ -478,6 +478,31 @@ export function UploadForm() {
</div>
</section>
<LayoutStudio
locked={false}
previewImageUrl={
audioItems.find((a) => a.itemImagePreview)?.itemImagePreview || imagePreviewUrl
}
previewBackgroundUrl={backgroundPreviewUrl}
songTitle={
audioItems[0]?.metadata.songTitle ||
audioItems[0]?.metadata.title ||
"Track title"
}
artist={audioItems[0]?.metadata.artist || ""}
encodeWidth={parseInt(readyAudios[0]?.metadata.resolution?.split("x")[0] || "1280", 10)}
layout={jobLayout}
onLayoutChange={applyLayoutToAll}
watermark={jobWatermark}
onWatermarkChange={applyWatermarkToAll}
onUploadLogo={handleLogoUpload}
onUploadFont={handleFontUpload}
onUploadBackground={handleBackgroundUpload}
onClearBackground={clearBackgroundImage}
hasCustomBackground={Boolean(backgroundImagePath)}
logoPreviewUrl={logoPreviewUrl}
/>
{audioItems.length > 0 && (
<section className="space-y-4">
<h2 className="text-lg font-medium text-white">Video details (per audio)</h2>
@@ -640,31 +665,6 @@ export function UploadForm() {
</section>
)}
<LayoutStudio
locked={false}
previewImageUrl={
audioItems.find((a) => a.itemImagePreview)?.itemImagePreview || imagePreviewUrl
}
previewBackgroundUrl={backgroundPreviewUrl}
songTitle={
audioItems[0]?.metadata.songTitle ||
audioItems[0]?.metadata.title ||
"Track title"
}
artist={audioItems[0]?.metadata.artist || ""}
encodeWidth={parseInt(readyAudios[0]?.metadata.resolution?.split("x")[0] || "1280", 10)}
layout={jobLayout}
onLayoutChange={applyLayoutToAll}
watermark={jobWatermark}
onWatermarkChange={applyWatermarkToAll}
onUploadLogo={handleLogoUpload}
onUploadFont={handleFontUpload}
onUploadBackground={handleBackgroundUpload}
onClearBackground={clearBackgroundImage}
hasCustomBackground={Boolean(backgroundImagePath)}
logoPreviewUrl={logoPreviewUrl}
/>
<button
type="submit"
disabled={!canSubmit}
+8
View File
@@ -283,8 +283,12 @@ export async function encodeVideo(options: {
args.push(
"-c:v",
"libx264",
"-preset",
"ultrafast",
"-tune",
"stillimage",
"-r",
"1",
);
pushAudioEncodeArgs(args, audioEncode);
args.push(
@@ -382,8 +386,12 @@ export async function encodeVideo(options: {
args.push(
"-c:v",
"libx264",
"-preset",
"ultrafast",
"-tune",
"stillimage",
"-r",
"1",
);
pushAudioEncodeArgs(args, audioEncode);
args.push(