init
This commit is contained in:
parent
62874246e0
commit
fcdf10e9f9
135
Main.go
Normal file
135
Main.go
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"github.com/schollz/progressbar/v3"
|
||||||
|
"io/fs"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"path"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
//var sourceDir = "/home/lukas/Downloads"
|
||||||
|
|
||||||
|
var sourceDir = "V:\\TV_aufnahmen\\Konvertieren"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
_files, err := ioutil.ReadDir(sourceDir)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var files []string
|
||||||
|
for _, file := range _files {
|
||||||
|
if validFile(file) {
|
||||||
|
files = append(files, path.Join(sourceDir, file.Name()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("Found %d files\n", len(files))
|
||||||
|
for _, file := range files {
|
||||||
|
fmt.Printf("Converting %s\n", file)
|
||||||
|
convert(file)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func validFile(file fs.FileInfo) bool {
|
||||||
|
return !file.IsDir() && strings.HasSuffix(file.Name(), ".ts")
|
||||||
|
}
|
||||||
|
|
||||||
|
func convert(file string) {
|
||||||
|
ext := path.Ext(file)
|
||||||
|
outfile := file[0:len(file)-len(ext)] + ".mp4"
|
||||||
|
|
||||||
|
tottime := getVidTime(file)
|
||||||
|
|
||||||
|
com := exec.Command("ffmpeg",
|
||||||
|
"-y", // overwrite existing out files
|
||||||
|
"-hwaccel", "vulkan", // vulkan hardware accelleration
|
||||||
|
"-hide_banner", "-loglevel", "warning", // set it less silent
|
||||||
|
"-progress", "pipe:1", // pipe a progress text to 1
|
||||||
|
"-i", file, // input file
|
||||||
|
"-c:v", "h264_amf", // reencode video with amf
|
||||||
|
"-c:a", "copy", // copy audio stream
|
||||||
|
outfile) // output file
|
||||||
|
fmt.Println(com.String())
|
||||||
|
|
||||||
|
// pipe stderr directly to out
|
||||||
|
com.Stderr = os.Stderr
|
||||||
|
|
||||||
|
stderr, _ := com.StdoutPipe()
|
||||||
|
err := com.Start()
|
||||||
|
|
||||||
|
scanner := bufio.NewScanner(stderr)
|
||||||
|
scanner.Split(bufio.ScanLines)
|
||||||
|
|
||||||
|
var infoblock string = ""
|
||||||
|
bar := progressbar.Default(tottime)
|
||||||
|
|
||||||
|
for scanner.Scan() {
|
||||||
|
m := scanner.Text()
|
||||||
|
// we know a new data block begins here
|
||||||
|
if strings.Contains(m, "frame=") {
|
||||||
|
//fmt.Println(infoblock)
|
||||||
|
r := regexp.MustCompile("out_time=(.*)")
|
||||||
|
matches := r.FindStringSubmatch(infoblock)
|
||||||
|
if len(matches) < 2 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
parsedtime, err := time.Parse("15:04:05.000000", matches[1])
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("error invalid time")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
secondtime := 3600*parsedtime.Hour() + parsedtime.Minute()*60 + parsedtime.Second()
|
||||||
|
_ = bar.Set(secondtime)
|
||||||
|
|
||||||
|
infoblock = ""
|
||||||
|
} else {
|
||||||
|
infoblock += m + "\n"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err = com.Wait()
|
||||||
|
_ = bar.Finish()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
//fmt.Println(out.String())
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func getVidTime(file string) int64 {
|
||||||
|
com := exec.Command("ffmpeg", "-i", file)
|
||||||
|
var out bytes.Buffer
|
||||||
|
com.Stdout = &out
|
||||||
|
com.Stderr = &out
|
||||||
|
|
||||||
|
err := com.Run()
|
||||||
|
|
||||||
|
fmt.Println("output:")
|
||||||
|
//fmt.Println(out.String())
|
||||||
|
|
||||||
|
r := regexp.MustCompile("Duration: (.*), start: ")
|
||||||
|
matches := r.FindStringSubmatch(out.String())
|
||||||
|
if len(matches) < 2 {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
fmt.Println(r.FindStringSubmatch(out.String())[1])
|
||||||
|
|
||||||
|
parsedtime, err := time.Parse("15:04:05.00", matches[1])
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("error invalid time")
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
sectime := parsedtime.Hour()*3600 + parsedtime.Minute()*60 + parsedtime.Second()
|
||||||
|
fmt.Printf("Length: %d\n", sectime)
|
||||||
|
return int64(sectime)
|
||||||
|
}
|
10
go.mod
Normal file
10
go.mod
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
module Konvertieren
|
||||||
|
|
||||||
|
go 1.16
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/schollz/progressbar/v3 v3.8.6 // indirect
|
||||||
|
golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect
|
||||||
|
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad // indirect
|
||||||
|
golang.org/x/term v0.0.0-20220411215600-e5f449aeb171 // indirect
|
||||||
|
)
|
Loading…
Reference in New Issue
Block a user