如何将FLV直播流转换为HLS以在应用中播放?求实时转换工具
FLV直播流转HLS实时转换方案
嘿,这个需求我刚好在项目里实践过,给你梳理下具体的实现思路、工具选择和注意事项:
核心思路
其实你不用拆分“FLV转H264/AAC再转HLS”这两步——大部分专业工具可以直接完成实时转码+封装的全流程。如果你的FLV流本身已经是H264视频+AAC音频编码(这是直播流的主流编码),甚至可以直接做转封装(Remux),不用重新编码,性能和实时性会好很多。
推荐的实时转换工具
1. FFmpeg(最通用的命令行工具)
这是流媒体处理的瑞士军刀,几乎能搞定所有格式转换需求,实时转FLV到HLS完全没问题。
转码+封装(适用于FLV编码不是H264/AAC的情况)
ffmpeg -i rtmp://your-flv-stream-url \ -c:v libx264 -preset ultrafast -crf 23 \ -c:a aac -b:a 128k \ -f hls -hls_time 2 -hls_list_size 10 \ -hls_flags delete_segments+append_list \ -hls_segment_filename "hls/segment_%03d.ts" \ hls/output.m3u8
参数解释:
-preset ultrafast:最快的编码速度,优先保证实时性(画质会略有牺牲,可根据需求调整)-hls_time 2:每个TS切片的时长(秒),越小延迟越低但切片数量越多-hls_list_size 10:M3U8列表中保留的最新切片数-hls_flags delete_segments+append_list:自动删除旧切片,同时在M3U8末尾追加新切片,适合直播场景
转封装(仅适用于FLV已为H264+AAC编码,性能最优)
如果你的源FLV流编码符合要求,直接拷贝编码格式,只换封装:
ffmpeg -i rtmp://your-flv-stream-url \ -c copy -f hls \ -hls_time 2 -hls_list_size 10 \ -hls_flags delete_segments+append_list \ hls/output.m3u8
这个方式几乎没有延迟,CPU占用极低,优先推荐。
2. SRS流媒体服务器(专为直播优化)
如果你的场景是高并发直播,FFmpeg单进程可能扛不住,推荐用SRS——这是一款轻量高性能的开源流媒体服务器,支持一键配置FLV/RTMP转HLS,还能处理流的分发、缓存等问题。
配置示例(在SRS的conf/hls.conf中):
listen 1935; max_connections 1000; vhost __defaultVhost__ { hls { enabled on; hls_path ./objs/nginx/html/hls; hls_fragment 2; hls_window 10; } }
启动SRS后,把FLV流推到rtmp://your-srs-ip/live/stream,就能直接在http://your-srs-ip/hls/stream.m3u8拿到HLS流了,非常省心。
应用中播放HLS的注意事项
- Web端:大部分现代浏览器原生不支持HLS(除了Safari),需要用
hls.js库来兼容,直接引入后就能通过video标签播放M3U8链接。 - 移动端:iOS的AVPlayer原生支持HLS;Android 7.0+原生支持,低于7.0的版本可以用ExoPlayer来播放。
- 延迟控制:如果对延迟要求极高,可以把
hls_time设为1秒,同时减少hls_list_size的数量,但要注意切片过多可能会增加客户端的加载压力。
内容的提问来源于stack exchange,提问作者fanjianrong
相关产品推荐
相关产品推荐

