在 x265 (HEVC) 中重新编码视频库,没有质量损失

shi*_*ams 58 ffmpeg video video-encoding avconv

我正在尝试将我的视频库转换为 HEVC 格式以获得空间。我对库中的所有视频文件运行了以下命令:

#!/bin/bash
for i in *.mp4;
do 
    #Output new files by prepending "X265" to the names
    avconv -i "$i" -c:v libx265 -c:a copy X265_"$i"
done
Run Code Online (Sandbox Code Playgroud)

现在,大多数视频转换良好,质量与以前相同。但是,一些质量非常高的视频(例如,一部 5GB 的电影印刷品)会降低质量——视频都是像素化的。

我不知道在这种情况下该怎么做。我需要修改crf命令行中的参数吗?或者是其他东西?

问题是,我正在进行批量转换。所以,我需要一种方法,avconv可以为每个视频自动调整任何需要调整的参数。

更新-1

我发现这crf是我需要调整的旋钮。默认的 CRF 是 28。为了更好的质量,我可以使用小于 28 的值。例如:

avconv -i input.mp4 -c:v libx265 -x265-params crf=23 -c:a copy output.mp4
Run Code Online (Sandbox Code Playgroud)

但是,问题是对于某些视频,CRF 值 28 就足够了,而对于某些视频,则需要较低的 CRF。这是我必须通过转换大视频的小部分来手动检查的东西。但是在批量转换中,我将如何手动检查每个视频?他们有什么办法avconv可以根据输入的视频智能调整CRF吗?

更新-2

我发现--losslessx265中有一个选项:http : //x265.readthedocs.org/en/default/lossless.html

但是,我不知道如何正确使用它。我尝试以下列方式使用它,但它产生了相反的结果(视频更加像素化):

avconv -i input.mp4 -c:v libx265 -x265-params lossless -c:a copy output.mp4
Run Code Online (Sandbox Code Playgroud)

小智 74

根据我自己的经验,如果您希望绝对没有质量损失,--lossless 就是您要寻找的。

不确定,avconv但您输入的命令看起来与我使用FFmpeg. 在FFmpeg你可以通过这样的参数:

ffmpeg -i INPUT.mkv -c:v libx265 -preset ultrafast -x265-params lossless=1 OUTPUT.mkv
Run Code Online (Sandbox Code Playgroud)

大多数x265开关(没有值的选项)可以这样指定(除了那些仅限 CLI 的x265开关,那些只直接与二进制一起使用)。

顺便说一下,我想分享我在x265编码方面的经验。对于大多数视频(WMV、MPEG 或 AVC/H.264),我使用crf=23. x265决定其余的参数,通常它做得足够好。

然而,在我承诺对整个视频进行转码之前,我经常通过转换相关视频的一小部分来测试我的设置。下面是一个示例,假设一个 mkv 文件的流 0 是视频,流 1 是 DTS 音频,流 2 是字幕:

ffmpeg -hide_banner \
-ss 0 \
-i "INPUT.mkv" \
-attach "COVER.jpg" \
-map_metadata 0 \
-map_chapters 0 \
-metadata title="TITLE" \
-map 0:0 -metadata:s:v:0 language=eng \
-map 0:1 -metadata:s:a:0 language=eng -metadata:s:a:0 title="Surround 5.1 (DTS)" \
-map 0:2 -metadata:s:s:0 language=eng -metadata:s:s:0 title="English" \
-metadata:s:t:0 filename="Cover.jpg" -metadata:s:t:0 mimetype="image/jpeg" \
-c:v libx265 -preset ultrafast -x265-params \
crf=22:qcomp=0.8:aq-mode=1:aq_strength=1.0:qg-size=16:psy-rd=0.7:psy-rdoq=5.0:rdoq-level=1:merange=44 \
-c:a copy \
-c:s copy \
-t 120 \
"OUTPUT.HEVC.DTS.Sample.mkv"
Run Code Online (Sandbox Code Playgroud)

请注意,反斜杠表示长命令中的换行符,我这样做是为了帮助我跟踪复杂 CLI 输入的各个位。在我逐行解释之前,只转换一小部分视频的部分是第二行和倒数第二行:-ss 0意味着在开始解码输入之前寻求 0 秒,并-t 120意味着停止写入输出120 秒后。您还可以使用 hh:mm:ss 或 hh:mm:ss.sss 时间格式。

现在逐行:

  1. -hide_banner防止FFmpeg在启动时显示构建信息。我只是不想在控制台中向上滚动时看到它;
  2. -ss 0在开始解码输入之前寻求 0 秒。请注意,如果该参数给出输入文件和之前的输出文件,它成为一个输出选项,并告诉ffmpeg解码和忽略输入直到x秒,然后开始写输出。作为输入选项,它不太准确(因为在大多数容器格式中查找都不准确),但几乎不需要时间。作为输出选项,它非常精确,但在指定时间之前解码所有流需要大量时间,并且出于测试目的,您不想浪费时间;
  3. -i "INPUT.mkv": 指定输入文件;
  4. -attach "COVER.jpg":将封面艺术(缩略图、海报等)附加到输出。封面通常显示在文件浏览器中;
  5. -map_metadata 0:从输入 0 复制任何和所有元数据,在示例中只是输入;
  6. -map_chapters 0:从输入 0 复制章节信息(如果存在);
  7. -metadata title="TITLE":设置视频的标题;
  8. -map 0:0 ...: 映射流 0 的输入 0,这意味着我们希望将输入的第一个流写入输出。由于此流是视频流,因此它是输出中的第一个视频流,因此是流说明符。将其语言标签设置为英语;:s:v:0
  9. -map 0:1 ...: 与第8行类似,映射第二个流(DTS音频),并设置其语言和标题(为了在播放器中选择时更容易识别);
  10. -map 0:2 ...: 和第 9 行类似,只是这个流是副标题;
  11. -metadata:s:t:0 ...:设置封面的元数据。这是 mkv 容器格式所必需的;
  12. -c:v libx265 ...:视频编解码器选项。太长了,我把它分成两行。此设置适用于具有最小渐变条带(x265 很糟糕)的高质量蓝光视频 (1080p)。对于 DVD、电视节目和电话视频来说,这很可能是一种矫枉过正。这个设置主要是从这个 Doom9 帖子中窃取
  13. crf=22:...:继续视频编解码器参数。参见上面提到的论坛帖子;
  14. -c:a copy:复制音频;
  15. -c:s copy:复制字幕;
  16. -t 120:120 秒后停止写入输出,这为我们提供了 2 分钟的剪辑用于预览转码质量;
  17. "OUTPUT.HEVC.DTS.Sample.mkv": 输出文件名。我用视频编解码器和主要音频编解码器标记我的文件名。

哇。这是我的第一个答案,所以如果我遗漏了什么,请发表评论。我不是视频制作专家,我只是一个懒得把光盘放进播放器看电影的人。

附注。也许这个问题属于其他地方,因为它与 Unix 和 Linux 没有密切关系。

  • **除了无损之外,请不要推荐“-preset ultrafast”**。质量比“超快”差“很多”,速度几乎没有任何变化。一个好的预设是默认值、“中”或“慢”。如果您想要非常低的 CPU 使用率,那么使用 x264 当前介质可能会获得比 x265 预设“超快”更好的每比特率质量。(特别是在没有 AVX 的旧 CPU 上,x264 通常“快得多”)。使用“ultrafast”完全违背了使用 x265 的目的,但也许“fast”或“faster”对于某些用途来说是可以的。 (3认同)
  • 正是我要找的!很好的选项覆盖范围。你知道如果没有字幕内容,ffmpeg会不会拒绝`c:s copy`? (2认同)

小智 14

我最近遇到了将整个视频目录转码到 HEVC 的麻烦。我使用https://github.com/FallingSnow/h265ize和以下设置。

h265ize -v -m medium -q 20 -x --no-sao --aq-mode 3 --delete --stats

-v - 详细输出
-m medium - 中等编码速度(较小的更高质量,我发现任何较慢的东西都不值得花时间/质量差异)
-q 20 - 使用的 CRF,20 类似于 x264 中的 18 左右,但是嘿。这是针对 1080p 内容(我的电视的 90%)我倾向于将 22 用于我的 4K 电影
-x - 使用 x265 中央定义的命令
--no-sao关闭样本自适应偏移(提高编码速度)--
aq-mode 3 - 使用具有自动变化的自适应量化,帮助 8 位编码,尤其是在黑暗区域,阻止可能发生的大部分条带(虽然会牺牲编码时间)--
删除- 用编码文件替换编码文件(使用前测试) ) --
统计 - 将统计信息写入您运行的路径根目录中的 csv 文件。

我的设备上的编码速度约为 30fps(对于大多数 1080p 内容)。双 Xeon E5 2687W v2,但我强制 FFMPEG 进程不使用其中一个处理器的第一面(这是我的 Plex 服务器,因此必须确保在播放等需要时有转码开销)

是的,转换大部分内容需要一段时间,现在我有一个计划任务,每天运行两次,将当天的内容编码为 x265。

节省的空间是巨大的。我最初的 SAN 使用量为 20Tb,现在大约为 12,但显然已经添加了 6 个月的内容。

我也开始对我所有的电影进行转码,但是,这是一个持续的过程,因为我必须识别质量级别(幸运的是 Radarr 标记然后很好)并使用三个转码设置之一:

-m slower -q 18 -x --no-sao --aq-mode 3720p 转码
-m medium -q 20 -x --no-sao --aq-mode 31080p转码
-m medium -q 22 -x --no-sao2160p

希望能帮助一些人。如果有人需要有人帮忙设置,请大喊大叫。在将所有内容编码为 x265 之前,请考虑播放,如果客户端不支持 x265 本机,则转码在 CPU 和质量方面可能会很昂贵。


Dis*_*ame 5

在 ffmpeg 中为 x265 编码器启用无损模式的正确语法是-x265-params lossless=1(您需要附加=1)。

然而,对于无损编码,有更好的编解码器选择。通过测试,我发现FFV1的压缩效果要好得多(文件大小 = x265 的 ~80%),至少在某些类型的视频上(如果为两种编解码器都选择了最佳设置)。而且它的运行速度也更快,并且(据我所知)不受专利的阻碍。也就是说,它在视频存档的各个方面都优于无损 H.265。然而,妥协是与当前播放软件和硬件的兼容性。