使用FFmpeg实时转码H264 HLS直播流为HEVC HLS流时播放卡顿停止的问题排查
FFmpeg实时转码H264 HLS直播流为HEVC HLS流时播放卡顿停止的问题排查
看起来你遇到了实时转码HLS流时播放几秒就卡顿停止的问题,我来帮你一步步排查可能的问题并给出调整建议:
先排查输入源稳定性
首先得确认问题是不是出在输入的远程HLS流上——如果源本身就不稳定,转码环节自然会出问题。你可以先直接用FFplay播放原流测试:
ffplay https://tezaurtv.md/wp-content/uploads/live/index.m3u8
如果这个播放过程也卡顿、断流,那说明输入源本身有波动,需要给FFmpeg加一些输入容错参数,比如:
-fflags +igndts+discardcorrupt+nobuffer
你已经加了-rtbufsize 500M,也可以尝试调到1G,增强输入缓存的容错能力。
转码参数的不合理点调整
你的命令里有些参数组合可能会导致播放异常,建议按以下方式调整:
-vsync参数优化:你用了-vsync 2(可变帧率模式),实时转码时容易导致时间戳混乱,播放器无法正常解析。建议改成-vsync 1(同步到固定帧率)或者-vsync passthrough(直接传递时间戳)。hls_flags调整:delete_segments会自动删除旧片段,但你设置了-hls_playlist_type event(事件型播放列表,会累积所有片段),当FFplay播放到被删除的片段时,就会因为找不到文件而停止。可以先去掉delete_segments测试。- 片段生成频率调整:
-hls_time 10意味着每10秒生成一个片段,Windows机械硬盘可能跟不上实时写入速度,建议改成-hls_time 15降低生成频率,或者换成SSD路径存储片段。
调整后的示例命令
ffmpeg -fflags +igndts+discardcorrupt -rtbufsize 1G -i https://tezaurtv.md/wp-content/uploads/live/index.m3u8 -c:v libx265 -b:v 1500k -tag:v hvc1 -c:a aac -b:a 128k -f hls -hls_time 15 -hls_list_size 10 -hls_flags append_list+program_date_time -hls_playlist_type event -hls_segment_type mpegts -hls_segment_filename "D:/BRUT/HLS/test/stream_%d.ts" -vsync 1 -loglevel info D:/BRUT/HLS/test/stream.m3u8
借助日志定位问题
你加了-loglevel debug,可以重点看FFmpeg停止前的日志输出:
- 如果出现
Input/output error或No more frames to read,说明输入流断了,需要优化输入缓存或换稳定源; - 如果出现
Permission denied或No space left on device,说明磁盘权限或空间有问题; - 如果出现编码器相关错误,可能是
libx265的参数设置不合理,可以尝试降低-b:v到1000k测试。
备注:内容来源于stack exchange,提问作者Ghenadie Pripa
相关产品推荐
相关产品推荐

