Back

Golang使用ffmpeg命令制作视频封面

Golang使用ffmpeg命令制作视频封面

整体思路:抽取视频中的一张图片作为封面,然后在这张图片上加上文字即可。

使用到的ffmpeg命令:

# 抽取一张图片
ffmpeg -ss 0.5 -i input.mp4 -vframes 1 -s 1080x720 -f image2 input_pic.jpg

# 图片中加入居中文本
ffmpeg -i input_pic.jpg -vf drawtext=font='Impact':text='Text':fontcolor=yellow@0.8:box=1:boxcolor=red@0.2:borderw=3:fontsize-75:x=(w-tw)/2:y=((h-text_h)/2) cover.jpg

具体代码

var (
	wg	sync.WaitGroup
)
// 命令行调用
func Cmd(commandName string, params []string) (string, error) {
	fmt.Println("命令行调用")
	cmd := exec.Command(commandName, params...)
	//fmt.Println("Cmd", cmd.Args)
	var out bytes.Buffer
	cmd.Stdout = &out
	cmd.Stderr = os.Stderr
	err :=  cmd.Start()
	if err != nil {
		return "", err
	}
	err = cmd.Wait()
	return out.String(), err
}
// 封面
func getVideoCover(video string, cover string, fonttxt string) {
	defer wg.Done()
	// 抽取一张图片,然后图片中间添加文字
	// ffmpeg -ss 0.5 -i r1.mp4 -vframes 1 -s 1080x720 -f image2 r2.jpg
	fmt.Println("Make a cover: " + video)

	vname := strings.Split(video, ".")
	videoPic := strings.Join(vname[:len(vname) - 1],"") + ".jpg"

	fmt.Println(videoPic)

	cmdStr1 := fmt.Sprintf("ffmpeg -ss 0.5 -i %s -vframes 1 -s 1080x720 -f image2 %s", video, videoPic)
	fmt.Println("制作封面-getVideoCover命令1: " + cmdStr1)
	fmt.Println(cmdStr1)
	args := strings.Fields(cmdStr1)
	msg, err := Cmd(args[0], args[1:])
	if err != nil {
		fmt.Printf("getVideoCover1 videofailed, %v, output: %v\n", err, msg)
        return
	}
	// 添加文字
	// ffmpeg -i r2.jpg -vf "drawtext=font='Impact':text='TEXT':fontcolor=yellow@0.8:box=1:boxcolor=red@0.2:borderw=3:fontsize-75:x=(w-tw)/2:y=((h-text_h)/2)" output2.jpg
	
	cmdStr2 := fmt.Sprintf("ffmpeg -i %s -vf drawtext=font='Impact':text='%s':fontcolor=yellow@0.8:box=1:boxcolor=red@0.2:borderw=3:fontsize-78:x=(w-tw)/2:y=((h-text_h)/2) %s", videoPic, fonttxt, cover)
	
	
	fmt.Println("制作封面-getVideoCover命令2: " + cmdStr2)
	fmt.Println(cmdStr2)
	args = strings.Fields(cmdStr2)
	msg, err = Cmd(args[0], args[1:])
	if err != nil {
		fmt.Printf("getVideoCover1 videofailed, %v, output: %v\n", err, msg)
        return
	}
}

// 执行
wg.Add(1)
go getVideoCover("one/xue.mp4", "one/cover_xue.jpg", "Music")
wg.Wait()

Built with Hugo
Theme Stack designed by Jimmy
© Licensed Under CC BY-NC-SA 4.0