You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();

关键参数说明

  1. 主播放列表自动生成:通过全局选项-master_pl_name让FFmpeg自动拼接所有HLS流的信息,生成你需要的master.m3u8格式,无需手动编写。
  2. 码率与带宽对应:主列表中的BANDWIDTH值为视频码率+音频码率+少量协议开销,示例中参数完全匹配你给出的目标数值。
  3. 编码Profile与Level:根据不同分辨率选择合适的编码等级,确保兼容性和编码效率:
    • 360P/480P用baseline profile,适配低性能设备
    • 720P用main profile,平衡兼容性与画质
    • 1080P用high profile,提供最优画质

注意事项

  • 确保提前创建videos/输出目录,否则FFmpeg会因无法写入文件报错。
  • 建议使用FFmpeg 4.0及以上版本,保证HLS多流输出的稳定性。
  • 若需要调整码率或分辨率,直接修改streamConfigs中的对应参数即可。

内容的提问来源于stack exchange,提问作者Ammar Abdul Aziz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 16:31:02