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