使用fluent-ffmpeg将完整视频文件转码切片为.ts .m3u8文件以实现hls流媒体传输

发布时间 2023-10-13 09:16:26作者: 杰哥来了

使用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分片