博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang下载m3u8格式电视剧,调用ffmpeg程序将ts文件合成mp4
阅读量:3988 次
发布时间:2019-05-24

本文共 3631 字,大约阅读时间需要 12 分钟。

linux安装ffmpeg详细教程

https://blog.csdn.net/raoxiaoya/article/details/109130549

视频来源: u5影视

顺序

1、下载m3u8
2、根据m3u8下载ts
3、将ts合成mp4

下载程序 download.go

package mainimport (	"fmt"	"io"	"io/ioutil"	"net/http"	"os"	"regexp")var fileChan chan stringvar endChan chan stringvar tsChan chan stringvar folder = "/data/www/mv/dian_shi_ju/ping_fan_de_shi_jie"var num = 56 // 56集func main() {
fileChan = make(chan string, num) endChan = make(chan string, num) tsChan = make(chan string, num) for i := 0; i < num; i++ {
s := fmt.Sprintf("https://u5-web.scbaiduwk.com/dianshiju/tv_ji0cjkun/tv_ji0cjkun_%s.mp4/index.m3u8", fmt.Sprintf("%02d", i+1)) fileChan <- s } // 下载m3u8 for n := 0; n < 10; n++ {
go consumer(fileChan, tsChan) } // 下载ts for m := 0; m < 30; m++ {
go readTs(tsChan, endChan) } k := 0 for {
<-endChan k++ if k == num {
break } }}func consumer(fc chan string, tsChan chan string) {
for {
str := <-fc reg := regexp.MustCompile(`tv_ji0cjkun_(\d+).mp4`) res := reg.FindAllStringSubmatch(str, -1) no := res[0][1] os.Mkdir(folder+"/"+no, os.ModePerm) response, _ := http.Get(str) filename := folder + "/" + no + "/" + no + ".m3u8" f, _ := os.OpenFile(filename, os.O_CREATE|os.O_RDWR, os.ModePerm) defer f.Close() defer response.Body.Close() io.Copy(f, response.Body) tsChan <- no }}func readTs(tsChan chan string, endChan chan string) {
for {
no := <-tsChan fold := folder + "/" + no + "/" data, _ := ioutil.ReadFile(fold + no + ".m3u8") reg := regexp.MustCompile(`(segment-\d+-v1-a1.ts)`) res := reg.FindAllStringSubmatch(string(data), -1) for _, v := range res {
url := fmt.Sprintf("https://u5-web.scbaiduwk.com/dianshiju/tv_ji0cjkun/tv_ji0cjkun_%s.mp4/%s", no, v[1]) response, _ := http.Get(url) f, _ := os.OpenFile(fold+v[1], os.O_CREATE|os.O_RDWR, os.ModePerm) defer f.Close() defer response.Body.Close() io.Copy(f, response.Body) } endChan <- "" }}

合成 createMp4.go

package mainimport (	"fmt"	"os"	"os/exec"	"regexp"	"sort"	"strconv"	"strings")var dirname = "/data/www/mv/dian_shi_ju/ping_fan_de_shi_jie"var savedir = "/data/www/mv/dian_shi_ju/00_ok"func main() {
fs, err := os.Open(dirname) if err != nil {
panic(err) } defer fs.Close() fiss, err := fs.Readdir(0) if err != nil {
panic(err) } for _, vv := range fiss {
temp := vv // 如果电脑配置好的话使用协程 fold := dirname + "/" + temp.Name() f, err := os.Open(fold) if err != nil {
panic(err) } defer func() {
f.Close() }() fis, err := f.Readdir(0) if err != nil {
panic(err) } names := make([]string, 0) toSort := make([]int, 0) for _, v := range fis {
if strings.Contains(v.Name(), "segment") {
// segment-1-v1-a1.ts reg := regexp.MustCompile(`segment-(\d+)-v1-a1`) res := reg.FindAllStringSubmatch(v.Name(), -1) id, _ := strconv.Atoi(res[0][1]) toSort = append(toSort, id) } } sort.Ints(toSort) for _, v := range toSort {
names = append(names, fold+"/"+fmt.Sprintf("segment-%d-v1-a1.ts", v)) } str := strings.Join(names, "|") makeMp4(str, temp.Name()) }}// ffmpeg -i "concat:segment-1-v1-a1.ts|segment-2-v1-a1.ts" -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4func makeMp4(str string, no string) {
binary, lookErr := exec.LookPath("ffmpeg") if lookErr != nil {
panic(lookErr) } args := []string{
"-i", fmt.Sprintf("concat:%s", str), "-acodec", "copy", "-vcodec", "copy", "-absf", "aac_adtstoasc", fmt.Sprintf("%s/%s.mp4", savedir, no), } cmd := exec.Command(binary, args...) r, err := cmd.Output() fmt.Println(err) fmt.Println(string(r))}

go run download.go

go run createMp4.go

当然也可以整合到一个程序。

在这里插入图片描述

你可能感兴趣的文章
算法:数组最长问题
查看>>
算法:topK和中位数问题
查看>>
算法:数字与位数问题
查看>>
算法:数组上计数问题
查看>>
算法:数组上窗口问题
查看>>
算法:动态规划问题
查看>>
算法:数学问题
查看>>
算法:树问题
查看>>
算法:单调栈
查看>>
算法:二叉树Morris遍历
查看>>
算法:二叉树中两节点最近公共祖先节点
查看>>
算法:最长上升子序列系列问题
查看>>
算法:位运算 与 n皇后问题
查看>>
算法:字符串问题
查看>>
算法:回文串问题
查看>>
算法:一致性哈希算法 与 岛问题
查看>>
算法:贪心问题
查看>>
算法:大楼轮廓问题
查看>>
算法:加油站良好的出发点
查看>>
算法:计算几何问题
查看>>