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  }