H.265是好文明

H.265被认为不仅能提升影响的品质,还能达到H.264两倍的压缩率,换句话说就是同样的画面品质下码率减少到了50%。这么棒棒的编码怎么能用呢?马上就把珍藏的DVR转码成H.265储存吧!
(绝对不是因为视频太大买不起新硬盘储存什么的)

我现在个人的需求是将使用 Nvidia GeForce Experience 中 Instance replay 功能所录制出来的影片转码为HEVC来储存。
经过我多次尝试,使用CPU来转码,CRF给到18就能在空间和画质上获得比较平衡的体验。
那么我所使用的指令是

ffmpeg -i <filename> `
  -c:a copy `
  -c:v libx265 `
  -crf 18 `
  output.mp4

如果觉得CPU转码花费的时间太长的话,可以使用显卡来转。
若使用显卡,相同的CRF参数下转出来的影片,画面品质没有CPU转出来的好。
原因可以参考这篇文章

使用Nvidia的显卡转码之前,首先要确保驱动和cuda库已经被正确安装。
可以运行ffmpeg -hwaccels看看。如果 Hardware acceleration methods 下面有cuda,那就是没有问题的。

使用老黄的显卡转码的指令是

ffmpeg.exe -vsync 0 `
  -hwaccel cuvid `
  -c:v h264_cuvid `
  -i <filename> `
  -c:a copy `
  -c:v hevc_nvenc -crf 18 `
  output.mp4

显然使用显卡压的没有CPU压的画面素质那么好
下面三张图片可以看得出,显卡把阿茂衣服上的纹理、远处房顶的纹理和左边岩石上的纹理都压糊了。
但架不住显卡速度快

原始文件:
原始文件

CPU压的:
使用CPU

GPU压的:
使用GPU


糊了一个powershell脚本,能把当前目录,包括子目录,中的.mp4文件都转码,然后放进当前目录下的HEVC目录中。
把下面代码复制保存成.ps1文件,和.mp4文件放在一起运行就好了。

用CPU的版本

$originalVids = Get-ChildItem *.mp4 -Recurse
mkdir HEVC

foreach ($inputVid in $originalVids) {
    $outputVid = ($inputVid.FullName, '.mp4')
    $name = $PSScriptRoot + "\HEVC\" + (Get-Item $outputVid).basename + '.mp4'
    # $name => DEST FILENAME
    ffmpeg.exe -i "$inputVid" -c:a copy -c:v libx265 -crf 18 "$name"
}

用GPU的版本

$originalVids = Get-ChildItem *.mp4 -Recurse
mkdir HEVC

foreach ($inputVid in $originalVids) {
    $outputVid = ($inputVid.FullName, '.mp4')
    $name = $PSScriptRoot + "\HEVC\" + (Get-Item $outputVid).basename + '.mp4'
    # $name => DEST FILENAME
    ffmpeg.exe -vsync 0 -hwaccel cuvid -c:v h264_cuvid -i "$inputVid" -c:a copy -c:v hevc_nvenc -crf 18 "$name"
}