Update ffmpeg pkg for reading files and parsing ffmpeg version

This commit is contained in:
Alex X
2024-05-24 11:06:51 +03:00
parent ff39e2e496
commit bf3f81ccac
5 changed files with 78 additions and 47 deletions
+21 -42
View File
@@ -1,68 +1,47 @@
package ffmpeg
import (
"bytes"
"errors"
"os/exec"
"strings"
"sync"
"github.com/AlexxIT/go2rtc/pkg/ffmpeg"
"github.com/rs/zerolog/log"
)
var checkMu sync.Mutex
var checkErr error
var checkVer string
const (
FFmpeg50 = "59. 16"
FFmpeg51 = "59. 27"
FFmpeg60 = "60. 3"
FFmpeg61 = "60. 16"
FFmpeg70 = "61. 1"
)
var verMu sync.Mutex
var verErr error
var verFF string
var verAV string
func Version() (string, error) {
checkMu.Lock()
defer checkMu.Unlock()
verMu.Lock()
defer verMu.Unlock()
if checkVer != "" {
return checkVer, checkErr
if verFF != "" {
return verFF, verErr
}
cmd := exec.Command(defaults["bin"], "-version")
b, err := cmd.Output()
if err != nil {
checkVer = "-"
checkErr = err
return checkVer, checkErr
verFF = "-"
verErr = err
return verFF, verErr
}
if len(b) < 100 {
checkVer = "?"
return checkVer, nil
verFF, verAV = ffmpeg.ParseVersion(b)
if verFF == "" {
verFF = "?"
}
// ffmpeg version n7.0-30-g8b0fe91754-20240520 Copyright (c) 2000-2024 the FFmpeg developers
b = b[15:]
if i := bytes.IndexByte(b, ' '); i > 0 {
checkVer = string(b[:i])
// better to compare libavformat, because nightly/master builds
if verAV != "" && verAV < ffmpeg.Version50 {
verErr = errors.New("ffmpeg: unsupported version: " + verFF)
}
// libavformat 60. 16.100 / 60. 16.100
if i := strings.Index(string(b), "libavformat"); i > 0 {
// better to compare libavformat, because nightly/master builds
libav := string(b[i+15 : i+25])
if libav < FFmpeg50 {
checkErr = errors.New("ffmpeg: unsupported version: " + checkVer)
return checkVer, checkErr
}
if libav < FFmpeg61 && strings.Contains(defaults["file"], "readrate_initial_burst") {
defaults["file"] = "-re -i {input}"
}
}
log.Debug().Str("version", verFF).Str("libavformat", verAV).Msgf("[ffmpeg] bin")
log.Debug().Str("version", checkVer).Msgf("[ffmpeg] bin")
return checkVer, nil
return verFF, verErr
}