allow custom codec flags to ffmpeg, output stderr

This commit is contained in:
tocariimaa 2024-12-31 13:37:59 -03:00
parent c1f35def47
commit d14376431e

View file

@ -2,6 +2,7 @@ package main
import ( import (
"archive/zip" "archive/zip"
"bytes"
"fmt" "fmt"
"io" "io"
"os" "os"
@ -24,24 +25,35 @@ func makeConcatDemuxFile(manifest UgoiraManifest, frameDescFile *os.File) {
frameDescFile.WriteString(fmt.Sprintf("file '%s'\n", lastFrame.File)) frameDescFile.WriteString(fmt.Sprintf("file '%s'\n", lastFrame.File))
} }
func callFFmpeg(frameDescPath, outputFilePath, workDir string) error { func callFFmpeg(frameDescPath, outputFilePath, workDir, ffmpegArgs string) error {
// TODO: allow custom ffmpeg flags const ffmpegBaseArgs = `-hide_banner
const ffmpegArgs = `-hide_banner -loglevel warning
-loglevel warning -f concat -i %s
-f concat -i %s -fps_mode vfr`
-an // Default codec arguments, for a VP9 WebM
-fps_mode vfr const ffmpegDefaultArgs = `-an
-q:v 10 -q:v 10
-c:v libvpx-vp9 -c:v libvpx-vp9
-b:v 1M -b:v 1M
-lossless 1 %s` -crf 5 %s`
cmdArgs := fmt.Sprintf(ffmpegArgs, frameDescPath, outputFilePath) var ffmpegArgsTemp string
if len(ffmpegArgs) > 0 {
ffmpegArgsTemp = ffmpegBaseArgs + " " + ffmpegArgs
} else {
ffmpegArgsTemp = ffmpegBaseArgs + " " + ffmpegDefaultArgs
}
cmdArgs := fmt.Sprintf(ffmpegArgsTemp, frameDescPath, outputFilePath)
cmdArgsSplit := strings.Fields(cmdArgs) cmdArgsSplit := strings.Fields(cmdArgs)
ffmpegProc := exec.Command("ffmpeg", cmdArgsSplit...) ffmpegProc := exec.Command("ffmpeg", cmdArgsSplit...)
var stderr bytes.Buffer
ffmpegProc.Stderr = &stderr
ffmpegProc.Dir = workDir ffmpegProc.Dir = workDir
if err := ffmpegProc.Run(); err != nil { if err := ffmpegProc.Run(); err != nil {
fmt.Fprintf(os.Stderr, "FFmpeg stderr:\n%s\n", stderr.String())
if exitErr, ok := err.(*exec.ExitError); ok { if exitErr, ok := err.(*exec.ExitError); ok {
return fmt.Errorf("ffmpeg exited with non zero code: %d", exitErr.ExitCode()) return fmt.Errorf("ffmpeg exited with non zero code: %d", exitErr.ExitCode())
} }
@ -86,7 +98,7 @@ func unpackUgoira(ugoiraPath, outDir string) error {
return nil return nil
} }
func ugoira2video(manifest UgoiraManifest, ugoiraFileName, vidOut string) error { func ugoira2video(manifest UgoiraManifest, ugoiraFileName, vidOut, ffmpegArgs string) error {
tdir, err := os.MkdirTemp("", "u2vwd-") tdir, err := os.MkdirTemp("", "u2vwd-")
if err != nil { if err != nil {
return err return err
@ -108,7 +120,7 @@ func ugoira2video(manifest UgoiraManifest, ugoiraFileName, vidOut string) error
return fmt.Errorf("Could not unpack Ugoira: %w", err) return fmt.Errorf("Could not unpack Ugoira: %w", err)
} }
makeConcatDemuxFile(manifest, fraFp) makeConcatDemuxFile(manifest, fraFp)
if err := callFFmpeg(fraFp.Name(), vidOutAbs, tdir); err != nil { if err := callFFmpeg(fraFp.Name(), vidOutAbs, tdir, ffmpegArgs); err != nil {
return err return err
} }
return nil return nil