Node.js中用FFmpeg实现HLS多分辨率转码方案求助
多分辨率HLS流转换解决方案
要实现生成包含单独音频流和多分辨率视频流的HLS主播放列表,你需要利用fluent-ffmpeg的多输出功能,同时配置FFmpeg自动生成主播放列表。以下是完整的实现代码及说明:
完整代码示例
const ffmpeg = require('fluent-ffmpeg'); const inputFile = 'test.mp4'; const outputDir = 'videos/'; // 定义各流的配置参数,与目标主列表完全匹配 const streamConfigs = [ // 单独音频流(仅音频) { type: 'audio', output: `${outputDir}output_64k_audio.m3u8`, options: [ '-vn', // 禁用视频轨道 '-acodec aac', // 指定AAC音频编码 '-ab 64k', // 音频码率64k '-hls_time 10', // 每个TS切片时长10秒 '-hls_list_size 0', // 保留所有切片,不自动删除 '-f hls' // 输出格式为HLS ] }, // 360P视频流 { type: 'video', resolution: '640x360', videoBitrate: '550k', audioBitrate: '72k', output: `${outputDir}output_360.m3u8`, options: [ '-profile:v baseline', // 基础编码 profile,兼容低版本设备 '-level 3.0', // 编码等级3.0 '-start_number 0', // 切片起始编号从0开始 '-hls_time 10', '-hls_list_size 0', '-f hls' ] }, // 480P视频流 { type: 'video', resolution: '854x480', videoBitrate: '740k', audioBitrate: '72k', output: `${outputDir}output_480.m3u8`, options: [ '-profile:v baseline', '-level 3.1', // 适配480P的编码等级 '-start_number 0', '-hls_time 10', '-hls_list_size 0', '-f hls' ] }, // 720P视频流 { type: 'video', resolution: '1280x720', videoBitrate: '1200k', audioBitrate: '72k', output: `${outputDir}output_720.m3u8`, options: [ '-profile:v main', // 主编码 profile,支持更多特性 '-level 3.2', // 适配720P的编码等级 '-start_number 0', '-hls_time 10', '-hls_list_size 0', '-f hls' ] }, // 1080P视频流 { type: 'video', resolution: '1920x1080', videoBitrate: '1555k', audioBitrate: '72k', output: `${outputDir}output_1080.m3u8`, options: [ '-profile:v high', // 高级编码 profile,画质更优 '-level 4.0', // 适配1080P的编码等级 '-start_number 0', '-hls_time 10', '-hls_list_size 0', '-f hls' ] } ]; // 初始化FFmpeg命令 let command = ffmpeg(inputFile, { timeout: 432000 }) // 全局配置:自动生成主播放列表 .addOption('-master_pl_name', `${outputDir}master.m3u8`); // 为每个流添加输出配置 streamConfigs.forEach(config => { let output = command.output(config.output); // 添加当前流的基础选项 config.options.forEach(opt => output.addOption(opt)); if (config.type === 'video') { // 视频流额外设置分辨率、视频/音频码率 output .size(config.resolution) .videoBitrate(config.videoBitrate) .audioBitrate(config.audioBitrate); } }); // 执行转换并处理状态 command .on('start', cmd => console.log('启动FFmpeg转换:', cmd)) .on('end', () => console.log('转换完成,主播放列表已生成')) .on('error', err => console.error('转换失败:', err)) .run();
关键参数说明
- 主播放列表自动生成:通过全局选项
-master_pl_name让FFmpeg自动拼接所有HLS流的信息,生成你需要的master.m3u8格式,无需手动编写。 - 码率与带宽对应:主列表中的
BANDWIDTH值为视频码率+音频码率+少量协议开销,示例中参数完全匹配你给出的目标数值。 - 编码Profile与Level:根据不同分辨率选择合适的编码等级,确保兼容性和编码效率:
- 360P/480P用
baselineprofile,适配低性能设备 - 720P用
mainprofile,平衡兼容性与画质 - 1080P用
highprofile,提供最优画质
- 360P/480P用
注意事项
- 确保提前创建
videos/输出目录,否则FFmpeg会因无法写入文件报错。 - 建议使用FFmpeg 4.0及以上版本,保证HLS多流输出的稳定性。
- 若需要调整码率或分辨率,直接修改
streamConfigs中的对应参数即可。
内容的提问来源于stack exchange,提问作者Ammar Abdul Aziz
相关产品推荐
相关产品推荐

