FFmpeg技术问询:将带双字幕流的H.264 MKV转码为H.265 MKV并保留双字幕流的方法
FFmpeg技术问询:将带双字幕流的H.264 MKV转码为H.265 MKV并保留双字幕流的方法
嘿,我来帮你搞定这个问题!
首先,你碰到的Subtitle encoding currently only possible from text to text or bitmap to bitmap错误,原因很清晰:你的字幕大概率是位图类型的字幕(比如蓝光里常见的PGS字幕),FFmpeg没办法直接对这类字幕做编码转换,只能原样复制它们的流——而你之前的命令没指定字幕的处理规则,FFmpeg默认会尝试编码,这就触发了错误。
另外,默认设置下“烧字幕”的情况,其实不是FFmpeg主动硬编码的,多半是你的输入文件里第一个字幕流被标记成了默认字幕,或者FFmpeg自动选择它做了硬字幕处理,但只要我们明确指定字幕流的处理方式,就能避免这个问题。
给你调整后的正确命令:
ffmpeg -i "xxx.mkv" -map 0:v -map 0:a? -map 0:s? -c:v hevc_nvenc -crf 26 -preset medium -rc vbr_hq -c:a aac -b:a 384k -c:s copy "output.mkv"
我拆解下关键修改点:
-map 0:v:明确指定要处理输入文件的视频流,避免FFmpeg自动选择时出岔子-c:s copy:这是核心!告诉FFmpeg直接复制所有字幕流,不做任何编码转换,完美解决那个字幕错误- 其他参数保持你原来的视频(CUDA加速的H.265)、音频设置不变,完全满足你的转码需求
如果你想给字幕设置默认播放优先级(比如让第一个字幕默认加载),还可以再加个参数优化:
ffmpeg -i "xxx.mkv" -map 0:v -map 0:a? -map 0:s? -c:v hevc_nvenc -crf 26 -preset medium -rc vbr_hq -c:a aac -b:a 384k -c:s copy -disposition:s:0 default -disposition:s:1 none "output.mkv"
这个命令会把第一个字幕设为默认流,第二个设为非默认,播放器会自动优先加载第一个,同时两个字幕流都完整保留,不会被硬编码到视频里。
备注:内容来源于stack exchange,提问作者ShkYo
相关产品推荐
相关产品推荐

