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


43

我正在尝试将我的视频库转换为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
--lossless如果文件解码了以前的有损编解码器,然后对它所做的无损解码进行了编码,则实际上可能会放大文件。质量将保持与输入完全相同。
Golar Ramblar

2
如果您的源被编码为有损的(很可能是这样),那么您将无法实现。任何非无损的转码都会进一步降低质量(即使您无法立即看到它们),如果您从有损转换为无损,则文件大小会更大。
Sarge Borsch '18

Answers:


58

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

不确定,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=23x265确定其余的参数,通常情况下它做得很好。

但是,经常在我承诺对视频进行整体转码之前,我会通过转换一小部分相关视频来测试我的设置。下面是一个示例,假设一个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,电视节目和电话视频的滥杀滥伤。该设置大部分是从Doom9帖子中窃取
  13. crf=22:...:视频编解码器参数的延续。参见上面提到的论坛帖子;
  14. -c:a copy:通过音频复制;
  15. -c:s copy:复制字幕;
  16. -t 120:120秒后停止写入输出,这为我们提供了2分钟的剪辑,可预览转码质量;
  17. "OUTPUT.HEVC.DTS.Sample.mkv":输出文件名。我用视频编解码器和主要音频编解码器标记文件名。

ew。这是我的第一个答案,因此,如果有任何遗漏,请发表评论。我不是视频制作专家,我只是一个懒惰的人,懒得将光盘放入播放器来观看电影。

PS。也许这个问题属于别的地方,因为它与Unix&Linux无关。


2
正是我想要的!不错的选择范围。您是否知道如果c:s copy没有字幕内容,ffmpeg是否会大惊小怪?
年长者怪胎

1
@ElderGeek不,如果该选项有效,ffmpeg只会说些什么。
Yifeng Mu

此选项是否生成最小的文件大小,以实现真正无损失的h265编码?如果没有,我有办法吗?
缓冲读取

1
@TheBitByte我不认为h265中有无损压缩级别。对于无压缩选项,它只是--lossless。我徒劳地寻找从h264到h265的无损转换,据我了解,这在数学上是不可能的。
Yifeng Mu

1
实际上,您应该编辑包含--lossless切换到该答案的命令,因为放在那里作为对此问题的答案,这听起来像是您在说这是无损压缩,这具有误导性。
Hashim

8

我最近遇到了将整个视频目录转码到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,x264中的20类似于18左右,但是嘿。这是1080含量(90%我的电视)我倾向于使用我的4K电影22
-x -使用X265中央定义的命令
--no-骚关闭采样自适应偏移(提高编码速度)
--aq模式3-使用具有自动方差的自适应量化功能,帮助8位编码(尤其是在黑暗区域中)停止大部分可能发生的条带化(尽管以编码时间为代价)-
删除 -用编码文件替换编码文件(在使用此文件之前进行测试)-
统计 -将统计信息写到您运行路径的根目录下的csv文件中。

在我的装置上,编码速度约为30fps(对于大多数1080p素材而言)。Dual Xeon E5 2687W v2,但我强迫FFMPEG处理不要使用其中一个处理器的第一面(这是我的Plex服务器,因此如果需要播放等,必须确保转码的开销)

是的,将其中的大部分内容转换了一段时间,现在我有一个计划的任务,该任务每天运行两次,以编码从那天到x265的所有内容。

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

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

-m slower -q 18 -x --no-sao --aq-mode 3用于720p转码
-m medium -q 20 -x --no-sao --aq-mode 3用于1080p
-m medium -q 22 -x --no-sao用于2160p

希望对某些人有所帮助。如果有人需要手动设置,请大喊大叫。并且在将所有内容编码为x265之前,请考虑回放,如果客户端不支持x265本机,那么就CPU和质量而言,交易可能会非常昂贵。


对于x265 2.4及更高版本(使用提供更清晰编码的新lambda表),SAO通常对于每比特率的质量而言是一件好事。它仍会稍有拖影,但会减少其他伪影,使其值得。
彼得·科德斯

-q 20不是CRF 20,而是恒定的QP速率控制。默认和推荐的模式CRF在高复杂度的场景中会提高QP,因此它不会在难以编码的场景上花费过多的位。(如果您想要更接近统一的QP,请qcomp从默认值0.6 提高到0.7或0.8。接近1.0则更接近CQP。)
Peter Cordes

3

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

但是,对于无损编码,有更好的编解码器选择。通过测试,我发现FFV1至少在某些类型的视频上(如果为两个编解码器都选择了最佳设置),压缩效果要好得多(文件大小= x265的80%)。而且它还可以更快地运行,并且(AFAIK)不受专利的限制。也就是说,它在视频存档方面在所有方面均优于无损H.265。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.