Handbrake 转换使用硬件编码器失败,正在重试默认软件编码器

你好。我遇到的問題雖然與其他討論相似,但我仍無法理解自己的具體情況,也無從套用先前討論中的資訊。

我有一台相對新的 Windows 10 電腦(6 個月前購入),配備不錯的 CPU(Intel(R) Core™ i7-7700 CPU @ 3.60GHz)與 16 GB 記憶體。
我有兩張顯示卡,皆已安裝最新驅動程式。主顯示卡為 NVIDIA(支援硬體編碼),另一張未使用的 Intel 顯示卡也支援 Quick Sync 與硬體編碼。
下方(與日誌本身)提供了機器與顯示卡的詳細資訊。

在機器閒置時,一段 30 分鐘的 HD 節目使用「MP4 Normal」設定檔編碼約需 22 分鐘。
5 小時的超級盃轉播在相同條件下約 3 小時完成,期間 CPU 使用率長時間接近 100%。

我開始懷疑系統並未以最佳方式運作。雖然兩者並非完全可比,但若我將相同檔案在 Plex 中最佳化至 iOS 最高解析度,轉換時間僅需 MCEbuddy 的一半。

我承認自己並不了解相關設定,且我在大多數日誌中都看到以下錯誤:
Handbrake conversion failed with hardware encoder, retrying with default software encoder

我想請教是否有人能幫我確認編碼流程是否正常運作。
非常感謝任何協助…

此致
BrianGGG

以下為範例日誌檔:

xxxTwo.and.a.Half.Men.S06E24.Baseball.Was.Better.With.Steroids - Copy.ts-Profile Test-2018-02-06T07-47-08.6189349-05-00.log (815.5 KB)

以下為日誌中的幾個重點項目:

2018-02-06T07:51:32 MCEBuddy.AppWrapper.Handbrake → [07:51:32] CPU: Intel(R) Core™ i7-7700 CPU @ 3.60GHz
2018-02-06T07:51:32 MCEBuddy.AppWrapper.Handbrake → [07:51:32] - Intel microarchitecture Kaby Lake
2018-02-06T07:51:32 MCEBuddy.AppWrapper.Handbrake → [07:51:32] - logical processor count: 8
2018-02-06T07:51:32 MCEBuddy.AppWrapper.Handbrake → [07:51:32] Intel Quick Sync Video support: yes
2018-02-06T07:51:32 MCEBuddy.AppWrapper.Handbrake → [07:51:32] - Intel Media SDK hardware: API 1.25 (minimum: 1.3)
2018-02-06T07:51:32 MCEBuddy.AppWrapper.Handbrake → [07:51:32] - H.264 encoder: yes
2018-02-06T07:51:32 MCEBuddy.AppWrapper.Handbrake → [07:51:32] - preferred implementation: hardware (any)
2018-02-06T07:51:32 MCEBuddy.AppWrapper.Handbrake → [07:51:32] - capabilities (hardware): breftype icq+la+i+downs vsinfo opt1 opt2+mbbrc+extbrc+trellis+ib_adapt+nmpslice
2018-02-06T07:51:32 MCEBuddy.AppWrapper.Handbrake → [07:51:32] - H.265 encoder: yes (8bit: yes, 10bit: yes)
2018-02-06T07:51:32 MCEBuddy.AppWrapper.Handbrake → [07:51:32] - preferred implementation: hardware (any)
2018-02-06T07:51:32 MCEBuddy.AppWrapper.Handbrake → [07:51:32] - capabilities (hardware): bpyramid vsinfo opt1

2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → CUDA Device Query (Runtime API) version (CUDART static linking)
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Detected 1 CUDA Capable device(s)
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Device 0: “GeForce GTX 1050”
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → CUDA Driver Version / Runtime Version 9.1 / 7.5
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Detected CUDA Driver version = 9.1
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → CUDA Capability Major/Minor version number: 6.1
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Detected CUDA Hardware version = 6.1
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Total amount of global memory: 2048 MBytes (2147483648 bytes)
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → MapSMtoCores for SM 6.1 is undefined. Default to use 128 Cores/SM
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → MapSMtoCores for SM 6.1 is undefined. Default to use 128 Cores/SM
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → ( 5) Multiprocessors, (128) CUDA Cores/MP: 640 CUDA Cores
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → GPU Max Clock rate: 1455 MHz (1.46 GHz)
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Memory Clock rate: 3504 Mhz
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Memory Bus Width: 128-bit
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → L2 Cache Size: 1048576 bytes
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Maximum Texture Dimension Size (x,y,z) 1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Maximum Layered 1D Texture Size, (num) layers 1D=(32768), 2048 layers
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Maximum Layered 2D Texture Size, (num) layers 2D=(32768, 32768), 2048 layers
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Total amount of constant memory: 65536 bytes
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Total amount of shared memory per block: 49152 bytes
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Total number of registers available per block: 65536
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Warp size: 32
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Maximum number of threads per multiprocessor: 2048
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Maximum number of threads per block: 1024
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535)
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Maximum memory pitch: 2147483647 bytes
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Texture alignment: 512 bytes
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Concurrent copy and kernel execution: Yes with 2 copy engine(s)
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Run time limit on kernels: Yes
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Integrated GPU sharing Host Memory: No
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Support host page-locked memory mapping: Yes
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Alignment requirement for Surfaces: Yes
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Device has ECC support: Disabled
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → CUDA Device Driver Mode (TCC or WDDM): WDDM (Windows Display Driver Model)
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Device supports Unified Addressing (UVA): Yes
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Device PCI Domain ID / Bus ID / location ID: 0 / 1 / 0
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Compute Mode:
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 9.1, CUDA Runtime Version = 7.5, NumDevs = 1, Device0 = GeForce GTX 1050
2018-02-06T07:51:36 MCEBuddy.AppWrapper.NVidiaQuery → Result = PASS
→ Process exited with code 0
→ NVidia H.264 Hardware Encoder Detected : True
→ NVidia H.265 Hardware Encoder Detected : True

你可以尝试调整配置文件,把 ffmpeg 放在首位。我在 0.8 测试版里折腾配置文件时,根本没法让 HandBrake 真正启用硬件加速。供参考,我的 CPU 和内存跟你一样,显卡是 NVIDIA GTX 1060,一小时高清节目用 H265(HEVC)编码大约 20 分钟搞定。

要调整编码引擎顺序,进入 config 文件夹,打开 profiles.config,在 MP4 Normal 配置里找到这一行:
order=handbrake,ffmpeg,mencoder

把它改成 ffmpeg 在最前面。

祝好运!Will。

你的配置相當特別,同時擁有 CUDA(NVIDIA)與 QuickSync(Intel)兩種硬體加速。然而,你的 Intel 驅動程式似乎有問題,導致 HandBrake 在嘗試使用硬體加速時卡住。

2018-02-06T07:51:46 MCEBuddy.AppWrapper.Handbrake → [07:51:46] qsv_enc_init: using ‘hardware (2)’ implementation, API: 1.25
2018-02-06T07:51:47 MCEBuddy.AppWrapper.Handbrake → Error code -17, hb_qsv_wait_on_sync 602
2018-02-06T07:51:47 MCEBuddy.AppWrapper.Handbrake → ERROR: encqsv: MFXVideoENCODE_EncodeFrameAsync failed (-17)

因此 MCEBuddy 退回使用 HandBrake 的軟體編碼,而沒有先嘗試透過 ffmpeg 使用 NVIDIA 硬體加速(未來我們會加入這項最佳化,在切換到軟體編碼前嘗試其他硬體編碼器,主要是因為同時擁有兩家硬體廠商的系統相當罕見)。

解決方法正如 @Will_Tschumy 所說,只要在設定檔中把順序改成 ffmpeg,就能優先使用 NVIDIA 顯示卡進行硬體編碼;若驅動程式沒問題,速度會明顯提升。

附帶一提,你的 Intel 顯示卡可能尚未正確初始化,而 NVIDIA 顯示卡才是主要輸出介面,這可能是 HandBrake 無法初始化 Intel 的原因。如果你想改用 Intel 硬體編碼,可嘗試「假顯示器」技巧來啟用 Intel 顯示卡。

Will,

非常感谢你的回复,这确实是个有用的建议。
有几件事:

我按你说的把 HandBrake 的优先级下调了,但在一次测试中,HB 仍然被选中,尽管它在列表里排第三。

不过,当我把 HB 完全从优先级列表中移除后,系统就改用 FFMPG 了。这是个好结果,因为我能在任务管理器里看到 GPU 被用于解码。CPU 使用率也大幅下降,编码过程不再拖垮整台机器。

我现在唯一的问题是:这就是我能做的全部了吗?30 分钟的高清视频,我现在的转换速度是 12 分钟,和上面 Will 提到的 20 分钟基准差不多,但这并不是 HEVC(只是 H264)。所以我觉得还有优化空间。

另外,我的 GPU 几乎没动,这是不是说明还有多线程的潜力?

下面是用 FFMPEG 作为编码器后的新日志文件(为了节省空间,删掉了大量 MENCODER 的裁剪垃圾信息):

xxxTwo.and.a.Half.Men.S06E24.Baseball.Was.Better.With.Steroids - Copy.ts-Profile Test-2018-02-06T13-05-04.4043705-05-00.log(982.2 KB)

谢谢,
Brian

謝謝 Goose 的回覆。我在發出上一則回覆時收到了你的訊息。

我嘗試過「假顯示器」的技巧,但從網路上看來,在 Windows 10 上要實現這點比想像中困難。網路上的教學並未對應最新版作業系統,我根本無法讓第二台螢幕上線。附帶一提:Intel 顯示卡是我 Dell 機器預設的配備,但我當初加購了升級版 NVIDIA。Dell 出貨時兩張卡都裝了,即便我實際上只把單一螢幕接在 NVIDIA 上。

既然我並未感受到 NVIDIA 硬體加速帶來飛快速度,是否值得繼續嘗試 Quick Sync,理論上它會快很多?

謝謝,
BRianGGG

你的日志显示转换速率约为180fps,这还不错,也许@Will_Tschumy可以分享一下他设备上的数据。

Intel的性能高度依赖驱动和硬件,范围可以从70到600fps。你可以尝试在BIOS里把Intel核显设为首选再试一次。我们会在下个版本里修补该选项,以便当两个编码器都支持硬件加速时,优先使用用户指定的编码器顺序。默认选择带硬件加速的编码器(除非配置另有说明),HandBrake为首选。

FFMpeg 转换日志显示平均转换速率为 12.1 倍(363 fps)。QuickSync 相关的细节实在太多,所以我干脆完全没用它,尽管我的机器支持。不过在转换过程中,CPU 占用完全没有飙升——所有编码都在 GPU 上完成。在分析节目时,CPU 占用大约 50%。

希望对你有帮助。谢谢!Will。

谢谢 Will。

我正想问为什么同样的 CPU 配置会有如此不同的结果,直到我跑了一下下面的 CUDA 基准测试。你的 1060 显卡几乎是我的 1050 的两倍快……

https://browser.geekbench.com/cuda-benchmarks

接下来,我准备把显示器插到 Intel 核显上,看看能不能让 FFMPEG 用它而不是 NVIDIA。我会选最快的那一个来用。

我看过 BIOS,里面选项不多……我甚至找不到怎么把 Intel 设成首选。

BrianGGG

請記住,如果你想用 Intel 的 QuickSync,就必須在設定檔裡使用 handbrake;而要用 Nvidia CUDA 的話,就必須使用 ffmpeg。這是目前唯一支援的組合。

你所說的「config」資料夾要在哪裡找?

在程式資料夾中——對我來說是:
C:\Program Files\MCEBuddy2x\config