• webqwe-资源分享和开发经验
AD
AD

Home / 开发 / golang 利用FFmpeg生成m3u8文件

golang 利用FFmpeg生成m3u8文件

2023-05-05 09:54:20
708 阅读

为什么需要利用FFmpeg生成m3u8文件?

可以先利用 N_m3u8DL-RE 下载ts文件,但是这个程序不能生成m3u8文件,因此需要。

这一套组合拳打下来,还要自己切片吗?拿这别人切好的资源嘎嘎香。

看图:


package main

import (
	"flag"
	"fmt"
	"io/ioutil"
	"os"
	"os/exec"
	"path"
	"sort"
	"strings"
)

var (
	// 命令行参数
	dirsrc   = flag.String("dir", "", "文件保存路径(默认为当前路径)")
	m3u8name = flag.String("m", "webqwe.com.m3u8", "m3u8文件名")
	proxy    = flag.String("p", "", "http代理")
	m3u8url  = flag.String("u", "", "m3u8 url")
)

//生成文件夹下面的 m3u8文件
func main() {
	// 解析命令行参数
	flag.Parse()
	dirsrc := *dirsrc
	m3u8name := *m3u8name

	os.RemoveAll(dirsrc + m3u8name) //下载失败删除残留

	// 读取当前目录中的所有文件和子目录
	files, err := ioutil.ReadDir(dirsrc)
	if err != nil {
		panic(err)
	}

	tsFile := make([]string, 0)
	// 获取所有文件,并输出它们的名字
	for _, file := range files {
		if file.IsDir() {
			continue
		}
		// 判断文件名包含"ts"
		if strings.Contains(file.Name(), "ts") {
			tsFile = append(tsFile, file.Name())
		}

		//包含tmp文件名,说明没有下载完,或者失败!
		if strings.Contains(file.Name(), "tmp") {
			return
		}
	}

	// 对tsFile进行排序
	sort.Strings(tsFile)

	newM3u8Body := `#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:999
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-DISCONTINUITY`

	for _, tsname := range tsFile {

		newM3u8Body = newM3u8Body + "\n"

		EXTINF := getTsTime(dirsrc + tsname)
		newM3u8Body = newM3u8Body + "#EXTINF:" + EXTINF + ",\n"
		newM3u8Body = newM3u8Body + tsname
	}

	newM3u8Body = newM3u8Body + "\n" + "#EXT-X-ENDLIST"
	ioutil.WriteFile(dirsrc+m3u8name, []byte(newM3u8Body), 0666) //写入文件(字节数组)

}

func GetAllFile(pathname string, s []string) ([]string, error) {
	rd, err := ioutil.ReadDir(pathname)
	if err != nil {
		fmt.Println("read dir fail:", err)
		return s, err
	}

	for _, fi := range rd {
		if !fi.IsDir() {
			fileType := path.Ext(fi.Name())
			if fileType == ".ts" {
				s = append(s, fi.Name())
			}

		}
	}
	return s, nil
}

//ffprobe 获取视频长度
func getTsTime(tsfile string) string {
	cmd := exec.Command("ffprobe", "-v", "error", "-show_entries", "format=duration", "-of", "default=noprint_wrappers=1:nokey=1", tsfile)
	output, err := cmd.Output()
	if err != nil {
		fmt.Println("Error executing command:", err)
		return ""
	}

	s := strings.TrimSpace(string(output))

	return s
}




uuid怎么下载(免费) | 求资源
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。 如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
标签
author
pings

每天都在打酱油~

评论
登录后评论