m3u8格式转成MP4-使用go语言实现
在此写m3u8转mp4代码
原理就是,按照m3u8文件的顺序,合并若干个小的ts文件,写入总mp4。
代码中的网址已删。
/*
最终版
*/
package main
import (
"fmt"
"net/http"
"io/ioutil"
"sync"
"time"
"os"
"log"
"regexp"
)
var file *os.File
var wg sync.WaitGroup
var host string = "vom"
var date string = "20201221"
var str string = "8btdG2by"
var flag string = "500kb"
var cate string = "putong"
var origin string = "http://www.com"
var g_referer string = "http://www..com/player.html"
func main() {
logFile, _ := os.OpenFile("log.log", os.O_CREATE|os.O_APPEND, 0766)
log.SetOutput(logFile)
url := fmt.Sprintf("https://%s/%s/%s/%s/%s/hls/index.m3u8", host, cate, date, str, flag)
err := GetM3u8(url)
if err != nil {
fmt.Printf("Get_m3u8 err")
return
}
num := RegexpUrl(url); if num == 0 {
return
}
wg.Wait()
fmt.Println("all done")
}
//正则匹配
func RegexpUrl(url string) int{
b, err := ioutil.ReadFile("1.txt")
if err != nil{
fmt.Println(err)
return 0
}
reg := "[0-9a-zA-Z]{8,}.ts"
compile := regexp.MustCompile(reg)
html := []byte(string(b))
submatch := compile.FindAllSubmatch(html, -1)
num := len(submatch)
if num == 0 {
fmt.Println("no match")
return 0
}
log.Printf("%s %d\n", url, num)
for k, v := range submatch{
//https://video.huishenghuo888888.com:8091/jingpin/20201224/Lb21hJIr/500kb/hls/oKm4ssYj.ts
url := fmt.Sprintf("https://%s/%s/%s/%s/%s/hls/%s", host, cate, date, str, flag, string(v[0]))
fmt.Printf("go %d %s\n", k, url)
wg.Add(1)
go GetTs(url, k)
if k % 50 == 0 {
time.Sleep(time.Second * 2)
}
}
return num
}
func GetM3u8(url string) error{
client := &http.Client{
}
req,_ := http.NewRequest("GET",url,nil)
req.Header.Add("Origin", origin)
req.Header.Add("Referer", g_referer)
req.Header.Add("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36