这个系列文章我们来介绍一位海外工程师如何探索安卓音视频基础技术,对于想要开始学习音视频技术的朋友,这些文章是份不错的入门资料,本篇介绍 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
差异:
| 参数 | VOD | Event | Live |
|---|---|---|---|
#EXT-X-PLAYLIST-TYPE | VOD | EVENT | 无 |
| 片段回收 | 不删除 | 可选 | 必须 |
| 列表长度 | 0 | 0 / 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 | ✅ |
| tvOS | AVPlayer | ✅ |
| 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 协议实现] 文档搭建端到端链路
学习和提升音视频开发技术,推荐你加入我们的知识星球:【关键帧的音视频开发圈】

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