node下载m3u8背后的整个视频文件

963 阅读1分钟

一个m3u8文件有整部影片的元信息,包括每个视频分片的ts文件地址,通过提取并下载所需清晰度的视频分片并合并即可。

m3u8文件的内容格式

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:4,
index_001.ts //分片名
#EXTINF:4,
index_002.ts //分片名
#EXTINF:4,
index_003.ts //分片名
#EXTINF:4,
...

我们需要关注的是每个分片的路径名:index_xxx.ts,这里是一个相对路径,手动拼接即可。

我们要做的是,将这样的文件下载并分析提取所有分片的路径,准备后续下载。

下载分片

const baseUrl = "https://XXcdn.xxxx/hls";
const sliceUrlArr = [...];//所有分片的ts文件的Url地址
const fs = require("fs");

//为每片下载预留一个最大的内存空间: 1MB
const maxBufferSize = 1024 * 1024;

for (let i = 0; i < sliceUrlArr.length; i++) {
    const sliceName = sliceUrlArr[i]
    const buffer = execSync(`curl ${baseUrl}/${sliceName}`, {
        maxBuffer: maxBufferSize
    })
    //写入文件,文件名的序号长度一致,如果一共有 234个片,则第一个为 001, 第二个为 002
    const targetFileOrderIndex = ...
    fs.writeFileSync(`./index_${targetFileOrderIndex}.ts`,buffer);
    console.log(`分片写入成功--> `+ i)
}

合并分片

等待上述分片下载完毕,即可开始合并文件了,这里借助操作系统的命令,我们通过:cat ./index_*.ts > newIndex.ts,就将所有的分片合并成一个newIndex.ts文件了,点击相应的播放器就能播放下载的视频咯。

以上合并是Mac下的方式,Window自行查阅即可。