使用 ffmpeg 对 mkv 进行缩小、色调映射、缩混和重新编码

问题描述

我尝试使用 ffmpeg 将 4k 缩小并将 4k HDR mkv 色调映射为 1080p SDR mkv,代码如下:

ffmpeg -i "Input.mkv" -vf zscale=t=linear:npl=100,format=gbrpf32le,zscale=p=bt709,tonemap=tonemap=hable:desat=0,zscale=t=bt709:m=bt709:r=tv,format=yuv420p -c:v hevc_nvenc -b:v 12M -preset slow "Output.mkv"

问题是,只有第一个音轨(四个)被复制到新的 mkv 并且缺少字幕轨道:

输入:

Stream #0:0: Video: hevc (Main 10),yuv420p10le(tv,bt2020nc/bt2020/smpte2084),3840x2160 [SAR 1:1 DAR 16:9],23.98 fps,23.98 tbr,1k tbn,23.98 tbc (default)
Stream #0:1(ger): Audio: eac3,48000 Hz,7.1,fltp (default)
Stream #0:2(ger): Audio: dts (DTS-HD MA),s16p
Stream #0:3(eng): Audio: truehd,s32 (24 bit)
Stream #0:4(eng): Audio: ac3,5.1(side),fltp,640 kb/s
Stream #0:5(ger): Subtitle: subrip (default) (forced)
Stream #0:6(ger): Subtitle: dvd_subtitle,1920x1080 (forced)
Stream #0:7(ger): Subtitle: hdmv_pgs_subtitle,1920x1080 (forced)
Stream #0:8(ger): Subtitle: dvd_subtitle,1920x1080
Stream #0:9(ger): Subtitle: hdmv_pgs_subtitle
Stream #0:10(eng): Subtitle: dvd_subtitle,1920x1080
Stream #0:11(eng): Subtitle: hdmv_pgs_subtitle

输出

Stream #0:0: Video: hevc (Main),yuv420p(tv),23.98 tbc (default)
Stream #0:1(ger): Audio: vorbis,fltp (default)
Stream #0:2(ger): Subtitle: ass (default) (forced)

我想要一个 mkv 作为输出将所有音轨转换为 aac 立体声(但保留所有四个),复制字幕轨道和色调映射/缩小视频轨道。

我曾尝试使用 -map 0-map 0:a:0 -map 0:a:1 ... 命令(以及一些与这些命令类似的命令,但是我似乎最终得到了一个音轨、没有视频轨或刚刚复制的视频轨.

我可能,我也想使用具有高质量预设的 nvenc,这是我命令中 -c:v hevc_nvenc -b:v 12M -preset slow 的原因,但是我不知道,如果这样做正确,因为输出 mkv 也作为 4k 视频轨道而不是 1080p。也许这是由 -c:v 引起的,因为它覆盖了 -vf?抱歉,我觉得自己很笨,我才刚刚开始使用 ffmpeg。

关于 ffmpeg 的信息太多了,但对我来说要么太复杂,要么没有回答我的问题。

感谢您的帮助!

解决方法

ffmpeg -i "Input.mkv" -vf zscale=t=linear:npl=100,format=gbrpf32le,zscale=p=bt709,tonemap=tonemap=hable:desat=0,zscale=t=bt709:m=bt709:r=tv,format=yuv420p -map 0 -c:v hevc_nvenc -b:v 12M -preset slow -c:s copy -ac 2 "Output.mkv"
  • 添加 -map 0 以包含所有流(默认行为每种类型仅选择 1 个流)。见FFmpeg Wiki: Map
  • -ac 2 用于立体声音频。
  • -c:s copy 流式复制字幕。视频和音频正在被过滤,因此无法流式复制,必须重新编码。
  • 我不是 NVENC 的用户,所以我无法对此发表评论。