Add optional --x264 feature that matches AV1 presets
- Added --x264 command line flag support - Created H.264/x264 presets that match AV1 settings: - Fast: fast preset, film tune, high profile - Web-optimized: medium preset, film tune, high profile - Quick: medium preset, film tune, high profile - Tiny: fast preset, film tune, main profile - Updated encoding logic to use libx264 when --x264 flag is provided - Updated help text and examples to show x264 usage - AV1 remains the default codec, x264 is optional - Output files are named with H264 prefix when using x264
This commit is contained in:
1
NEXT STEPS
Normal file
1
NEXT STEPS
Normal file
@@ -0,0 +1 @@
|
||||
alright now working on the development branch impliment an optional --x264 feature that will aim to match the similar settings of the AV1 presets. AV1 will be the default but if user ads --x264 then we use that instead
|
||||
@@ -36,13 +36,16 @@ func printHelp() {
|
||||
fmt.Println(" --tiny Tiny encoding (MP4, CRF 45, Opus 64kbps, preset 8)")
|
||||
fmt.Println(" --full Full interactive mode with all codecs and options")
|
||||
fmt.Println()
|
||||
fmt.Println("🎬 CODEC OPTIONS:")
|
||||
fmt.Println(" --x264 Use H.264/x264 codec instead of AV1 (matches AV1 presets)")
|
||||
fmt.Println()
|
||||
fmt.Println("📊 INFORMATION OPTIONS:")
|
||||
fmt.Println(" --help Show this help information")
|
||||
fmt.Println(" --info Show system information")
|
||||
fmt.Println(" --stats Show encoding statistics")
|
||||
fmt.Println()
|
||||
fmt.Println("⚙️ FEATURES:")
|
||||
fmt.Println("• Multiple codecs: AV1, HEVC, H264, X265")
|
||||
fmt.Println("• Multiple codecs: AV1 (default), H.264/x264")
|
||||
fmt.Println("• Hardware acceleration support (NVENC)")
|
||||
fmt.Println("• Automatic file detection")
|
||||
fmt.Println("• Progress tracking with ETA")
|
||||
@@ -56,9 +59,11 @@ func printHelp() {
|
||||
fmt.Println()
|
||||
fmt.Println("💡 EXAMPLES:")
|
||||
fmt.Println(" ./gwencoder --fast # Fast AV1 encoding")
|
||||
fmt.Println(" ./gwencoder --web # Web-optimized encoding")
|
||||
fmt.Println(" ./gwencoder --quick # Quick encoding")
|
||||
fmt.Println(" ./gwencoder --tiny # Tiny file encoding")
|
||||
fmt.Println(" ./gwencoder --fast --x264 # Fast H.264 encoding")
|
||||
fmt.Println(" ./gwencoder --web # Web-optimized AV1 encoding")
|
||||
fmt.Println(" ./gwencoder --web --x264 # Web-optimized H.264 encoding")
|
||||
fmt.Println(" ./gwencoder --quick # Quick AV1 encoding")
|
||||
fmt.Println(" ./gwencoder --tiny # Tiny file AV1 encoding")
|
||||
fmt.Println(" ./gwencoder --full # Full interactive mode")
|
||||
fmt.Println(" ./gwencoder --help # Show this help")
|
||||
fmt.Println(" ./gwencoder --info # Show system info")
|
||||
@@ -111,9 +116,13 @@ func printStats() {
|
||||
fmt.Println("══════════════════════════════════════════════════════════════")
|
||||
}
|
||||
|
||||
func encodeFile(file string, mode gwutils.EncodingMode) (time.Duration, int64, error) {
|
||||
func encodeFile(file string, mode gwutils.EncodingMode, useX264 bool) (time.Duration, int64, error) {
|
||||
base := strings.TrimSuffix(filepath.Base(file), filepath.Ext(file))
|
||||
out := fmt.Sprintf("%s-AV1-%s-GWELL.%s", base, strings.Title(mode.Name), mode.Container)
|
||||
codecName := "AV1"
|
||||
if useX264 {
|
||||
codecName = "H264"
|
||||
}
|
||||
out := fmt.Sprintf("%s-%s-%s-GWELL.%s", base, codecName, strings.Title(mode.Name), mode.Container)
|
||||
|
||||
start := time.Now()
|
||||
|
||||
@@ -128,43 +137,92 @@ func encodeFile(file string, mode gwutils.EncodingMode) (time.Duration, int64, e
|
||||
// Calculate physical cores
|
||||
physicalCores := gwutils.GetPhysicalCores()
|
||||
|
||||
// AV1 parameters based on mode
|
||||
var svtParams string
|
||||
if mode.Name == "Web-optimized" {
|
||||
svtParams = fmt.Sprintf("\"preset=%s:tune=0:scd=1:aq-mode=1:lp=%d:keyint=240:film-grain=0:input-depth=8:fast-decode=1:lookahead=90:enable-tf=0\"",
|
||||
mode.Preset, physicalCores)
|
||||
} else if mode.Name == "Quick" {
|
||||
svtParams = fmt.Sprintf("\"preset=%s:tune=0:scd=1:aq-mode=1:lp=%d:keyint=240:film-grain=0:input-depth=8:fast-decode=1:lookahead=90:enable-tf=0\"",
|
||||
mode.Preset, physicalCores)
|
||||
} else if mode.Name == "Tiny" {
|
||||
svtParams = fmt.Sprintf("\"preset=%s:tune=1:scd=1:aq-mode=2:lp=%d:keyint=240:film-grain=0:input-depth=8:fast-decode=1:lookahead=120:enable-tf=0\"",
|
||||
mode.Preset, physicalCores)
|
||||
} else {
|
||||
// Fast mode
|
||||
svtParams = fmt.Sprintf("\"preset=%s:tune=0:scd=0:aq-mode=1:lp=%d:keyint=240:film-grain=0:input-depth=8:fast-decode=1:lookahead=60:enable-tf=0\"",
|
||||
mode.Preset, physicalCores)
|
||||
}
|
||||
|
||||
// Build FFmpeg arguments
|
||||
args := []string{"-y", "-i", file}
|
||||
args = append(args, "-c:v", "libsvtav1")
|
||||
args = append(args, "-crf", mode.CRF)
|
||||
args = append(args, "-b:v", "0")
|
||||
args = append(args, "-maxrate", fmt.Sprintf("%sk", mode.Maxrate))
|
||||
args = append(args, "-bufsize", fmt.Sprintf("%sk", mode.Maxrate))
|
||||
args = append(args, "-svtav1-params", svtParams)
|
||||
|
||||
if useX264 {
|
||||
// H.264/x264 parameters based on mode
|
||||
var x264Preset string
|
||||
var x264Tune string
|
||||
var x264Profile string
|
||||
|
||||
if mode.Name == "Web-optimized" {
|
||||
x264Preset = "medium"
|
||||
x264Tune = "film"
|
||||
x264Profile = "high"
|
||||
} else if mode.Name == "Quick" {
|
||||
x264Preset = "medium"
|
||||
x264Tune = "film"
|
||||
x264Profile = "high"
|
||||
} else if mode.Name == "Tiny" {
|
||||
x264Preset = "fast"
|
||||
x264Tune = "film"
|
||||
x264Profile = "main"
|
||||
} else {
|
||||
// Fast mode
|
||||
x264Preset = "fast"
|
||||
x264Tune = "film"
|
||||
x264Profile = "high"
|
||||
}
|
||||
|
||||
args = append(args, "-c:v", "libx264")
|
||||
args = append(args, "-crf", mode.CRF)
|
||||
args = append(args, "-preset", x264Preset)
|
||||
args = append(args, "-tune", x264Tune)
|
||||
args = append(args, "-profile:v", x264Profile)
|
||||
args = append(args, "-level", "4.1")
|
||||
args = append(args, "-maxrate", fmt.Sprintf("%sk", mode.Maxrate))
|
||||
args = append(args, "-bufsize", fmt.Sprintf("%sk", mode.Maxrate))
|
||||
args = append(args, "-threads", strconv.Itoa(physicalCores))
|
||||
args = append(args, "-g", "240")
|
||||
args = append(args, "-keyint_min", "24")
|
||||
args = append(args, "-sc_threshold", "40")
|
||||
args = append(args, "-bf", "2")
|
||||
args = append(args, "-b_strategy", "1")
|
||||
args = append(args, "-aq-mode", "1")
|
||||
args = append(args, "-aq-strength", "1.0")
|
||||
} else {
|
||||
// AV1 parameters based on mode
|
||||
var svtParams string
|
||||
if mode.Name == "Web-optimized" {
|
||||
svtParams = fmt.Sprintf("\"preset=%s:tune=0:scd=1:aq-mode=1:lp=%d:keyint=240:film-grain=0:input-depth=8:fast-decode=1:lookahead=90:enable-tf=0\"",
|
||||
mode.Preset, physicalCores)
|
||||
} else if mode.Name == "Quick" {
|
||||
svtParams = fmt.Sprintf("\"preset=%s:tune=0:scd=1:aq-mode=1:lp=%d:keyint=240:film-grain=0:input-depth=8:fast-decode=1:lookahead=90:enable-tf=0\"",
|
||||
mode.Preset, physicalCores)
|
||||
} else if mode.Name == "Tiny" {
|
||||
svtParams = fmt.Sprintf("\"preset=%s:tune=1:scd=1:aq-mode=2:lp=%d:keyint=240:film-grain=0:input-depth=8:fast-decode=1:lookahead=120:enable-tf=0\"",
|
||||
mode.Preset, physicalCores)
|
||||
} else {
|
||||
// Fast mode
|
||||
svtParams = fmt.Sprintf("\"preset=%s:tune=0:scd=0:aq-mode=1:lp=%d:keyint=240:film-grain=0:input-depth=8:fast-decode=1:lookahead=60:enable-tf=0\"",
|
||||
mode.Preset, physicalCores)
|
||||
}
|
||||
|
||||
args = append(args, "-c:v", "libsvtav1")
|
||||
args = append(args, "-crf", mode.CRF)
|
||||
args = append(args, "-b:v", "0")
|
||||
args = append(args, "-maxrate", fmt.Sprintf("%sk", mode.Maxrate))
|
||||
args = append(args, "-bufsize", fmt.Sprintf("%sk", mode.Maxrate))
|
||||
args = append(args, "-svtav1-params", svtParams)
|
||||
args = append(args, "-g", "240")
|
||||
}
|
||||
|
||||
args = append(args, "-c:a", "libopus")
|
||||
args = append(args, audioBitrateParts...)
|
||||
args = append(args, "-map", "0:v", "-map", "0:a")
|
||||
args = append(args, "-g", "240")
|
||||
args = append(args, "-sn") // Skip subtitles for speed
|
||||
args = append(args, out)
|
||||
|
||||
fmt.Printf("🎬 %s AV1 Encoding: %s → %s\n", mode.Name, file, out)
|
||||
fmt.Printf("🎬 %s %s Encoding: %s → %s\n", mode.Name, codecName, file, out)
|
||||
fmt.Printf("⚡ %s settings:\n", mode.Name)
|
||||
fmt.Printf(" • Using %d physical cores\n", physicalCores)
|
||||
fmt.Printf(" • CRF=%s (%s quality)\n", mode.CRF, mode.Name)
|
||||
fmt.Printf(" • Preset=%s (encoding speed)\n", mode.Preset)
|
||||
if useX264 {
|
||||
fmt.Printf(" • H.264/x264 codec\n")
|
||||
} else {
|
||||
fmt.Printf(" • Preset=%s (encoding speed)\n", mode.Preset)
|
||||
}
|
||||
fmt.Printf(" • Opus audio at %skbps per channel\n", mode.AudioBitrate)
|
||||
fmt.Printf(" • %s container\n", strings.ToUpper(mode.Container))
|
||||
if totalDuration > 0 {
|
||||
@@ -201,7 +259,7 @@ func encodeFile(file string, mode gwutils.EncodingMode) (time.Duration, int64, e
|
||||
fmt.Printf("✅ %s encoding complete: %s in %s\n", mode.Name, file, duration)
|
||||
fmt.Printf("📊 Output file size: %.2f MB\n", float64(fileSize)/(1024*1024))
|
||||
|
||||
gwutils.AppendToFile("gwencoder_log.txt", fmt.Sprintf("Encoded %s in %d seconds using %s mode\n", file, int(duration.Seconds()), mode.Name))
|
||||
gwutils.AppendToFile("gwencoder_log.txt", fmt.Sprintf("Encoded %s in %d seconds using %s mode (%s)\n", file, int(duration.Seconds()), mode.Name, codecName))
|
||||
updateStats(file, int(duration.Seconds()), mode.Name)
|
||||
|
||||
return duration, fileSize, nil
|
||||
@@ -243,7 +301,26 @@ func main() {
|
||||
return
|
||||
}
|
||||
|
||||
arg := os.Args[1]
|
||||
// Check for --x264 flag
|
||||
useX264 := false
|
||||
args := os.Args[1:]
|
||||
|
||||
// Filter out --x264 flag and set useX264
|
||||
var filteredArgs []string
|
||||
for _, arg := range args {
|
||||
if arg == "--x264" {
|
||||
useX264 = true
|
||||
} else {
|
||||
filteredArgs = append(filteredArgs, arg)
|
||||
}
|
||||
}
|
||||
|
||||
if len(filteredArgs) == 0 {
|
||||
printHelp()
|
||||
return
|
||||
}
|
||||
|
||||
arg := filteredArgs[0]
|
||||
modes := gwutils.GetDefaultModes()
|
||||
|
||||
switch arg {
|
||||
@@ -256,26 +333,44 @@ func main() {
|
||||
case "--fast":
|
||||
printHeader()
|
||||
fmt.Println()
|
||||
fmt.Println("⚡ FAST ENCODING MODE")
|
||||
fmt.Println("══════════════════════════════════════════════════════════════")
|
||||
fmt.Println("Using fast encoding settings:")
|
||||
fmt.Println("• AV1 codec with speed preset (10)")
|
||||
fmt.Println("• Opus audio at 64kbps per channel")
|
||||
fmt.Println("• MKV container for better compatibility")
|
||||
fmt.Println("• CRF 32 for fast encoding")
|
||||
if useX264 {
|
||||
fmt.Println("⚡ FAST H.264 ENCODING MODE")
|
||||
fmt.Println("══════════════════════════════════════════════════════════════")
|
||||
fmt.Println("Using fast H.264 encoding settings:")
|
||||
fmt.Println("• H.264/x264 codec with fast preset")
|
||||
fmt.Println("• Opus audio at 64kbps per channel")
|
||||
fmt.Println("• MKV container for better compatibility")
|
||||
fmt.Println("• CRF 32 for fast encoding")
|
||||
} else {
|
||||
fmt.Println("⚡ FAST ENCODING MODE")
|
||||
fmt.Println("══════════════════════════════════════════════════════════════")
|
||||
fmt.Println("Using fast encoding settings:")
|
||||
fmt.Println("• AV1 codec with speed preset (10)")
|
||||
fmt.Println("• Opus audio at 64kbps per channel")
|
||||
fmt.Println("• MKV container for better compatibility")
|
||||
fmt.Println("• CRF 32 for fast encoding")
|
||||
}
|
||||
fmt.Println()
|
||||
|
||||
mode := modes["fast"]
|
||||
fmt.Printf("⚡ %s AV1 settings:\n", mode.Name)
|
||||
codecName := "AV1"
|
||||
if useX264 {
|
||||
codecName = "H264"
|
||||
}
|
||||
fmt.Printf("⚡ %s %s settings:\n", mode.Name, codecName)
|
||||
fmt.Printf(" • Using %d physical cores\n", gwutils.GetPhysicalCores())
|
||||
fmt.Printf(" • CRF=%s (fast encoding quality)\n", mode.CRF)
|
||||
fmt.Printf(" • Preset=%s (speed optimized)\n", mode.Preset)
|
||||
if useX264 {
|
||||
fmt.Printf(" • H.264/x264 codec\n")
|
||||
} else {
|
||||
fmt.Printf(" • Preset=%s (speed optimized)\n", mode.Preset)
|
||||
}
|
||||
fmt.Printf(" • Opus audio at %skbps per channel\n", mode.AudioBitrate)
|
||||
fmt.Printf(" • %s container\n", strings.ToUpper(mode.Container))
|
||||
fmt.Println("📏 Using original resolution")
|
||||
fmt.Println()
|
||||
|
||||
excludePatterns := []string{"GWELL", "AV1-"}
|
||||
excludePatterns := []string{"GWELL", "AV1-", "H264-"}
|
||||
files := gwutils.FindMediaFiles(excludePatterns)
|
||||
if len(files) == 0 {
|
||||
fmt.Println("❌ No video files found in current directory.")
|
||||
@@ -286,33 +381,51 @@ func main() {
|
||||
fmt.Println()
|
||||
|
||||
for _, file := range files {
|
||||
encodeFile(file, mode)
|
||||
encodeFile(file, mode, useX264)
|
||||
fmt.Println()
|
||||
}
|
||||
|
||||
case "--web":
|
||||
printHeader()
|
||||
fmt.Println()
|
||||
fmt.Println("🌐 WEB-OPTIMIZED ENCODING MODE")
|
||||
fmt.Println("══════════════════════════════════════════════════════════════")
|
||||
fmt.Println("Using web-optimized settings:")
|
||||
fmt.Println("• AV1 codec with balanced preset (10)")
|
||||
fmt.Println("• Opus audio at 64kbps per channel")
|
||||
fmt.Println("• WEBM container for web compatibility")
|
||||
fmt.Println("• CRF 40 for web-optimized quality")
|
||||
if useX264 {
|
||||
fmt.Println("🌐 WEB-OPTIMIZED H.264 ENCODING MODE")
|
||||
fmt.Println("══════════════════════════════════════════════════════════════")
|
||||
fmt.Println("Using web-optimized H.264 settings:")
|
||||
fmt.Println("• H.264/x264 codec with medium preset")
|
||||
fmt.Println("• Opus audio at 64kbps per channel")
|
||||
fmt.Println("• WEBM container for web compatibility")
|
||||
fmt.Println("• CRF 40 for web-optimized quality")
|
||||
} else {
|
||||
fmt.Println("🌐 WEB-OPTIMIZED ENCODING MODE")
|
||||
fmt.Println("══════════════════════════════════════════════════════════════")
|
||||
fmt.Println("Using web-optimized settings:")
|
||||
fmt.Println("• AV1 codec with balanced preset (10)")
|
||||
fmt.Println("• Opus audio at 64kbps per channel")
|
||||
fmt.Println("• WEBM container for web compatibility")
|
||||
fmt.Println("• CRF 40 for web-optimized quality")
|
||||
}
|
||||
fmt.Println()
|
||||
|
||||
mode := modes["web"]
|
||||
fmt.Printf("🌐 %s AV1 settings:\n", mode.Name)
|
||||
codecName := "AV1"
|
||||
if useX264 {
|
||||
codecName = "H264"
|
||||
}
|
||||
fmt.Printf("🌐 %s %s settings:\n", mode.Name, codecName)
|
||||
fmt.Printf(" • Using %d physical cores\n", gwutils.GetPhysicalCores())
|
||||
fmt.Printf(" • CRF=%s (web-optimized quality)\n", mode.CRF)
|
||||
fmt.Printf(" • Preset=%s (balanced encoding)\n", mode.Preset)
|
||||
if useX264 {
|
||||
fmt.Printf(" • H.264/x264 codec\n")
|
||||
} else {
|
||||
fmt.Printf(" • Preset=%s (balanced encoding)\n", mode.Preset)
|
||||
}
|
||||
fmt.Printf(" • Opus audio at %skbps per channel\n", mode.AudioBitrate)
|
||||
fmt.Printf(" • %s container for web compatibility\n", strings.ToUpper(mode.Container))
|
||||
fmt.Println("📏 Using original resolution")
|
||||
fmt.Println()
|
||||
|
||||
excludePatterns := []string{"GWELL", "AV1-"}
|
||||
excludePatterns := []string{"GWELL", "AV1-", "H264-"}
|
||||
files := gwutils.FindMediaFiles(excludePatterns)
|
||||
if len(files) == 0 {
|
||||
fmt.Println("❌ No video files found in current directory.")
|
||||
@@ -323,33 +436,51 @@ func main() {
|
||||
fmt.Println()
|
||||
|
||||
for _, file := range files {
|
||||
encodeFile(file, mode)
|
||||
encodeFile(file, mode, useX264)
|
||||
fmt.Println()
|
||||
}
|
||||
|
||||
case "--quick":
|
||||
printHeader()
|
||||
fmt.Println()
|
||||
fmt.Println("⚡ QUICK ENCODING MODE")
|
||||
fmt.Println("══════════════════════════════════════════════════════════════")
|
||||
fmt.Println("Using quick encoding settings:")
|
||||
fmt.Println("• AV1 codec with balanced preset (10)")
|
||||
fmt.Println("• Opus audio at 80kbps per channel")
|
||||
fmt.Println("• MKV container for better compatibility")
|
||||
fmt.Println("• CRF 32 for quick encoding")
|
||||
if useX264 {
|
||||
fmt.Println("⚡ QUICK H.264 ENCODING MODE")
|
||||
fmt.Println("══════════════════════════════════════════════════════════════")
|
||||
fmt.Println("Using quick H.264 encoding settings:")
|
||||
fmt.Println("• H.264/x264 codec with medium preset")
|
||||
fmt.Println("• Opus audio at 80kbps per channel")
|
||||
fmt.Println("• MKV container for better compatibility")
|
||||
fmt.Println("• CRF 32 for quick encoding")
|
||||
} else {
|
||||
fmt.Println("⚡ QUICK ENCODING MODE")
|
||||
fmt.Println("══════════════════════════════════════════════════════════════")
|
||||
fmt.Println("Using quick encoding settings:")
|
||||
fmt.Println("• AV1 codec with balanced preset (10)")
|
||||
fmt.Println("• Opus audio at 80kbps per channel")
|
||||
fmt.Println("• MKV container for better compatibility")
|
||||
fmt.Println("• CRF 32 for quick encoding")
|
||||
}
|
||||
fmt.Println()
|
||||
|
||||
mode := modes["quick"]
|
||||
fmt.Printf("⚡ %s AV1 settings:\n", mode.Name)
|
||||
codecName := "AV1"
|
||||
if useX264 {
|
||||
codecName = "H264"
|
||||
}
|
||||
fmt.Printf("⚡ %s %s settings:\n", mode.Name, codecName)
|
||||
fmt.Printf(" • Using %d physical cores\n", gwutils.GetPhysicalCores())
|
||||
fmt.Printf(" • CRF=%s (quick encoding quality)\n", mode.CRF)
|
||||
fmt.Printf(" • Preset=%s (balanced encoding)\n", mode.Preset)
|
||||
if useX264 {
|
||||
fmt.Printf(" • H.264/x264 codec\n")
|
||||
} else {
|
||||
fmt.Printf(" • Preset=%s (balanced encoding)\n", mode.Preset)
|
||||
}
|
||||
fmt.Printf(" • Opus audio at %skbps per channel\n", mode.AudioBitrate)
|
||||
fmt.Printf(" • %s container\n", strings.ToUpper(mode.Container))
|
||||
fmt.Println("📏 Using original resolution")
|
||||
fmt.Println()
|
||||
|
||||
excludePatterns := []string{"GWELL", "AV1-"}
|
||||
excludePatterns := []string{"GWELL", "AV1-", "H264-"}
|
||||
files := gwutils.FindMediaFiles(excludePatterns)
|
||||
if len(files) == 0 {
|
||||
fmt.Println("❌ No video files found in current directory.")
|
||||
@@ -360,33 +491,51 @@ func main() {
|
||||
fmt.Println()
|
||||
|
||||
for _, file := range files {
|
||||
encodeFile(file, mode)
|
||||
encodeFile(file, mode, useX264)
|
||||
fmt.Println()
|
||||
}
|
||||
|
||||
case "--tiny":
|
||||
printHeader()
|
||||
fmt.Println()
|
||||
fmt.Println("📦 TINY ENCODING MODE")
|
||||
fmt.Println("══════════════════════════════════════════════════════════════")
|
||||
fmt.Println("Using tiny encoding settings:")
|
||||
fmt.Println("• AV1 codec with quality preset (8)")
|
||||
fmt.Println("• Opus audio at 64kbps per channel")
|
||||
fmt.Println("• MP4 container for maximum compatibility")
|
||||
fmt.Println("• CRF 45 for smallest file size")
|
||||
if useX264 {
|
||||
fmt.Println("📦 TINY H.264 ENCODING MODE")
|
||||
fmt.Println("══════════════════════════════════════════════════════════════")
|
||||
fmt.Println("Using tiny H.264 encoding settings:")
|
||||
fmt.Println("• H.264/x264 codec with fast preset")
|
||||
fmt.Println("• Opus audio at 64kbps per channel")
|
||||
fmt.Println("• MP4 container for maximum compatibility")
|
||||
fmt.Println("• CRF 45 for smallest file size")
|
||||
} else {
|
||||
fmt.Println("📦 TINY ENCODING MODE")
|
||||
fmt.Println("══════════════════════════════════════════════════════════════")
|
||||
fmt.Println("Using tiny encoding settings:")
|
||||
fmt.Println("• AV1 codec with quality preset (8)")
|
||||
fmt.Println("• Opus audio at 64kbps per channel")
|
||||
fmt.Println("• MP4 container for maximum compatibility")
|
||||
fmt.Println("• CRF 45 for smallest file size")
|
||||
}
|
||||
fmt.Println()
|
||||
|
||||
mode := modes["tiny"]
|
||||
fmt.Printf("📦 %s AV1 settings:\n", mode.Name)
|
||||
codecName := "AV1"
|
||||
if useX264 {
|
||||
codecName = "H264"
|
||||
}
|
||||
fmt.Printf("📦 %s %s settings:\n", mode.Name, codecName)
|
||||
fmt.Printf(" • Using %d physical cores\n", gwutils.GetPhysicalCores())
|
||||
fmt.Printf(" • CRF=%s (tiny file quality)\n", mode.CRF)
|
||||
fmt.Printf(" • Preset=%s (quality encoding)\n", mode.Preset)
|
||||
if useX264 {
|
||||
fmt.Printf(" • H.264/x264 codec\n")
|
||||
} else {
|
||||
fmt.Printf(" • Preset=%s (quality encoding)\n", mode.Preset)
|
||||
}
|
||||
fmt.Printf(" • Opus audio at %skbps per channel\n", mode.AudioBitrate)
|
||||
fmt.Printf(" • %s container for maximum compatibility\n", strings.ToUpper(mode.Container))
|
||||
fmt.Println("📏 Using original resolution")
|
||||
fmt.Println()
|
||||
|
||||
excludePatterns := []string{"GWELL", "AV1-"}
|
||||
excludePatterns := []string{"GWELL", "AV1-", "H264-"}
|
||||
files := gwutils.FindMediaFiles(excludePatterns)
|
||||
if len(files) == 0 {
|
||||
fmt.Println("❌ No video files found in current directory.")
|
||||
@@ -397,7 +546,7 @@ func main() {
|
||||
fmt.Println()
|
||||
|
||||
for _, file := range files {
|
||||
encodeFile(file, mode)
|
||||
encodeFile(file, mode, useX264)
|
||||
fmt.Println()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user