如何使用编译支持NVIDIA GPU的FFmpeg将MKV转为HLS多码率流
问题根因
- 解码参数位置错误:
h264_cuvid是输入文件的解码器参数,必须放在-i input.mkv之前,你写在输入参数后会被识别为输出编码器参数,和后续的h264_nvenc编码器参数冲突 - 滤镜未绑定输出流索引:全局
-vf参数会被最后定义的缩放规则覆盖,需要像CPU参考命令一样,用-filter:v:0、-filter:v:1分别为不同输出流指定滤镜链 - 冗余重复参数:重复定义了
hls_time,会导致最后定义的数值覆盖前面的设置
修正后的命令
ffmpeg -c:v h264_cuvid -i input.mkv \ -y -vsync 0 -c:v h264_nvenc -c:a copy \ -map 0:v:0 -map 0:a:0 -map 0:v:0 -map 0:a:0 \ -filter:v:0 fade,hwupload_cuda,scale_npp=854:358 -b:v:0 1M -b:a:0 128k \ -filter:v:1 fade,hwupload_cuda,scale_npp=1280:536 -b:v:1 3M -b:a:1 192k \ -var_stream_map "v:0,a:0,name:480p v:1,a:1,name:720p" \ -hls_time 3 -hls_list_size 0 -hls_flags independent_segments \ -f hls -hls_playlist_type event -master_pl_name "master-pl.m3u8" output-%v.m3u8
关键改动说明
- 把解码器参数
-c:v h264_cuvid移到了输入文件参数前,明确指定输入用NVIDIA硬件解码 - 把两个
-map参数合并到同一行,明确声明需要输出2路视频+2路音频流 - 把原来的全局
-vf替换为按流索引匹配的-filter:v:0、-filter:v:1,确保每路视频流使用对应的缩放规则 - 删掉了重复的
hls_time 10参数,统一使用3秒分片配置
如果你的输入MKV是HEVC编码,把开头的h264_cuvid替换为hevc_cuvid即可。
内容的提问来源于stack exchange,提问作者Madiyor
相关产品推荐
相关产品推荐

