大家知道很多视频点播平台都是具备倍速播放功能的,在我们EasyDSS平台中,也有项目团队提出需求,需要根据用户参数可自行修改视频播放速度。

对于该需求的实现,我们首先要根据请求的视频倍数,重新生成hash文件名,否则会出现文件名覆盖的情况。其次,在生成源视频文件后制作一个元素率的视频备份。最后将源文件删除,将备份文件作为源,生成源文件名的加速文件。

部分参考代码如下:

func CreateSpeedFile(path, input string, speed float32) string {
	var shellFile string
	switch runtime.GOOS {
	case "windows":
		shellFile = "change_speed.bat"
		f, _ := os.Create(shellFile)
		inputPath := filepath.Join(path, fmt.Sprintf("%s", input))
		outPath := filepath.Join(path, "temp.mp4")
		f.Write([]byte(fmt.Sprintf("copy %s %s\n", inputPath, outPath)))
		f.Write([]byte(fmt.Sprintf("del %s\n", inputPath)))
		f.Write([]byte(fmt.Sprintf("%s -i %s", EasyTrans(), outPath)))
		f.Write([]byte(fmt.Sprintf(" -filter_complex \"[0:v]setpts=%f*PTS[v];[0:a]atempo=%f[a]\"", 1/speed, speed)))
		f.Write([]byte(fmt.Sprintf(" -map \"[v]\" -map \"[a]\" %s\n", inputPath)))
		f.Write([]byte(fmt.Sprintf("del %s\n", outPath)))
		f.Close()
	case "linux":
		inputPath := estring.FormatPath(filepath.Join(path, fmt.Sprintf("%s", input)))
		outPath := estring.FormatPath(filepath.Join(path, "temp.mp4"))
		cmd := exec.Command("/bin/bash","-c",fmt.Sprintf("cp %s %s\n", inputPath, outPath))
		err := cmd.Run()
		if err!=nil{
			return ""
		}
		cmd = exec.Command("/bin/bash","-c",fmt.Sprintf("rm %s\n", inputPath))
		err = cmd.Run()
		if err!=nil{
			return ""
		}
		sh := fmt.Sprintf("%s -i %s -filter_complex \"[0:v]setpts=%f*PTS[v];[0:a]atempo=%f[a]\" -map \"[v]\" -map \"[a]\" %s\n",EasyTrans(), outPath, 1/speed, speed,inputPath)
		cmd = exec.Command("/bin/bash","-c",sh)
		err = cmd.Run()
		if err!=nil{
			return ""
		}
		cmd = exec.Command("/bin/bash","-c",fmt.Sprintf("rm %s\n", outPath))
		err = cmd.Run()
		if err!=nil{
			return ""
		}
	}
	return shellFile
}

EasyDSS开发简单,我们给客户提供了编程语言无关化的RESTfulAPI接口,可以很简单的进行二次开发和应用,并且各模块间无缝对接,亦可将EasyDSS流媒体服务器软件与其他第三方平台对接,组合灵活自由,这也是众多用户选择我们的重要原因之一。

posted on 2021-09-14 17:18  EasyDSS  阅读(210)  评论(0编辑  收藏  举报