設定檔 HEVC MP4 產生的檔案比以前大很多

大家好,

大約一個月前,我開始使用「HEVC MP4」設定檔來轉換 WTV 檔案,也重新轉換之前已轉好的 H264 檔案。起初我對結果非常滿意,檔案比預期小很多。這樣的情況持續到我升級 MCEBuddy 到 2.5.5 版,並把顯示卡從 Gigabyte GV-N630D3 換成 Geforce GTX 1650。目前我仍能獲得比使用 H264 設定檔更小的檔案,但體積已不像最初切換到「HEVC MP4」設定檔時那麼小。

舉例:一段 29.25 分鐘的 WTV 影片,我先轉成 205 MB 的 H264 MP4,再用 H265 重新壓縮到 53 MB;但現在只能壓到約 125 MB。三個 MP4 的解析度完全相同,影片品質也幾乎看不出差異。

更奇怪的是,從 H264(MP4 高品質設定檔)轉到 H265(HEVC MP4 設定檔),檔案幾乎沒縮,從 693 MB 只降到 677 MB,以前卻能壓到約 450 MB。

我知道理論上 H264 轉 H265 應該能縮小約 50%,但最初那種巨幅壓縮讓我非常滿意,我希望可以再次達到那樣的節省空間效果。

有人能幫我了解發生了什麼,並解決這個問題嗎?我到底漏了什麼?

非常感謝!!!

請參考我的 MCEBuddy.log

需要的話我很樂意上傳範例檔案。

你之前是不是只用軟體編碼,現在改用 GPU 加速?我之所以問,是因為我第一次做 HEVC 編碼是用軟體,花了好幾個小時,但檔案很小──一部電影才 700 MB 左右。隔天我立刻去買了張能硬解 HEVC 的顯卡,確切型號是 ASUS GeForce 1650,然後重新編碼同一份檔案;雖然還是比 H.264 小很多,卻幾乎是軟體編碼的 2.5 倍大。

我找不到造成這種差異的原因,也從來沒人能給我答案,只是分享我的經驗,聽起來跟你的情況很像。

讓我提醒你 HEVC 的陷阱:如果你的影片有很多極暗場景(例如恐怖片),可能會遇到畫質問題,特別是移動時會出現同心圓狀的光暈,大多在有動作時才看得見,但也不總是如此。你得先測試幾部片,看看這種現象是否會困擾你──對我來說確實會。唯一解決方法是提高畫質。不幸的是,我找不到方法修改 MCEBuddy 的設定檔,所以現在累積了一堆未轉檔的 TS 檔。等我搞定後會再分享。

你说得对。我现在大概明白原因了。

我原本以为硬件加速只是让GPU借出算力来加快编码速度,实际上并非如此。当你用Nvidia GPU进行硬件加速时,你其实是在调用GPU内置的Nvidia编码器。虽然这个编码器比Handbrake快得多,但画质却差一截。换句话说,要达到相近的画质,用硬件加速转出的文件体积会更大。

因此,我们只能在“靠GPU快速编码”和“靠CPU上的Handbrake高质量编码”之间二选一。更强大的显卡竟然无法在坚持Handbrake的前提下帮我们提速,实在令人沮丧。

详见下文了解更多细节:
https://www.techspot.com/article/1131-hevc-h256-enconding-playback/page5.html

以下是我發現可行的 Handbrake 用法。傳入的品質參數在 Handbrake/FFmpeg 軟體編碼與 FFmpeg 硬體編碼之間是相同的,但 Handbrake 的硬體編碼參數卻不同。因此我最終為硬體編碼建立了專屬設定檔。我測試過 NVidia 與 Intel 的硬體編碼,可以告訴你 Intel 表現最好,檔案大小與畫質俱佳,至少在使用 h.265 時是如此。以下是我的設定檔,請依需求自行調整。

我的設定檔如下:

[HEVC MKV Intel]
Description=HEVC in MKV hard set to use Intel.
order=handbrake
DisableEncoderReordering=true
ffmpeg-general=-threads 0
ffmpeg-video=-ss 0 -vf yadif=0:-1:1,hqdn3d -vcodec hevc_qsv -preset slow -crf 26 -vsync 2 -map 0:v -sn
ffmpeg-audio=-acodec ac3 -map 0:a
ffmpeg-audioac3=-acodec copy -map 0:a
ffmpeg-ext=.mkv
ffmpeg-audiodelay=skip
handbrake-general=--decomb --auto-anamorphic --verbose=2
handbrake-video=--start-at duration:0 -e qsv_h265 --encoder-preset quality -q 26
handbrake-audio=--aencoder copy --audio-copy-mask ac3,eac3,truehd,dts,dtshd,mp3,flac --audio-fallback ffac3 -R auto
handbrake-audioac3=--aencoder copy --audio-copy-mask aac,ac3,eac3,truehd,dts,dtshd,mp3,flac -R auto
handbrake-ext=.mkv
handbrake-audiodelay=skip

[HEVC MKV NVidia]
Description=HEVC in MKV hard set to use NVidia.
order=handbrake
DisableEncoderReordering=true
ffmpeg-general=-threads 0
ffmpeg-video=-ss 0 -vf yadif=0:-1:1,hqdn3d -vcodec hevc_nvenc -preset hq -crf 26 -vsync 2 -map 0:v -sn
ffmpeg-audio=-acodec ac3 -map 0:a
ffmpeg-audioac3=-acodec copy -map 0:a
ffmpeg-ext=.mkv
ffmpeg-audiodelay=skip
ffmpeg-UsingHardwareEncoding=true
ffmpeg-DisableSoftwareEncoderFallback=true
handbrake-general=--decomb --auto-anamorphic --verbose=2
handbrake-video=--start-at duration:0 -e nvenc_h265 --encoder-preset hq -q 26
handbrake-audio=--aencoder copy --audio-copy-mask ac3,eac3,truehd,dts,dtshd,mp3,flac --audio-fallback ffac3 -R auto
handbrake-audioac3=--aencoder copy --audio-copy-mask aac,ac3,eac3,truehd,dts,dtshd,mp3,flac -R auto
handbrake-ext=.mkv
handbrake-audiodelay=skip
handbrake-UsingHardwareEncoding=true
handbrake-DisableSoftwareEncoderFallback=true
AllowAllCopyRemuxing=true

你是想建议我换一张支持Intel Quick Sync的新显卡吗?

除了在使用MCEbuddy时选择HEVC MP4配置文件外,我从未单独使用过Handbrake。

我对视频转换的知识框架仍然掌握得不够好,而且我的硬件也相当老旧。考虑到我对转换电视录制的需求相当大,也许我应该投入更多时间和金钱来学习更多关于视频转换的知识,并升级更好的硬件。

我並不是要推薦「買這個、別買那個」,只是把我的測試結果分享出來。我做影片轉檔/電視錄影已經十幾年了,但絕對稱不上專家。目前的系統內建 Intel 內顯(UHD 630),可硬體編碼 h.265 10bit,同時還有一張 RTX 2070。我比較過兩者在相同來源檔下的 h.265 硬體編碼,結果在我的設定與測試條件下,Intel 產出的檔案更小,畫質卻相等甚至更好。畫質見仁見智,而我的眼力已大不如前;手邊沒有 AMD 卡可測,或許 AMD 表現更優也說不定。

你的方向是對的:盡量多學、自己跑測試,找出最適合自己的方案。你會發現自己會不斷微調,只為追求更理想的畫質/檔案大小平衡點。以下是一些入門資源:

https://www.videohelp.com/ 歷史悠久,社群活躍。
Hardware Encoding - MCEBuddy 這裡的硬體編碼論壇也很實用。

多研究 Handbrake 與 ffmpeg,它們是 MCEBuddy 轉檔設定檔的核心。我個人用 Handbrake,只因比較熟悉;ffmpeg 也很強,只是我了解有限。

廣告移除我涉獵不多,但這裡的論壇同樣能提供豐富資訊與指引。

希望對你有幫助。發問別客氣。我閒暇時會盡量在這裡幫忙,但還有許多熱心人也會伸出援手。一個小建議:開啟偵錯記錄,發問時附上轉檔 log,這對釐清 MCEBuddy 的運作狀況非常有幫助。

我更喜欢使用 ffmpeg 而不是 Handbrake,我的测试证明,在相同甚至更高画质下,它生成的文件比 H.264 更小,而且用的是我在 MCEBuddy 里无法生效的设置……这些设置在 FFmpeg Batch AV Converter 里可以正常工作,我还能同时跑 4 个编码任务,系统依旧流畅。如果用 MCEBuddy,我就没法用这些设置,因为没人帮我搞定它们在 MCEBuddy 里的用法;我自己也搞不清 MCEBuddy 是如何把参数传给 GPU 的。MCEBuddy 自带的 HEVC 配置文件不仅画质差,还去交错用软件处理,既拖慢编码速度又占资源,我只能同时跑 2 个任务,系统才不至于卡死。

我在 FFmpeg Batch AV Converter 里用的参数如下:

-c:v hevc_nvenc -c:a copy -preset hq -rc constqp -rc-lookahead 60 -spatial_aq 1 -temporal_aq 1 -nonref_p 1 -cq 26

问题是 FFmpeg Batch 做不到 MCEBuddy 的那些自动化功能,导致很多步骤得手动完成,我没那么多时间和硬盘空间,所以想让这些参数在 MCEBuddy 里生效……除了 -c:a copy,因为 MCEBuddy 会重编码音轨,而 FFmpeg Batch 不会。

下面是我目前用的配置文件,是几个月前 SystemIdleProcess 给我的,我把 ffmpeg 放在最前面,因为 Handbrake 太吃资源:

[HEVC MKV AnyStream NVidia]
Description=HEVC in MKV hardset to use NVidia.
order=ffmpeg,handbrake
DisableEncoderReordering=true
ffmpeg-general=-threads 0
ffmpeg-video=-ss 0 -vf yadif=0:-1:1,hqdn3d -vcodec hevc_nvenc -preset hq -crf 26 -vsync 2 -map 0:v -sn
ffmpeg-audio=-acodec ac3 -map 0:a
ffmpeg-audioac3=-acodec copy -map 0:a
ffmpeg-ext=.mkv
ffmpeg-audiodelay=skip
ffmpeg-UsingHardwareEncoding=true
ffmpeg-DisableSoftwareEncoderFallback=true

这个配置文件最大的问题是 hevc_nvenc 之前的所有参数都是软件滤镜,跑在 CPU 上,效率低,其实可以让 GPU 处理。另一个问题是 -crf 26 也是软件参数,GPU 根本不理,所以我猜这个配置里 nVidia GPU 用的是默认设置。

我试过把 -crf 26 改成硬件用的 -cq 26,结果画质没变化;再把 -cq 值调得更低,依旧没区别,我完全搞不懂 MCEBuddy 是怎么把参数传给 GPU 的,怎么改都没用。

我还试过直接把 FFmpeg Batch 里的那串参数(去掉音频部分)整行贴到 MCEBuddy 的 ffmpeg-video 里,结果编码出来的文件只有声音,画面全黑……所以我真的不知道怎么把参数正确传给 GPU。

我现在不知道该怎么办。相比其他软件,我更喜欢 MCEBuddy,但它默认的 HEVC 硬件加速配置在暗场景多的片子里完全不能用,而我有很多恐怖片。因此这几个月我基本没再编码,只敢拿几部知道不会出问题的片子做实验。我得把所有 TS 原片留着,直到能在 MCEBuddy 里用上自己的参数,可硬盘空间快没了,也买烦了硬盘,可能最后只能放弃 MCEBuddy,因为压根找不到如何修改硬件加速设置的文档。

如果你打开转换日志,它会显示传递给 ffmpeg 的确切命令行。如果你使用的是特殊版本/构建的 ffmpeg,你总可以替换掉 MCEBuddy 安装目录中自带的版本。

如果你正在创建一个高度自定义的 ffmpeg 视频和音频参数版本,并且不希望 MCEBuddy 对它们进行任何调整(MCEBuddy 会根据你在“转换任务”页面中设置的配置,如“质量滑块”、“优化视频”、“音轨选择”等来调整它们),你可以通过以下两个 ffmpeg 指令告诉 MCEBuddy 保持你的配置文件参数不变(其他编码器同理):

你几乎可以用 MCEBuddy 做任何事,我强烈建议你查看这个页面来调整设置:MCEBuddy - Advanced Settings, Commands and Tweaking

謝謝你,goose,我會先研究一下,看看能做些什麼。我只是不知道該把命令放在哪裡,因為編輯設定檔似乎幾乎沒有效果,我覺得我做錯了……所以很可能還會再回來請教。再次感謝,我真的不想放棄 MCEBuddy,因為它能滿足我所有需求,但我現在走到了一個岔路口,必須自行客製化才能讓它符合我的需求。

在转换日志中查找文本“Launching process”。该文本会在日志中出现多次,但要找到真正执行转换任务的那一条。其下方会显示传入的参数。如果参数与你的配置文件不符,说明配置未被正确应用。

我仍在用 ffmpeg 把暗场景转成 hevc。我觉得现在的配置文件还行,但体积缩得还不够,不太划算。不过用 NVidia 硬件加速时大约能跑到 160 fps。等我把配置文件调得更好、把参数研究得更透之后再发出来。ffmpeg 真是个庞然大物。

MCEBuddy 無法配合我的設定運作。我甚至把它升級成我在 FFmpeg Batch AV Converter 裡用的同一版 ffmpeg,結果還是一樣。我得到音訊和字幕,但沒有影像。下面這行 profile 把參數傳給 ffmpeg,我在 MCEBuddy 裡用……不成功,但在 FFmpeg Batch 裡卻正常;其實從 hevc_nvenc 後面的內容就是我平常在 Batch 裡用的,只是會再加 copy subs 和 copy audio。

ffmpeg-video=-ss 0 -vf yadif=0:-1:1,hqdn3d -vcodec hevc_nvenc -preset hq -rc constqp -rc-lookahead 60 -spatial_aq 1 -temporal_aq 1 -nonref_p 1 -cq 26

試試這個,打開開始選單並啟動 MCEBuddy 命令列引擎,然後再試試你的設定檔(別忘了把 @Goose 上面提示的內容加到你的設定檔裡,這樣才能保留你的設定)。某些驅動程式不支援透過系統程序(服務)進行硬體編碼,它們偏好使用者程序,而命令列引擎所做的就是在使用者空間而非服務(系統空間)中執行引擎。

RBoy……我实在搞不定,如果每次编码都得去敲命令行,那我宁愿把 MCEBuddy 甩在后视镜里。既然 MCEBuddy 能从命令行跑我的配置,没理由在 GUI 里不行。我用的全是 ffmpeg 官方 nvenc 支持的参数。

没人肯正面回答:MCEBuddy 到底怎么把参数传给 GPU?配置文件里清一色全是软件编码指令,没一条跟硬件相关。所以点“硬件加速”时,我猜它只是把 ffmpeg 或 handbrake 的默认值甩出来——这对追求画质的人来说等于没用。我不想用那些莫名其妙的滑块,我要的是我自己验证过的参数。

SystemIdleProcess 给我的配置(只贴 ffmpeg 视频行):

ffmpeg-video=-ss 0 -vf yadif=0:-1:1,hqdn3d -vcodec hevc_nvenc -preset hq -crf 26 -vsync 2 -map 0:v -sn

-crf 26 仅软件有效,我把它换成正确的 -cq 26 后,画面有变化,但画质还是不够。可在 FFmpeg Batch 里直接跑:

-c:v hevc_nvenc -c:a copy -preset hq -vf yadif=0:-1:1 -rc constqp -rc-lookahead 60 -spatial_aq 1 -temporal_aq 1 -nonref_p 1 -cq 26

画质就完美,却享受不到 MCEBuddy 的其他便利。于是我把这条写进 profile.config:

ffmpeg-video=-c:v hevc_nvenc -preset hq -vf yadif=0:-1:1 -rc constqp -rc-lookahead 60 -spatial_aq 1 -temporal_aq 1 -nonref_p 1 -cq 26

结果出来的文件只有音频,视频直接消失。

所以 @Goose,不管你把文档甩给我多少次,我要的信息要么不在,要么我根本看不懂。你总说 MCEBuddy 啥都能干,可你就是不肯告诉我怎么把我贴过 N 遍的参数原样塞进去。我就这点要求,只想继续用 MCEBuddy——我喜欢它,所以才付费。可现在 3 个月过去,12 TB 的 TS 文件越堆越高,我却因为没人肯花两分钟回一句能用的答案而卡死。

拜托……就给我五分钟,给我一个真正能跑的答复。

@Ronstang 我目前有一大批佇列正在處理,但一有時間我就會試著幫你解決這個問題。你能提供最後一次失敗的轉換紀錄嗎?另外,請告訴我你使用的是哪一款 GPU 以及驅動程式版本。我會盡力幫你搞定。

好消息是我能重現這個問題,壞消息是我還不知道原因。

试试这个:

ffmpeg-video=-c:v hevc_nvenc -preset hq -vf yadif=0:-1:1 -rc constqp -rc-lookahead 60 -spatial_aq 1 -temporal_aq 1 -nonref_p 1 -cq 26 -map 0:v -sn

问题出在缺少 map 参数;当音频被映射而视频没有时,输出里就只剩音频了。

我测试用的配置如下:

[HEVC MKV ffmpeg NVidia]
Description=HEVC in MKV using ffmpeg hardware NVidia.
order=ffmpeg
DisableEncoderReordering=true
ffmpeg-general=-threads 0 -v verbose
ffmpeg-video=-c:v hevc_nvenc -preset hq -vf yadif=0:-1:1 -rc constqp -rc-lookahead 60 -spatial_aq 1 -temporal_aq 1 -nonref_p 1 -cq 26 -map 0:v -sn
ffmpeg-audio=-c:a ac3 -map 0:a
ffmpeg-audioac3=-c:a copy -map 0:a
ffmpeg-ext=.mkv
ffmpeg-audiodelay=skip
ffmpeg-UsingHardwareEncoding=true
ffmpeg-DisableSoftwareEncoderFallback=true

我犯了个错误,SystemIdleProcess……去交错滤镜应该紧跟在硬件参数设置之后,所以应该是:

ffmpeg-video=-c:v hevc_nvenc -vf yadif=0:-1:1 -preset hq -rc constqp -rc-lookahead 60 -spatial_aq 1 -temporal_aq 1 -nonref_p 1 -cq 26

yadif 必须放在最前,因为它是解码器参数,其余都是编码器参数。

我使用的是 Asus GTX 1650 Super,驱动版本 456.71。

試試這個設定檔:

[HEVC MKV ffmpeg NVidia]
Description=使用 NVidia 硬體的 ffmpeg HEVC MKN 編碼
order=ffmpeg
DisableEncoderReordering=true
ffmpeg-general=-threads 0 -v verbose
ffmpeg-video=-c:v hevc_nvenc -vf yadif=0:-1:1 -preset hq -rc constqp -rc-lookahead 60 -spatial_aq 1 -temporal_aq 1 -nonref_p 1 -cq 26 -map 0:v -sn
ffmpeg-audio=-c:a ac3 -map 0:a
ffmpeg-audioac3=-c:a copy -map 0:a
ffmpeg-ext=.mkv
ffmpeg-audiodelay=skip
ffmpeg-UsingHardwareEncoding=true
ffmpeg-DisableSoftwareEncoderFallback=true

我应该把命令放在哪里

ffmpeg-VideoOptimized=True

放在結尾就可以了。我沒有把它放進去,是因為我想要進行裁切。我兩種方式都測試過,比較喜歡把它拿掉。