以 x265 (HEVC) 重新编码视频库,不会造成质量损失

以 x265 (HEVC) 重新编码视频库,不会造成质量损失

我正在尝试将我的视频库转换为 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

现在,大多数视频都可以很好地转换,并且质量与以前相同。然而,一些质量非常高的视频(例如,一部 5GB 的电影拷贝)会失去质量——视频全部像素化。

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

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

更新1

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

avconv -i input.mp4 -c:v libx265 -x265-params crf=23 -c:a copy output.mp4

然而,问题在于,对于某些视频,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

答案1

根据我自己的经验,如果您希望绝对不损失质量,那么您需要的就是无损。

不确定,avconv但您输入的命令看起来与我使用的命令相同FFmpeg。您FFmpeg可以像这样传递参数:

ffmpeg -i INPUT.mkv -c:v libx265 -preset ultrafast -x265-params lossless=1 OUTPUT.mkv

大多数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"

请注意,反斜杠表示长命令中的换行符,我这样做是为了帮助我跟踪复杂 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 ...:视频编解码器选项。太长了,我把它分成两行。此设置非常适合高质量蓝光视频 (1080p),并且渐变中的条带最小(x265 对此很糟糕)。对于 DVD、电视节目和电话视频来说,这很可能是一种过度杀伤力。这个设置大部分是从这个《毁灭战士9》的帖子;
  13. crf=22:...:视频编解码器参数的延续。参见上面提到的论坛帖子;
  14. -c:a copy:复制音频;
  15. -c:s copy:复制字幕;
  16. -t 120:120秒后停止写入输出,这为我们提供了2分钟的剪辑用于预览转码质量;
  17. "OUTPUT.HEVC.DTS.Sample.mkv":输出文件名。我用视频编解码器和主要音频编解码器标记我的文件名。

呼。这是我的第一个回答,如果有什么遗漏的地方请留言。我不是视频制作专家,我只是一个懒得把光盘放入播放器看电影的人。

附言。也许这个问题属于其他地方,因为它与 Unix 和 Linux 没有很强的相关性。

答案2

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

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

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

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

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

节省的空间是巨大的。我最初的 SAN 使用量为 20Tb,现在约为 12Tb,但显然也增加了 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 和质量方面可能会很昂贵。

答案3

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

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

相关内容