diff options
| author | b5f0d6c3 <[email protected]> | 2022-05-06 10:46:55 +0800 |
|---|---|---|
| committer | b5f0d6c3 <[email protected]> | 2022-05-06 10:46:55 +0800 |
| commit | 79f40d4f7bedf2554d072f6ded4eb73373dd7319 (patch) | |
| tree | bef73cc28e3800ec02d3764302eddbc601ff8d8c /mkvlib | |
| parent | 8c382de8c87260d68b9c10e2bf687cbd53e3beb8 (diff) | |
update
Diffstat (limited to 'mkvlib')
| -rw-r--r-- | mkvlib/c/exports.go | 26 | ||||
| -rw-r--r-- | mkvlib/mkv.go | 128 | ||||
| -rw-r--r-- | mkvlib/shared.go | 13 |
3 files changed, 125 insertions, 42 deletions
diff --git a/mkvlib/c/exports.go b/mkvlib/c/exports.go index 1c12825..fc5965d 100644 --- a/mkvlib/c/exports.go +++ b/mkvlib/c/exports.go @@ -215,6 +215,32 @@ func GetFontInfo(p *C.char) *C.char { return cs(string(data)) } +//export Version +func Version() *C.char { + return cs(mkvlib.Version()) +} + +//export CreateBlankOrBurnVideo +func CreateBlankOrBurnVideo(t int64, s, enc, ass, fontdir, output *C.char) bool { + if !checkInstance() { + return false + } + return getter.GetProcessorInstance().CreateBlankOrBurnVideo(t, gs(s), gs(enc), gs(ass), gs(fontdir), gs(output)) +} + +//export CreateTestVideo +func CreateTestVideo(asses, s, fontdir, enc *C.char, burn bool, lcb C.logCallback) bool { + if !checkInstance() { + return false + } + obj := make([]string, 0) + if json.Unmarshal([]byte(gs(asses)), &obj) == nil { + _asses := obj + return getter.GetProcessorInstance().CreateTestVideo(_asses, gs(s), gs(fontdir), gs(enc), burn, _lcb(lcb)) + } + return false +} + func cs(gs string) *C.char { return C.CString(gs) } diff --git a/mkvlib/mkv.go b/mkvlib/mkv.go index 73a16fd..bd4ed00 100644 --- a/mkvlib/mkv.go +++ b/mkvlib/mkv.go @@ -15,6 +15,7 @@ const ( mkvmerge = `mkvmerge` mkvextract = `mkvextract` ass2bdnxml = `ass2bdnxml` + ffmpeg = `ffmpeg` ) type mkvInfo struct { @@ -43,6 +44,7 @@ type mkvProcessor struct { pf string caches []string ass2bdnxml bool + ffmpeg bool nrename bool check bool strict bool @@ -396,57 +398,101 @@ func (self *mkvProcessor) NRename(nrename bool) { self.nrename = nrename } -func (self *mkvProcessor) CreateTestVideo(asses []string, fonts, enc, output string, lcb logCallback) bool { - _obj := new(assProcessor) +func (self *mkvProcessor) CreateBlankOrBurnVideo(t int64, s, enc, ass, fontdir, output string) bool { + if !self.ffmpeg { + return false + } args := make([]string, 0) - args = append(args, "-hide_banner", "-loglevel", "quiet") - args = append(args, "-y", "-f", "lavfi") - args = append(args, "-i", fmt.Sprintf("color=c=0x000000:s=%s:r=%s", self.pr, self.pf)) - var t time.Duration - _s := len(asses) == 1 - if _s { - t = _obj.getLength(asses[0]) - fonts = strings.ReplaceAll(fonts, `\`, `/`) - fonts = strings.ReplaceAll(fonts, `:`, `\\:`) - asses[0] = strings.ReplaceAll(asses[0], `\`, `/`) - asses[0] = strings.ReplaceAll(asses[0], `:`, `\\:`) - args = append(args, "-vf", fmt.Sprintf("subtitles=%s:fontsdir=%s", asses[0], fonts)) + args = append(args, "-y", "-hide_banner", "-loglevel", "quiet") + if enc == "" { + enc = "libx264" + } + if s == "" { + args = append(args, "-f", "lavfi") + args = append(args, "-i", fmt.Sprintf("color=c=0x000000:s=%s:r=%s", self.pr, self.pf)) } else { - for _, v := range asses { - length := _obj.getLength(v) - if length > t { - t = length - } + args = append(args, "-i", s) + } + if ass != "" && fontdir != "" { + t = new(assProcessor).getLength(ass).Milliseconds() + fontdir = strings.ReplaceAll(fontdir, `\`, `/`) + fontdir = strings.ReplaceAll(fontdir, `:`, `\\:`) + ass = strings.ReplaceAll(ass, `\`, `/`) + ass = strings.ReplaceAll(ass, `:`, `\\:`) + args = append(args, "-vf", fmt.Sprintf("subtitles=%s:fontsdir=%s", ass, fontdir)) + } + if s == "" { + if t > 0 { + args = append(args, "-t", fmt.Sprintf("%dms", t)) + } else { + return false } } - if t == 0 { + args = append(args, "-pix_fmt", "nv12", "-crf", "18") + args = append(args, "-vcodec", enc) + args = append(args, output) + if p, err := newProcess(nil, nil, nil, "", ffmpeg, args...); err == nil { + s, err := p.Wait() + return err == nil && s.ExitCode() == 0 + } + return false +} + +func (self *mkvProcessor) CreateTestVideo(asses []string, s, fontdir, enc string, burn bool, lcb logCallback) bool { + if s == "-" { + s = "" + } + l := len(asses) + if l == 0 { return false } - args = append(args, "-t", fmt.Sprintf("%dms", t.Milliseconds())) - args = append(args, "-c:v", enc) - args = append(args, "-c:s", "copy") - d, _, _, ne := splitPath(output) - _output := path.Join(d, fmt.Sprintf("%s.mp4", ne)) - args = append(args, _output) - if p, err := newProcess(nil, os.Stdout, os.Stderr, "", "ffmpeg", args...); err == nil { - s, err := p.Wait() - ok := err == nil && s.ExitCode() == 0 - if ok && !_s { - _fonts := findFonts(fonts) - if len(_fonts) > 0 { - __output := path.Join(d, fmt.Sprintf("%s.mkv", ne)) - ok = self.CreateMKV(_output, asses, _fonts, __output, "", "", false) - } else { + if burn { + ec := 0 + for i, v := range asses { + d, _, _, ne := splitPath(v) + _output := path.Join(d, fmt.Sprintf("%s-test.mp4", ne)) + ok := self.CreateBlankOrBurnVideo(0, s, enc, v, fontdir, _output) + if !ok { + ec++ + printLog(lcb, `Failed to create the test video file: "%s"`, _output) + } + printLog(lcb, "CT (%d/%d) done.", i+1, l) + } + return ec == 0 + } + _obj := new(assProcessor) + var t time.Duration + for _, v := range asses { + _t := _obj.getLength(v) + if _t > t { + t = _t + } + } + ok := true + _fonts := findFonts(fontdir) + if len(_fonts) > 0 { + d, _, _, _ := splitPath(asses[0]) + n := randomStr(8) + _t := s == "" + if _t { + s = path.Join(d, fmt.Sprintf("%s.mp4", n)) + if !self.CreateBlankOrBurnVideo(t.Milliseconds(), "", enc, "", "", s) { ok = false + printLog(lcb, `Failed to create the temp video file: "%s".`, s) } } - if !ok || !_s { - _ = os.Remove(_output) + if ok { + output := path.Join(d, fmt.Sprintf("%s.mkv", n)) + if !self.CreateMKV(s, asses, _fonts, output, "", "", true) { + ok = false + printLog(lcb, `Failed to create the test video file: "%s".`, output) + } } - if !ok { - printLog(lcb, "Failed to create the test video file.") + if _t { + _ = os.Remove(s) } - return ok + } else { + ok = false } - return false + return ok } diff --git a/mkvlib/shared.go b/mkvlib/shared.go index 326577a..727a774 100644 --- a/mkvlib/shared.go +++ b/mkvlib/shared.go @@ -11,7 +11,7 @@ import ( ) const libName = "mkvlib" -const libVer = "v1.8.6" +const libVer = "v1.8.7" const LibFName = libName + " " + libVer @@ -52,6 +52,7 @@ func (self *processorGetter) InitProcessorInstance(lcb logCallback) bool { _, _mkvextract := exec.LookPath(mkvextract) _, _mkvmerge := exec.LookPath(mkvmerge) _, _ass2bdnxml := exec.LookPath(ass2bdnxml) + _, _ffmpeg := exec.LookPath(ffmpeg) if _ttx != nil || _pyftsubset != nil { printLog(lcb, `Missing dependency: fonttools (need "%s" & "%s").`, ttx, pyftsubset) ec++ @@ -66,11 +67,17 @@ func (self *processorGetter) InitProcessorInstance(lcb logCallback) bool { //ec++ } + if _ffmpeg != nil { + printLog(lcb, `Missing dependency: ffmpeg.`) + //ec++ + } + r := ec == 0 if r { self.checked = true self.instance = new(mkvProcessor) self.instance.ass2bdnxml = _ass2bdnxml == nil + self.instance.ffmpeg = _ffmpeg == nil } return r @@ -91,6 +98,10 @@ func printLog(lcb logCallback, f string, v ...interface{}) { } } +func Version() string { + return libVer +} + func init() { runtime.GOMAXPROCS(runtime.NumCPU()) } |
