FFmpeg多分辨率HLS转码脚本兼容无音频输入方案求助
解决方案
核心问题是-var_stream_map要求指定的音视频流必须存在,因此最优解是提前检测输入文件的音频轨道情况,无音频时自动注入符合编码要求的静音音轨,保证输入始终有1条可用音频流,原有转码逻辑无需大幅修改。
修改后的完整脚本如下:
VIDEO_IN=test.mov VIDEO_OUT=master HLS_TIME=4 FPS=25 GOP_SIZE=100 PRESET_P=veryslow V_SIZE_1=960x540 V_SIZE_2=416x234 V_SIZE_3=640x360 V_SIZE_4=768x432 V_SIZE_5=1280x720 V_SIZE_6=1920x1080 # 检测输入文件是否存在音频轨道 HAS_AUDIO=$(ffprobe -v error -select_streams a:0 -show_entries stream=codec_type -of default=noprint_wrappers=1:nokey=1 "$VIDEO_IN" | wc -l) # 构建音频输入参数 AUDIO_INPUT_PARAM="" if [ $HAS_AUDIO -eq 0 ]; then # 无音频时注入匹配参数的静音音轨:单声道、44100采样率 AUDIO_INPUT_PARAM="-f lavfi -i anullsrc=cl=mono:r=44100" fi # HLS转码 ffmpeg -i $VIDEO_IN $AUDIO_INPUT_PARAM -y \ -preset $PRESET_P -keyint_min $GOP_SIZE -g $GOP_SIZE -sc_threshold 0 -r $FPS -c:v libx264 -pix_fmt yuv420p \ -map v:0 -s:0 $V_SIZE_1 -b:v:0 2M -maxrate:0 2.14M -bufsize:0 3.5M \ -map v:0 -s:1 $V_SIZE_2 -b:v:1 145k -maxrate:1 155k -bufsize:1 220k \ -map v:0 -s:2 $V_SIZE_3 -b:v:2 365k -maxrate:2 390k -bufsize:2 640k \ -map v:0 -s:3 $V_SIZE_4 -b:v:3 730k -maxrate:3 781k -bufsize:3 1278k \ -map v:0 -s:4 $V_SIZE_4 -b:v:4 1.1M -maxrate:4 1.17M -bufsize:4 2M \ -map v:0 -s:5 $V_SIZE_5 -b:v:5 3M -maxrate:5 3.21M -bufsize:5 5.5M \ -map v:0 -s:6 $V_SIZE_5 -b:v:6 4.5M -maxrate:6 4.8M -bufsize:6 8M \ -map v:0 -s:7 $V_SIZE_6 -b:v:7 6M -maxrate:7 6.42M -bufsize:7 11M \ -map v:0 -s:8 $V_SIZE_6 -b:v:8 7.8M -maxrate:8 8.3M -bufsize:8 14M \ -map a:0 -map a:0 -map a:0 -map a:0 -map a:0 -map a:0 -map a:0 -map a:0 -map a:0 -c:a aac -b:a 128k -ac 1 -ar 44100 \ -f hls -hls_time $HLS_TIME -hls_playlist_type vod -hls_flags independent_segments \ -master_pl_name $VIDEO_OUT.m3u8 \ -hls_segment_filename HLS/stream_%v/s%06d.ts \ -strftime_mkdir 1 \ -var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2 v:3,a:3 v:4,a:4 v:5,a:5 v:6,a:6 v:7,a:7 v:8,a:8" HLS/stream_%v.m3u8
关键修改说明
- 新增ffprobe检测逻辑,自动判断输入是否存在音频轨道
- 无音频时通过
anullsrc滤镜生成静音轨道,参数和原有音频编码要求的单声道、44100采样率完全对齐,不会出现编码不兼容问题 - 原有所有转码、多码率配置、HLS参数均未改动,输出的分片、码率、清晰度和原脚本完全一致
- 不需要修改
-var_stream_map参数,因为始终保证有可用的音频流,不会再出现匹配失败的报错
注意事项
ffprobe一般随FFmpeg默认安装,无需额外部署。
内容的提问来源于stack exchange,提问作者Konstantin
相关产品推荐
相关产品推荐

