使用fluent-ffmpeg将完整视频文件转码切片为.ts .m3u8文件以实现hls流媒体传输
安装
项目内安装:
npm i ffmpeg
npm i fluent-ffmpeg
外部环境安装:
官网下载ffmpeg,将文件bin目录添加为Path系统环境变量
C:\Users\lenovo\Desktop\ffmpeg-6.0-essentials_build\ffmpeg-6.0-essentials_build\bin
编写JS脚本
/**
* 依赖库/包: ffmpeg fluent-ffmpeg。
* 功 能: 实现hls流媒体播放,视频切片为大量.ts文件(视频)和单个.m3u8(列表描述文件)。
* 服务器中存储大量切片文件,客户端请求.m3u8列表文件实现对切片的加载 。
* test、testhls 目录和该hll.js文件为该功能的模块。
*
* @time 23/10/11
*/
const ffmpeg = require('fluent-ffmpeg')
const inputFile = './assets/videosource/1001.mp4' // 输入文件目录
const outputPath = './assets/videosource/1001' // 输出文件目录
function hlsSlice(inputFile, outputPath) {
const command = ffmpeg(inputFile)
// command.videoCodec('libx264') // 设置视频编解码器
command.outputFormat('hls') // 输出视频格式
command.outputOptions('-hls_list_size 0') // -hls_list_size n:设置播放列表保存的最多条目,设置为0会保存有所片信息,默认值为5
command.outputOption('-hls_time 5') // -hls_time n: 设置每片的长度,默认值为2。单位为秒
command.output(outputPath + '/playlist.m3u8') // 输出文件
command.on('progress', (progress) => { // 监听切片进度
let number = Number(progress.percent).toFixed(2)
console.log(`Processing: ${number}%`)
})
command.on('end', () => { // 监听结束
console.clear()
console.log(`${inputFile}:视频切片已完成`)
})
command.run() // 执行
}
hlsSlice(inputFile, outputPath)
客户端请求
注意:服务端.ts .m3u8文件应当在同一目录下
客户端请求对应视频文件的.m3u8文件即可实现hls加载ts分片