github.com/Mrs4s/go-cqhttp@v1.2.0/global/codec.go (about) 1 package global 2 3 import ( 4 "crypto/md5" 5 "encoding/hex" 6 "os" 7 "os/exec" 8 "path" 9 10 "github.com/pkg/errors" 11 12 "github.com/Mrs4s/go-cqhttp/internal/base" 13 ) 14 15 // EncoderSilk 将音频编码为Silk 16 func EncoderSilk(data []byte) ([]byte, error) { 17 h := md5.New() 18 _, err := h.Write(data) 19 if err != nil { 20 return nil, errors.Wrap(err, "calc md5 failed") 21 } 22 tempName := hex.EncodeToString(h.Sum(nil)) 23 if silkPath := path.Join("data/cache", tempName+".silk"); PathExists(silkPath) { 24 return os.ReadFile(silkPath) 25 } 26 slk, err := base.EncodeSilk(data, tempName) 27 if err != nil { 28 return nil, errors.Wrap(err, "encode silk failed") 29 } 30 return slk, nil 31 } 32 33 // EncodeMP4 将给定视频文件编码为MP4 34 func EncodeMP4(src string, dst string) error { // -y 覆盖文件 35 cmd1 := exec.Command("ffmpeg", "-i", src, "-y", "-c", "copy", "-map", "0", dst) 36 if errors.Is(cmd1.Err, exec.ErrDot) { 37 cmd1.Err = nil 38 } 39 err := cmd1.Run() 40 if err != nil { 41 cmd2 := exec.Command("ffmpeg", "-i", src, "-y", "-c:v", "h264", "-c:a", "mp3", dst) 42 if errors.Is(cmd2.Err, exec.ErrDot) { 43 cmd2.Err = nil 44 } 45 return errors.Wrap(cmd2.Run(), "convert mp4 failed") 46 } 47 return err 48 } 49 50 // ExtractCover 获取给定视频文件的Cover 51 func ExtractCover(src string, target string) error { 52 cmd := exec.Command("ffmpeg", "-i", src, "-y", "-ss", "0", "-frames:v", "1", target) 53 if errors.Is(cmd.Err, exec.ErrDot) { 54 cmd.Err = nil 55 } 56 return errors.Wrap(cmd.Run(), "extract video cover failed") 57 }