mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-08 02:36:10 +00:00
fix(render): consolidate preflight and local recovery (#2403)
* fix(render): fall back when libx264 is unavailable * fix(render): recover orphaned browsers before retry * fix(render): check disk space on write volumes * test(engine): accept resolved ffmpeg binary paths * fix(render): harden H.264 capability fallback * chore(ci): scope inherited Fallow findings * fix(render): diagnose encoder probe failures
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
// fallow-ignore-file code-duplication
|
||||
import { execSync } from "node:child_process";
|
||||
import { execFileSync, execSync } from "node:child_process";
|
||||
import { existsSync } from "node:fs";
|
||||
import { resolve } from "node:path";
|
||||
import { detectLinuxDistro, ffmpegInstallCommand } from "./linuxDeps.js";
|
||||
@@ -7,6 +7,34 @@ import { detectLinuxDistro, ffmpegInstallCommand } from "./linuxDeps.js";
|
||||
export const FFMPEG_PATH_ENV = "HYPERFRAMES_FFMPEG_PATH";
|
||||
export const FFPROBE_PATH_ENV = "HYPERFRAMES_FFPROBE_PATH";
|
||||
|
||||
export type H264EncoderMode = "software" | "gpu";
|
||||
|
||||
/**
|
||||
* Select the H.264 encoder class supported by an FFmpeg build.
|
||||
*
|
||||
* Some macOS FFmpeg distributions expose VideoToolbox but omit libx264. The
|
||||
* default CPU render path must not pass libx264-only options such as `-preset`
|
||||
* to those builds.
|
||||
*/
|
||||
export function resolveH264EncoderMode(
|
||||
ffmpegEncodersOutput: string,
|
||||
gpuRequested: boolean,
|
||||
): H264EncoderMode {
|
||||
if (gpuRequested) return "gpu";
|
||||
if (/\blibx264\b/.test(ffmpegEncodersOutput)) return "software";
|
||||
if (/\bh264_videotoolbox\b/.test(ffmpegEncodersOutput)) return "gpu";
|
||||
throw new Error("This FFmpeg build has neither libx264 nor VideoToolbox H.264 encoding.");
|
||||
}
|
||||
|
||||
export function detectH264EncoderMode(ffmpegPath: string, gpuRequested: boolean): H264EncoderMode {
|
||||
const encoders = execFileSync(ffmpegPath, ["-hide_banner", "-encoders"], {
|
||||
encoding: "utf-8",
|
||||
stdio: ["ignore", "pipe", "pipe"],
|
||||
timeout: 5000,
|
||||
});
|
||||
return resolveH264EncoderMode(encoders, gpuRequested);
|
||||
}
|
||||
|
||||
function chooseBestPathCandidate(
|
||||
name: "ffmpeg" | "ffprobe",
|
||||
candidates: string[],
|
||||
|
||||
Reference in New Issue
Block a user