下载M3U8格式视频

  目录

使用nodejs下载M3U8格式视频

M3U8格式视频播放

如何播放M3U8格式视频请参考这里

M3U8格式视频下载

解析M3U8文件

使用m3u8-parser这个库解析。
解析后可以得到一个数组,里边有下载ts格式文件的链接等信息。

下载ts文件

下载ts文件可以使用axios这个库。
为了提高下载速度,可以并行下载多个ts文件,也就是同时使用axios发起多个请求。
这里注意一下,同时发起请求的时候别使用Promise.all这个函数,因为Promise.all这个函数等待所有请求成功后执行回调,但是一般一个视频会包含上百个ts文件,好多请求会失败,所以这里使用了Promise.allSettled函数,这个函数等待所有请求都执行完毕,并且执行结果会标注成功或者失败,利用这个特性可以制作fileList.txt文件,后续ffmpeg利用这个文件将ts文件合并成mp4文件。

创建fileList.txt文件

fileList.txt文件内容如下:

1
2
3
4
5
6
file qThMvh4b.ts
file JYFQD1Ml.ts
file UxTCj4Lz.ts
file fLEDwwSM.ts
file fbA1SzC5.ts
...

合并ts文件转成mp4

1
2
3
4
5
6
7
ffmpeg()
.input(path.resolve(TEMPFOLDER, 'fileList.txt'))
.inputFormat('concat')
.videoCodec('copy')
.audioCodec('copy')
.format('mp4')
.save(path.resolve('./', OUTPUTFILENAME));

这里需要注意,fluent-ffmpeg是nodejs下方便调用ffmpeg的库,所以必须事先在电脑中已经安装好ffmpeg,并且ffmpeg的安装目录必须添加到环境变量中。

清除ts文件

1
2
3
4
5
6
fs.rm(folderPath, { recursive: true, force: true }, (err) => {
if (err) {
throw err;
}
console.log(`${folderPath} 已被删除`);
});

electron集成

上边已经实现了nodejs下载M3U8格式视频,但是使用起来不是很方便,所以这里将代码封装成electron程序,实现界面化操作。
具体实现很简单,代码见下面,electron的基础知识参考electron基础入门
img
img
img
img

代码

基础版本代码
集成electron代码