【音视频】HLS 流媒体配置

这个系列文章我们来介绍一位海外工程师如何探索安卓音视频基础技术,对于想要开始学习音视频技术的朋友,这些文章是份不错的入门资料,本篇介绍 HLS 流媒体配置。

——来自公众号“关键帧Keyframe”的分享

1、HLS 核心概念

  • 分段:将连续媒体切成 ≤ 10 s 的小文件(.ts / .m4s)
  • 播放列表:M3U8 文本文件,按顺序列出片段 URL 及标签
  • 自适应:多码率多分辨率,由客户端根据带宽实时切换
  • 传输:纯 HTTP,无需特殊端口 → 穿透防火墙/CDN 友好

2、基础单码率转码

ffmpeg -i input.mp4 \
  -c:v libx264 -c:a aac \
  -f hls -hls_time 6 output.m3u8

产物:

output.m3u8
output0.ts
output1.ts
...

3、多码率自适应(ABR)

3.1、一次性生成 3 档

ffmpeg -i input.mp4 \
  -filter_complex \
    "[0:v]split=3[v1080][v720][v480];
     [v1080]scale=w=1920:h=1080:force_original_aspect_ratio=decrease[v1080];
     [v720]scale=w=1280:h=720:force_original_aspect_ratio=decrease[v720];
     [v480]scale=w=854:h=480:force_original_aspect_ratio=decrease[v480]" \
  -map "[v1080]" -map 0:a -c:v h264 -profile:v main -crf 20 -g 48 -keyint_min 48 -sc_threshold 0 \
       -b:v 5000k -maxrate 5300k -bufsize 7500k -hls_time 4 -hls_segment_filename 1080p_%03d.ts 1080p.m3u8 \
  -map "[v720]" -map 0:a -c:v h264 -profile:v main -crf 20 -g 48 -keyint_min 48 -sc_threshold 0 \
       -b:v 2800k -maxrate 2996k -bufsize 4200k -hls_time 4 -hls_segment_filename 720p_%03d.ts 720p.m3u8 \
  -map "[v480]" -map 0:a -c:v h264 -profile:v main -crf 20 -g 48 -keyint_min 48 -sc_threshold 0 \
       -b:v 1400k -maxrate 1490k -bufsize 2100k -hls_time 4 -hls_segment_filename 480p_%03d.ts 480p.m3u8

关键:-sc_threshold 0 禁止场景切关键帧,保证片段对齐。

4、直播(Event/Live)模式

ffmpeg -i rtmp://localhost/live/ingest \
  -c:v libx264 -preset ultrafast -tune zerolatency \
  -c:a aac -ar 44100 -b:a 128k \
  -f hls -hls_time 2 -hls_playlist_type event \
  -hls_flags delete_segments -hls_list_size 5 \
  -hls_delete_threshold 1 \
  live.m3u8

差异:

参数VODEventLive
#EXT-X-PLAYLIST-TYPEVODEVENT
片段回收不删除可选必须
列表长度00 / N小窗口

5、AES-128 加密

5.1、生成密钥

openssl rand 16 > enc.key
echo "https://example.com/enc.key" > enc.keyinfo
echo "enc.key" >> enc.keyinfo
echo "$(openssl rand -hex 16)" >> enc.keyinfo   # IV

5.2、加密命令

ffmpeg -i input.mp4 -c:v libx264 -c:a aac \
  -hls_key_info_file enc.keyinfo \
  -hls_time 10 output.m3u8

播放列表增加:

#EXT-X-KEY:METHOD=AES-128,URI="https://example.com/enc.key",IV=0x...

6、存储/带宽优化技巧

技巧命令行效果
单文件模式-hls_flags single_file仅 1 个 .ts + offset,减少 inode
独立片段-hls_flags independent_segments每个片段 SAP=1,Seek 更快
MPEG-DASH 兼容-hls_segment_type fmp4复用 fMP4,与 DASH 共用片段
自动清理-hls_flags delete_segments -hls_list_size 3磁盘占用恒定

7、主播放列表(Master Playlist)

手动创建 master.m3u8

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.640028,mp4a.40.2"
1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2800000,RESOLUTION=1280x720,CODECS="avc1.64001F,mp4a.40.2"
720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1400000,RESOLUTION=854x480,CODECS="avc1.640015,mp4a.40.2"
480p.m3u8

必须包含 CODECS 属性,否则 Safari 拒绝切换。

8、测试与验证

8.1、ffprobe 检查

# 查看 variant 流信息
ffprobe -v quiet -print_format json -show_streams 1080p.m3u8

# 统计片段时长
ffprobe -v quiet -show_entries format=duration 1080p_000.ts

8.2、多端播放矩阵

平台引擎结果
iOS 14+Safari 原生
Android 10+ExoPlayer
Chrome 90+hls.js
tvOSAVPlayer
LG webOS原生 HLS

9、Web 播放器集成(hls.js)

<video id="video" controls></video>
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
<script>
  if(Hls.isSupported()) {
    const hls = new Hls({debug:false});
    hls.loadSource('master.m3u8');
    hls.attachMedia(video);
    hls.on(Hls.Events.MANIFEST_PARSED, () => video.play());
  } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
    video.src = 'master.m3u8';
    video.addEventListener('loadedmetadata', () => video.play());
  }
</script>

10、常见问题速查

现象根因修复
片段未对齐,Seek 花屏关键帧间隔 ≠ hls_time-g XX -keyint_min XX -sc_threshold 0
高延迟 > 10 s片段过长或列表过大直播 -hls_time 2 -hls_list_size 5
Safari 无法播放缺少 CODECS 或 #EXT-X-VERSION手动指定版本 & CODECS
磁盘暴涨未删除旧片段-hls_flags delete_segments
加密后黑屏KEY/IV 路径错误检查 HTTPS 可访问 & CORS

11、下一步进阶

  • 低延迟 HLS(Apple LL-HLS, sub-2s):使用 -hls_flags append_list+round_durations
  • 硬件加速:iOS VideoToolbox / Android MediaCodec → 节能 40%
  • DASH 双轨:同一 fMP4 片段服务 HLS & DASH,降低 30% 存储
  • RTMP 采集 → HLS 分发:参考 [RTMP 协议实现] 文档搭建端到端链路

学习和提升音视频开发技术,推荐你加入我们的知识星球:【关键帧的音视频开发圈】

【音视频】HLS 流媒体配置

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论