package ConvertUtil import ( "dsSupport/Utils/CommonUtil" "dsSupport/Utils/FileUtil" "fmt" "os" "path" "path/filepath" "strings" ) //运行的目录 var runDir string // ffmpeg 的命令行位置 var ffmpeg string func init() { runDir, _ = os.Getwd() ffmpeg = runDir + `\ffmpeg\ffmpeg.exe` } const CutPath = "Cut/" const Mp4Path = "Mp4/" const AllPath = "/" /** 功能:获取指定源文件的不同工作目录 作者:黄海 时间:2020-07-09 */ func getPath(source string, p string) string { return runDir + `/Working/` + source[0:2] + "/" + source[0:36] + "/" + p } /** 功能:初始化目录 作者:黄海 时间:2020-07-09 */ func InitDir(source string) { //1、删除旧目录 os.RemoveAll(getPath(source, AllPath)) //2、创建新目录 os.MkdirAll(getPath(source, CutPath), os.ModePerm) os.Mkdir(getPath(source, Mp4Path), os.ModePerm) } /** 功能:对指定的视频文件进行切片 作者:黄海 时间:2020-07-08 */ func Cut(source string) { //1、源视频文件 sourcePath := runDir + "/Source/" + source[0:2] + "/" + source //2、获取文件后缀 extension := path.Ext(source) //3、输出的文件通配名称 targetPath := getPath(source, CutPath) + source[0:36] + `_%03d` + extension //4、切片 CommonUtil.Exec(ffmpeg, runDir+"/Source/"+source[0:2]+"/", `-fflags`, `+genpts`, `-i`, sourcePath, `-acodec`, `copy`, `-vcodec`, `copy`, `-f`, `segment`, `-segment_time`, `300`, `-reset_timestamps`, `1`, `-map`, `0:0`, `-map`, `0:1`, targetPath) } /** 功能:将指定的视频文件,在切片后,获取都生成了哪些切片 作者:黄海 时间:2020-07-08 */ func GetAllCutChild(source string) []string { filepathNames, err := filepath.Glob(filepath.Join(getPath(source, CutPath), "*")) if err != nil { fmt.Println(err.Error()) } resultArray := make([]string, 0) for i := range filepathNames { resultArray = append(resultArray, filepathNames[i]) } return resultArray } /** 功能:将视频转为H264格式的MP4 作者: 黄海 时间:2020-07-08 */ func ConvertToH264Mp4(childMovie string) { extension := path.Ext(childMovie) childMovieMp4 := strings.Replace(filepath.Base(childMovie), extension, ".mp4", -1) CommonUtil.Exec(ffmpeg, getPath(childMovieMp4, CutPath), `-i`, childMovie, `-c:v`, `libx264`, `-strict`, `-2`, getPath(childMovieMp4, Mp4Path)+childMovieMp4) } /** 功能:生成索引的文本文件 作者:黄海 时间:2020-07-08 */ func GenerateIndexTxt(source string, childMovie []string) string { content := make([]string, 0) for i := range childMovie { extension := path.Ext(childMovie[i]) fullFilename := strings.Replace(childMovie[i], extension, ".mp4", -1) filenameWithSuffix := filepath.Base(fullFilename) //获取文件名带后缀 content = append(content, `file '`+filenameWithSuffix+`'`) } //文件位置 indexName := getPath(source, Mp4Path) + source[0:36] + ".txt" FileUtil.WriteLines(content, indexName) return indexName } /** 功能:合并视频 作者:黄海 时间:2020-07-08 */ func Merge(source string) { Target := runDir + `/Target/` + source[0:2] + "/" if !FileUtil.Exists(Target) { os.Mkdir(Target, os.ModePerm) } Target = Target + source[0:36] + "/" if !FileUtil.Exists(Target) { os.Mkdir(Target, os.ModePerm) } if FileUtil.Exists(Target + "/" + source[0:36] + ".mp4") { //删除 os.Remove(Target + "/" + source[0:36] + ".mp4") } //合并 CommonUtil.Exec(ffmpeg, getPath(source, Mp4Path), `-f`, `concat`, `-i`, source[0:36]+".txt", `-c`, `copy`, Target+"/"+source[0:36]+".mp4") } /** 功能:清除垃圾 作者:黄海 时间:2020-07-08 */ func ClearRubbish(source string) { var deletePath = []string{"Working"} for i := range deletePath { //删除目录 os.RemoveAll(runDir + `/` + deletePath[i] + `/` + source[0:2] + "/" + source[0:36]) } } /** 功能:显示视频的信息 作者:黄海 时间:2020-07-09 */ func ShowMovieInfo(source string) { CommonUtil.Exec(ffmpeg, runDir+`/Target/`+source[0:2]+"/"+source[0:36]+"/", `-i`, runDir+`/Target/`+source[0:2]+"/"+source[0:36]+"/"+source[0:36]+".mp4") } /** 功能:将转码H264完成的MP4,切成M3U8形式 作者:黄海 时间:2020-07-09 */ func ToM3u8(source string) { CommonUtil.Exec(ffmpeg, runDir+`/Target/`+source[0:2]+"/"+source[0:36]+"/", `-i`, runDir+`/Target/`+source[0:2]+"/"+source[0:36]+"/"+source[0:36]+".mp4", `-f`,`segment`, `-segment_time`, `60`, `-segment_format`, `mpegts`, `-segment_list`, runDir+`/Target/`+source[0:2]+"/"+source[0:36]+"/"+source+`.m3u8`, `-c`, `copy`, `-bsf:v`, `h264_mp4toannexb`, `-map`, `0`, runDir+`/Target/`+source[0:2]+"/"+source[0:36]+"/"+source[0:36]+`_%04d.ts`) //删除mp4 os.Remove(runDir+`/Target/`+source[0:2]+"/"+source[0:36]+"/"+source[0:36]+".mp4") }