hls.js码率单位解析:与在线计算工具的差异原因、转换方法及FFmpeg视频码率匹配方案
HLS Levels码率单位差异与转换方案
问题核心拆解
你遇到的码率数值量级差异,本质就是计量单位不同——我给你理清楚来龙去脉:
为什么数值差这么多?
hls.js和Flow Player返回的bitrate字段,单位是bps(比特/秒);而那些在线工具默认展示的是kbps(千比特/秒),1 kbps = 1000 bps。
拿你提供的数据验证下:
- 第1级240P码率:655336 bps ÷ 1000 ≈ 655 kbps
- 第5级1080P码率:5295051 bps ÷ 1000 ≈ 5295 kbps,和你自有视频里的
appleBitrate16x9: 6000/7800属于同量级的合理范围
怎么转换?
直接做除法就行,简单粗暴:
// 把bps转成常用的kbps,保留整数方便后续使用 const convertBpsToKbps = (bpsValue) => Math.round(bpsValue / 1000);
针对FFmpeg制作HLS视频的落地建议
既然要匹配Flow Player的码率,按这个流程来:
- 先把Flow Player返回的bps码率转成kbps(比如1283444 → 1283 kbps)
- 在FFmpeg命令里用
-b:v 1283k这种格式设置对应分辨率的视频码率 - 如果后续停用Flow Player,直接用你现有
qualities数组里的数值就行——calcBitrate4x3、appleBitrate16x9本身就是kbps单位,不需要额外转换
给你贴个FFmpeg生成多码率HLS的示例片段:
ffmpeg -i input.mp4 \ # 240P层级 -filter:v "scale=-2:240" -b:v 655k -c:v libx264 -preset medium -crf 23 \ # 360P层级 -filter:v "scale=-2:360" -b:v 1283k -c:v libx264 -preset medium -crf 23 \ # 720P层级 -filter:v "scale=-2:720" -b:v 2703k -c:v libx264 -preset medium -crf 23 \ -master_pl_name master.m3u8 \ -hls_segment_filename "level_%v/segment_%03d.ts" \ -hls_list_size 0 \ level_%v/stream.m3u8
内容的提问来源于stack exchange,提问作者danday74
相关产品推荐
相关产品推荐

