[机翻文档0]了解 FFmpeg 命令结构以及 ShanaEncoder 的工作原理
■ FFmpeg 命令结构及在 ShanaEncoder 中的应用
视频编码过程以信息图的形式呈现,使用编码工作流程图(信息图) 。下图说明了如何在 FFmpeg 中将这些步骤组合成单个命令行。

<在终端或DOS窗口中配置FFmpeg命令行({和}实际上并没有使用)>
FFmpeg 可以接收多个输入 ,并按照接收顺序在内部对它们进行编号 0、1、2 、...。
典型的 FFmpeg 命令结构如上图所示,以“ -i {input file} ”为中心,其之前的选项是输入选项 ,其后的选项是输出选项 。因此,即使包含相同的选项,其工作方式也会根据其包含在 -i 之前还是之后而有所不同。
例) -ss (设置 start,片段切割的起点)、 -c:v (视频编解码器)、 -f (format,指定文件格式)等。
“ -i {input file} ”之前的输入选项与解复用和解码相关。FFmpeg 实际上会接受这些选项,并在“ -i {input file} ”之后执行解复用和解码。
在随后的输出选项中,“ -map ”选项(流映射)决定了输入文件中的视频/音频/字幕/其他流在输出文件中的存储顺序。如果省略此选项,FFmpeg 将默认选择输出文件格式能够容纳的最合适的视频/音频/字幕/其他流之一进行存储。通常,视频存储为分辨率最高的流,音频存储为声道最多的流,而字幕存储为标记为“默认”的文本字幕或顺序中的第一个。
滤波和编码部分作用于已经解码的未压缩数据(原始数据) 。根据滤波器设置对未压缩数据进行滤波后,再根据编解码器设置进行压缩(编码)。
编码后,FFmpeg 将视频和音频流混合在一起,同时考虑任何后续的混合相关选项( -vn (无视频)、 -an (无音频)、 -sn (无字幕)、 -f (指定特定的文件格式)等)和标签/元数据相关选项( -map_metadata 、 -map_chapters 、 -metadata 、 -tag 等)。
<礼> ffmpeg -i INPUT -itsoffset -0.5 -i INPUT -map 0:v -map 1:a -c copy OUTPUT
以下是 FFmpeg 对上述命令的解释,该命令仅重新混合比视频慢约 0.5 秒的音频:
-i INPUT ⇒ 识别为零
-itsoffset -0.5 -i INPUT ⇒ INPUT 文件(与第一个输入相同的文件)时间戳提前 0.5 秒并识别为“ 1 ”
(此时,“ -itsoffset -0.5 ”是第二个输入的选项)
-map 0:v -map 1:a ⇒ 记得将 ' 0 ' 的 ' v ' 流(视频)和 ' 1 ' 的 ' a ' 流(音频)放入输出文件中。
-c copy ⇒ 按原样准备解复用流( 复制 ),无需解码
OUTPUT ⇒ 检查 OUTPUT 文件的扩展名并根据方法进行多路复用。
您可以通过打开参数窗口 (快捷键 F8)来检查 FFmpeg 的命令结构在 ShanaEncoder 中是如何实现的。

ShanaEncoder 本质上是一个命令行界面 (CLI) 程序,即 FFmpeg,它被设计成可以在图形用户界面 (GUI) 环境中方便使用。因此,ShanaEncoder 不可避免地省略了 FFmpeg 的一些功能,以方便用户使用。一些代表性的例子包括:
① 缺乏多输入支持 :从第二次输入开始,存在一个不便之处,即必须将文件移动到安装 ShanaEncoder 的文件夹中,并且必须在参数窗口的编码设置部分插入额外的输入命令。
② 流映射是通过右键单击文件列表并使用“选择视频/音频流”命令完成的。您可以在参数窗口的编码设置部分添加 -map 选项,但请小心,因为它可能并不总是按预期工作。通过过滤器图进行动态流映射也是不可能的(它与 ShanaEncoder 的默认流映射功能冲突)。
③ 由于编码引擎 FFmpeg 完全依赖于开发者 Rina 编译提供的库 ,因此用户无法使用自己选择性构建的 FFmpeg 引擎。
而且由于 ShanaEncoder 是基于 FFmpeg 实现的,所以不可避免的也会有 FFmpeg 的局限性。
(例如,NVIDIA 显卡同时编码数量的限制、取决于编解码器的最大可用线程数的限制、以及添加字幕时无法调整行距等)
■ FFmpeg 命令优先级
一旦您了解了上述 FFmpeg 的工作原理,您就可以理解以下 FFmpeg 命令优先级:
默认情况下,FFmpeg 将所有命令放在一行中,因此该行中的第一个命令优先 。但是,即使某个命令排在后面,如果作用于它的步骤在工作流程中更早,它仍然优先。(例如,多路复用或元数据选项可以先于编码选项。)
○ 过滤器之间的优先级
这最准确地应用于过滤器,其中多个过滤器在 -vf 后用逗号( , )分隔 ,并且最先出现的过滤器首先被处理, 而随后出现的过滤器接收紧接在它之前的过滤器的输出值作为其输入值 。
例如,如果 crop (屏幕裁剪)滤镜后跟 scale (分辨率调整)滤镜,则将先裁剪屏幕,然后再调整分辨率。但是,如果顺序相反,则会先更改分辨率,然后再应用屏幕裁剪。
(请注意,在 Shanaincoder 中,使用 [设置/裁剪部分] 选项应用屏幕裁剪滤镜始终优先于 [快速设置 (F6)] 中的 [更改视频大小(更改分辨率)]。)
因此,确定滤镜的优先级至关重要。通常情况下,先进行去隔行处理,然后再进行字幕处理。有些滤镜对其输入和输出原始数据的格式有限制,要求将其放置在特定滤镜之前或之后。这一点也需要考虑。
使用多个滤镜时,另一个需要考虑的因素是 CPU 负载 。使用的软件滤镜越多,CPU 的负担就越大,从而降低编码速度。硬件滤镜目前还不够成熟,不会给显卡带来负担,但很容易获得。
○ 编解码器设置之间的优先级
配置编解码器的选项有两种: 私有选项(特定于特定编解码器)和全局选项( FFmpeg 将其提供给所有编解码器)。例如,对于 x264,私有选项位于 -x264-params 之后(= -x264opts ), 每个私有选项之间用冒号 ( :) 分隔 ;对于 x265,私有选项位于 -x265-params 之后。
常规选项是任何编解码器都具有的常规特性的选项,例如 -profile 、 -level 、 -preset 、 -tune 、 -b:v 或 -b:a 表示比特率、 -crf 、 -r (帧速率)、 -ar (音频采样率)、 -ac (音频通道)等。
如果两者的设置发生冲突, unique 选项的优先级高于 general 选项 。比如,即使你在 general 选项中设置了 high profile,但如果你在 unique 选项中设置了 main profile,那么 profile 也会被设置为 main。
预设、调整和用户选项按优先顺序排列 。也就是说,即使在 x264 中预设设置为“ medium ”,如果用户单独将 ME(运动估计)选项设置为“ umh ”,例如“ -x264-params me=umh ”,则 medium 预设设置的默认值“ hex ”将被用户设置的选项值覆盖。
同样, 用户指定的专用选项设置优先于用户指定的通用选项设置 。例如,如果考虑到播放设备的限制,在 x264 中设置了通用选项“ -level 4.1 ”,则考虑到预设值和各种情况,FHD 视频中的 Ref Frames 值会在内部计算为 3 到 4 左右。但是,如果用户单独设置了 x264 专用选项,例如“ -x264-params ref=2 ”,则实际应用的 Ref Frames 值将为 2。在使用 MediaInfo 观看以此方式编码的视频时,Ref Frames 值将显示为级别中设置的值,因此需要注意,因为实际的选项设置值可能存在差异。
■ FFmpeg 命令结构及在 ShanaEncoder 中的应用
视频编码过程以信息图的形式呈现,使用编码工作流程图(信息图) 。下图说明了如何在 FFmpeg 中将这些步骤组合成单个命令行。

<在终端或DOS窗口中配置FFmpeg命令行({和}实际上并没有使用)>
FFmpeg 可以接收多个输入 ,并按照接收顺序在内部对它们进行编号 0、1、2 、...。
典型的 FFmpeg 命令结构如上图所示,以“ -i {input file} ”为中心,其之前的选项是输入选项 ,其后的选项是输出选项 。因此,即使包含相同的选项,其工作方式也会根据其包含在 -i 之前还是之后而有所不同。
例) -ss (设置 start,片段切割的起点)、 -c:v (视频编解码器)、 -f (format,指定文件格式)等。
“ -i {input file} ”之前的输入选项与解复用和解码相关。FFmpeg 实际上会接受这些选项,并在“ -i {input file} ”之后执行解复用和解码。
在随后的输出选项中,“ -map ”选项(流映射)决定了输入文件中的视频/音频/字幕/其他流在输出文件中的存储顺序。如果省略此选项,FFmpeg 将默认选择输出文件格式能够容纳的最合适的视频/音频/字幕/其他流之一进行存储。通常,视频存储为分辨率最高的流,音频存储为声道最多的流,而字幕存储为标记为“默认”的文本字幕或顺序中的第一个。
滤波和编码部分作用于已经解码的未压缩数据(原始数据) 。根据滤波器设置对未压缩数据进行滤波后,再根据编解码器设置进行压缩(编码)。
编码后,FFmpeg 将视频和音频流混合在一起,同时考虑任何后续的混合相关选项( -vn (无视频)、 -an (无音频)、 -sn (无字幕)、 -f (指定特定的文件格式)等)和标签/元数据相关选项( -map_metadata 、 -map_chapters 、 -metadata 、 -tag 等)。
<礼> ffmpeg -i INPUT -itsoffset -0.5 -i INPUT -map 0:v -map 1:a -c copy OUTPUT
以下是 FFmpeg 对上述命令的解释,该命令仅重新混合比视频慢约 0.5 秒的音频:
-i INPUT ⇒ 识别为零
-itsoffset -0.5 -i INPUT ⇒ INPUT 文件(与第一个输入相同的文件)时间戳提前 0.5 秒并识别为“ 1 ”
(此时,“ -itsoffset -0.5 ”是第二个输入的选项)
-map 0:v -map 1:a ⇒ 记得将 ' 0 ' 的 ' v ' 流(视频)和 ' 1 ' 的 ' a ' 流(音频)放入输出文件中。
-c copy ⇒ 按原样准备解复用流( 复制 ),无需解码
OUTPUT ⇒ 检查 OUTPUT 文件的扩展名并根据方法进行多路复用。
您可以通过打开参数窗口 (快捷键 F8)来检查 FFmpeg 的命令结构在 ShanaEncoder 中是如何实现的。

ShanaEncoder 本质上是一个命令行界面 (CLI) 程序,即 FFmpeg,它被设计成可以在图形用户界面 (GUI) 环境中方便使用。因此,ShanaEncoder 不可避免地省略了 FFmpeg 的一些功能,以方便用户使用。一些代表性的例子包括:
① 缺乏多输入支持 :从第二次输入开始,存在一个不便之处,即必须将文件移动到安装 ShanaEncoder 的文件夹中,并且必须在参数窗口的编码设置部分插入额外的输入命令。
② 流映射是通过右键单击文件列表并使用“选择视频/音频流”命令完成的。您可以在参数窗口的编码设置部分添加 -map 选项,但请小心,因为它可能并不总是按预期工作。通过过滤器图进行动态流映射也是不可能的(它与 ShanaEncoder 的默认流映射功能冲突)。
③ 由于编码引擎 FFmpeg 完全依赖于开发者 Rina 编译提供的库 ,因此用户无法使用自己选择性构建的 FFmpeg 引擎。
而且由于 ShanaEncoder 是基于 FFmpeg 实现的,所以不可避免的也会有 FFmpeg 的局限性。
(例如,NVIDIA 显卡同时编码数量的限制、取决于编解码器的最大可用线程数的限制、以及添加字幕时无法调整行距等)
■ FFmpeg 命令优先级
一旦您了解了上述 FFmpeg 的工作原理,您就可以理解以下 FFmpeg 命令优先级:
默认情况下,FFmpeg 将所有命令放在一行中,因此该行中的第一个命令优先 。但是,即使某个命令排在后面,如果作用于它的步骤在工作流程中更早,它仍然优先。(例如,多路复用或元数据选项可以先于编码选项。)
○ 过滤器之间的优先级
这最准确地应用于过滤器,其中多个过滤器在 -vf 后用逗号( , )分隔 ,并且最先出现的过滤器首先被处理, 而随后出现的过滤器接收紧接在它之前的过滤器的输出值作为其输入值 。
例如,如果 crop (屏幕裁剪)滤镜后跟 scale (分辨率调整)滤镜,则将先裁剪屏幕,然后再调整分辨率。但是,如果顺序相反,则会先更改分辨率,然后再应用屏幕裁剪。
(请注意,在 Shanaincoder 中,使用 [设置/裁剪部分] 选项应用屏幕裁剪滤镜始终优先于 [快速设置 (F6)] 中的 [更改视频大小(更改分辨率)]。)
因此,确定滤镜的优先级至关重要。通常情况下,先进行去隔行处理,然后再进行字幕处理。有些滤镜对其输入和输出原始数据的格式有限制,要求将其放置在特定滤镜之前或之后。这一点也需要考虑。
使用多个滤镜时,另一个需要考虑的因素是 CPU 负载 。使用的软件滤镜越多,CPU 的负担就越大,从而降低编码速度。硬件滤镜目前还不够成熟,不会给显卡带来负担,但很容易获得。
○ 编解码器设置之间的优先级
配置编解码器的选项有两种: 私有选项(特定于特定编解码器)和全局选项( FFmpeg 将其提供给所有编解码器)。例如,对于 x264,私有选项位于 -x264-params 之后(= -x264opts ), 每个私有选项之间用冒号 ( :) 分隔 ;对于 x265,私有选项位于 -x265-params 之后。
常规选项是任何编解码器都具有的常规特性的选项,例如 -profile 、 -level 、 -preset 、 -tune 、 -b:v 或 -b:a 表示比特率、 -crf 、 -r (帧速率)、 -ar (音频采样率)、 -ac (音频通道)等。
如果两者的设置发生冲突, unique 选项的优先级高于 general 选项 。比如,即使你在 general 选项中设置了 high profile,但如果你在 unique 选项中设置了 main profile,那么 profile 也会被设置为 main。
预设、调整和用户选项按优先顺序排列 。也就是说,即使在 x264 中预设设置为“ medium ”,如果用户单独将 ME(运动估计)选项设置为“ umh ”,例如“ -x264-params me=umh ”,则 medium 预设设置的默认值“ hex ”将被用户设置的选项值覆盖。
同样, 用户指定的专用选项设置优先于用户指定的通用选项设置 。例如,如果考虑到播放设备的限制,在 x264 中设置了通用选项“ -level 4.1 ”,则考虑到预设值和各种情况,FHD 视频中的 Ref Frames 值会在内部计算为 3 到 4 左右。但是,如果用户单独设置了 x264 专用选项,例如“ -x264-params ref=2 ”,则实际应用的 Ref Frames 值将为 2。在使用 MediaInfo 观看以此方式编码的视频时,Ref Frames 值将显示为级别中设置的值,因此需要注意,因为实际的选项设置值可能存在差异。









