我正在尝试将我的视频库转换为 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
我发现--lossless
x265中有一个选项: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 时间格式。
现在逐行:
-hide_banner
防止FFmpeg
在启动时显示构建信息。我只是不想在控制台中向上滚动时看到它;-ss 0
在开始解码输入之前寻找 0 秒。请注意,如果给出此参数后输入文件和前输出文件,它变成输出选项并告诉ffmpeg
解码并忽略输入直到 x 秒,然后开始写入输出。作为输入选项,它不太准确(因为在大多数容器格式中查找并不准确),但几乎不需要时间。作为输出选项,它非常精确,但需要大量时间在指定时间之前解码所有流,出于测试目的,您不想浪费时间;-i "INPUT.mkv"
:指定输入文件;-attach "COVER.jpg"
:在输出中附加封面艺术(缩略图、海报等)。封面艺术通常显示在文件资源管理器中;-map_metadata 0
:复制输入 0 中的所有元数据,在示例中只是输入;-map_chapters 0
:从输入 0 复制章节信息(如果存在);-metadata title="TITLE"
:设置视频标题;-map 0:0 ...
:映射输入0的流0,这意味着我们希望将输入中的第一个流写入输出。由于该流是视频流,因此它是第一个视频流于输出,因此有流说明符:s:v:0
。将其语言标签设置为英语;-map 0:1 ...
:与第8行类似,映射第二个码流(DTS音频),并设置其语言和标题(以便在播放器选择时更容易识别);-map 0:2 ...
:与第9行类似,只不过该流是字幕;-metadata:s:t:0 ...
:设置封面艺术的元数据。这是 mkv 容器格式所必需的;-c:v libx265 ...
:视频编解码器选项。太长了,我把它分成两行。此设置非常适合高质量蓝光视频 (1080p),并且渐变中的条带最小(x265 对此很糟糕)。对于 DVD、电视节目和电话视频来说,这很可能是一种过度杀伤力。这个设置大部分是从这个《毁灭战士9》的帖子;crf=22:...
:视频编解码器参数的延续。参见上面提到的论坛帖子;-c:a copy
:复制音频;-c:s copy
:复制字幕;-t 120
:120秒后停止写入输出,这为我们提供了2分钟的剪辑用于预览转码质量;"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 3
720p 转码
-m medium -q 20 -x --no-sao --aq-mode 3
1080p
-m medium -q 22 -x --no-sao
2160p
希望能帮助一些人。如果有人需要帮忙设置这一切,请大声喊叫。在将所有内容编码为 x265 之前,请考虑播放,如果客户端不支持本机 x265,那么转码在 CPU 和质量方面可能会很昂贵。
答案3
在 ffmpeg 中为 x265 编码器启用无损模式的正确语法是-x265-params lossless=1
(您需要附加=1
)。
然而,对于无损编码,有更好的编解码器选择。我通过测试发现FFV1至少在某些类型的视频上压缩效果要好得多(文件大小 = x265 的 ~80%)(如果为两种编解码器都选择了最佳设置)。而且它的运行速度也更快,并且(据我所知)不受专利的阻碍。也就是说,它在视频存档的各个方面都优于无损 H.265。然而,妥协是与当前播放软件和硬件的兼容性。