You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

204 lines
5.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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`
ffmpeg = `/usr/local/ffmpeg/bin/ffmpeg`
}
// https://blog.csdn.net/lijinshanba/article/details/95343634
const WorkingPath = "/"
const WorkingCutPath = "/Cut/"
const WorkingMp4Path = "/Mp4/"
const WorkingKeyFramePath="/KeyFrame/"
/**
功能:获取指定源文件的不同工作目录
作者:黄海
时间2020-07-09
*/
func getWorkingPath(source string, p string) string {
return runDir + `/Working/` + source[0:2] + "/" + source[0:36] + p
}
/**
功能:获取目标目录
作者:黄海
时间2020-07-09
*/
func getTargetPath(source string)string{
return runDir + `/Target/` + source[0:2] + "/" + source[0:36] + "/"
}
/**
功能:获取源目录
作者:黄海
时间2020-07-09
*/
func getSourcePath(source string) string{
return runDir + `/Source/` + source[0:2] + "/"
}
/**
功能:初始化目录
作者:黄海
时间2020-07-09
*/
func InitDir(source string) {
//1、删除旧目录
os.RemoveAll(getWorkingPath(source, WorkingPath))
//2、创建新目录
os.MkdirAll(getWorkingPath(source, WorkingCutPath), os.ModePerm)
os.Mkdir(getWorkingPath(source, WorkingMp4Path), os.ModePerm)
os.Mkdir(getWorkingPath(source,WorkingKeyFramePath),os.ModePerm)
}
/**
功能:对指定的视频文件进行切片
作者:黄海
时间2020-07-08
*/
func Cut(source string) {
//1、源视频文件
sourcePath := getWorkingPath(source,WorkingKeyFramePath) + source
//2、获取文件后缀
extension := path.Ext(source)
//3、输出的文件通配名称
targetPath := getWorkingPath(source, WorkingCutPath) + source[0:36] + `_%03d` + extension
//4、切片
CommonUtil.Exec(ffmpeg, getSourcePath(source), `-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(getWorkingPath(source, WorkingCutPath), "*"))
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, getWorkingPath(childMovieMp4, WorkingCutPath), `-i`, childMovie, `-c:v`, `libx264`, `-strict`, `-2`,
getWorkingPath(childMovieMp4, WorkingMp4Path)+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 := getWorkingPath(source, WorkingMp4Path) + source[0:36] + ".txt"
FileUtil.WriteLines(content, indexName)
return indexName
}
/**
功能:合并视频
作者:黄海
时间2020-07-08
*/
func Merge(source string) {
Target := getTargetPath(source)
if !FileUtil.Exists(Target) {
os.MkdirAll(Target, os.ModePerm)
}
if FileUtil.Exists(Target + "/" + source[0:36] + ".mp4") {
//删除
os.Remove(Target + "/" + source[0:36] + ".mp4")
}
//合并
CommonUtil.Exec(ffmpeg, getWorkingPath(source, WorkingMp4Path), `-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, getTargetPath(source), `-i`,getTargetPath(source)+source[0:36]+".mp4")
}
/**
功能将转码H264完成的MP4切成M3U8形式
作者:黄海
时间2020-07-09
*/
func ToM3u8(source string) {
CommonUtil.Exec(ffmpeg, getTargetPath(source), `-i`,
getTargetPath(source)+source[0:36]+".mp4",
`-f`,`segment`, `-segment_time`, `60`, `-segment_format`, `mpegts`, `-segment_list`,
getTargetPath(source)+source[0:36]+`.m3u8`, `-c`, `copy`, `-bsf:v`, `h264_mp4toannexb`,
`-map`, `0`, getTargetPath(source)+source[0:36]+`_%04d.ts`)
//删除mp4
os.Remove(getTargetPath(source)+source[0:36]+".mp4")
}
/**
功能:将文件转换为每帧都是关键帧
作者:黄海
时间2020-07-09
*/
func ConvertToKeyFrame(source string){
if FileUtil.Exists(getWorkingPath(source,WorkingKeyFramePath)+source){
os.Remove(getWorkingPath(source,WorkingKeyFramePath)+source)
}
CommonUtil.Exec(ffmpeg, getWorkingPath(source,WorkingKeyFramePath), `-i`,
getSourcePath(source)+source,`-strict`, `-2`, `-qscale`, `0`,`-intra`, getWorkingPath(source,WorkingKeyFramePath)+source)
}