ffmpeg-python转码无音频视频为HLS时master.m3u8无流列表问题
问题原因
- 当前转码配置默认要求HLS变体流必须同时包含音视频轨,当输入无音频流时,所有转码生成的变体流不符合规则,被ffmpeg自动过滤,不会写入master.m3u8文件
- 另一类常见原因是配置中强制写死了音频流映射、音频编码参数,无音频输入时ffmpeg找不到对应的音频流,转码逻辑异常,直接跳过了变体流的写入
解决方案
方案1:适配现有配置,自动补全静音音轨(推荐)
无需修改原有HLS输出逻辑,只需要判断输入是否存在音频流,无音频时生成一个静音音频轨补入即可,ffmpeg-python示例代码如下:
import ffmpeg input_path = "你的输入视频路径.mp4" # 探测输入文件流信息 media_info = ffmpeg.probe(input_path) has_audio = any(stream["codec_type"] == "audio" for stream in media_info["streams"]) input_video = ffmpeg.input(input_path).video if not has_audio: # 生成采样率44100、双声道的静音音频流 input_audio = ffmpeg.input("anullsrc=r=44100:cl=stereo", f="lavfi").audio else: input_audio = ffmpeg.input(input_path).audio # 后续接你原有多码率转码、HLS输出的逻辑即可
该方案生成的HLS流和原配置生成的结构完全一致,兼容性更好,无需调整播放器侧逻辑。
方案2:修改HLS配置,允许纯视频流
如果业务不需要音频轨,可以直接修改输出参数允许纯视频变体流写入master.m3u8:
- 输出参数中添加
hls_allow_videos_only=1配置,允许纯视频流被识别为合法变体流 - 移除配置中强制映射音频流、强制指定音频编码的参数,如果原有配置硬写了
CODECS属性包含音频编码(比如mp4a.40.2),要改为仅保留视频编码标识
ffmpeg-python输出部分示例:
( ffmpeg .output( [input_video, *your_variant_params], "master.m3u8", hls_time=10, hls_playlist_type="vod", master_pl_name="master.m3u8", hls_allow_videos_only=1, # 关键配置 # 无音频时codecs仅保留视频编码 hls_segment_codecs="avc1.64001f" ) .run() )
内容的提问来源于stack exchange,提问作者kamoloff
相关产品推荐
相关产品推荐

