将 60i 转换为 60p

嗨,我使用 Plex 透過 HDHomeRun 錄製 OTA 節目,並成功讓 MCEBuddy 自動轉檔。但有一個環節讓我卡關很久。

對於以 1080i60 播出的節目,MCEBuddy 會把它當成 29.97 fps 處理(技術上沒錯,但每秒其實有 60 個場,這會影響時間解析度)。結果無論我用哪個設定檔或編碼器,輸出都是 1080p30。問題是,理論上我應該可以用 bob 或 yadif 去交錯,得到保留 60p 時間解析度的 1080p60 檔案。Plex 和我的電視就是這樣把原始 .ts 檔流暢地顯示成 60p,效果很棒。

我單獨用 Handbrake 就能匯出這種檔案,所以技術上可行。

我甚至在「進階設定」手動指定 59.94 fps,結果輸出還是 29.97 fps。有辦法讓 MCEBuddy 根據每秒「場」數而非來源檔的「幀」數來決定輸出幀率嗎?或者有其他變通方法能讓我得到對應的輸出?謝謝。

這是個有趣的話題,我想我找到問題所在了。

我認為「問題」在於 MCEbuddy 選擇了 Handbrake 作為編碼程式,而 MCEbuddy 把你在 GUI 裡設定的幀率傳給 Handbrake 的方式,是加上命令列參數 -r 59.94

使用 -r 參數時,預設行為是設定「峰值幀率」,所以它告訴 Handbrake 不要超過 59.94 fps,而非強制鎖定。結果它通常會選到 29.xx 左右…

因此,有幾種解法:

  1. 別用 Handbrake(爛選項)
  2. 改用預設設定檔,把 ffmpeg 的優先順序調得比 Handbrake 高(也不理想)
  3. 在設定檔的 handbrake-general 尾巴加上 --cfr(最佳選項)

以選項 3 為例,在 profiles.conf 裡的 [mp4 normal]:

handbrake-general=--decomb --loose-anamorphic --verbose=2 -f mp4 -O 

改成

handbrake-general=--decomb --loose-anamorphic --verbose=2 -f mp4 -O --cfr

你可以快速驗證:改用 ffmpeg 優先的設定檔,例如 [DivX AVI Normal],並在 GUI 裡設 59.94,它就會走 ffmpeg。
我的結果如下:

Video
ID                                       : 1
Format                                   : xvid
Codec ID                                 : xvid
Duration                                 : 26 s 994 ms
Bit rate                                 : 1 826 kb/s
Width                                    : 1 920 pixels
Height                                   : 1 072 pixels
Display aspect ratio                     : 16:9
Frame rate                               : 59.940 (60000/1001) FPS
Scan type                                : Progressive
Bits/(Pixel*Frame)                       : 0.015
Stream size                              : 5.87 MiB (87%)

說明部分直接引用 HandbrakeCLI 文件:

   -r, --rate <float>      Set video framerate
                       (5/10/12/15/20/23.976/24/25/29.97/
                       30/48/50/59.94/60/72/75/90/100/120
                       or a number between 1 and 1000).
                       Be aware that not specifying a framerate lets
                       HandBrake preserve a source's time stamps,
                       potentially creating variable framerate video

--vfr, --cfr, --pfr     Select variable, constant or peak-limited
                       frame rate control. VFR preserves the source
                       timing. CFR makes the output constant rate at
                       the rate given by the -r flag (or the source's
                       average rate if no -r is given). PFR doesn't
                       allow the rate to go over the rate specified
                       with the -r flag but won't change the source
                       timing if it's below that rate.
                       If none of these flags are given, the default
                       is --pfr when -r is given and --vfr otherwise

最後,我不確定「直接把幀率翻倍」真的是你要的。如果影片已經去交錯成 30fps,再硬拉到 60 其實沒意義,可能只是重複影格。我認為你真正該動的是去交錯設定。

根據我粗淺的理解,加上 Plex、decomb、yadif 的差異:

Example
60i fps,3 秒內的影格:

ABCDEFGH  

30p fps,3 秒內的影格:

ACEG  

60p fps,3 秒內的影格,透過 -r 59.94 -cfr 翻倍後:

AACCEEGG  

上面 30p 與 60p 對人眼應該沒差,因為只是重複影格?

真正要的是
60i fps:

ABCDEFGH  

60p fps:

ABCDEFGH  

想達到這效果,我認為 得改去交錯參數。
參考:Yadif deinterlace

MCEbuddy 裡 yadif 設定永遠是:

yadif=0:-1:1  

Handbrake 則用:

--decomb (default decomb settings / no preset)

文件說明:

    --decomb[=string]   Deinterlace video using a combination of yadif,
                       blend, cubic, or EEDI2 interpolation.

                       Presets:
                           bob
                           eedi2
                           eedi2bob  

decomb 會先判斷是否需要去交錯,需要的話再自動挑最佳方法,所以預設狀態下加倍幀率應該有幫助,但能否達到你想要的「每個場都保留」效果,可能得改用

--decomb=bob  

?這就得自訂設定檔,且可能會被 MCEbuddy 的自動偵測影響。

一個簡單測試:在 Handbrake GUI 裡分別用 decomb 預設與 decomb=BOB 並強制幀率,看看能否看出差異。

非常感謝。我看到你之前的貼文,最後也得出和你相同的結論。要讓 Handbrake GUI 播放順暢的訣竅,的確是開啟 Decomb 並設為 Bob。我甚至不需要指定幀率;它自己就會處理好。

我剛剛修改了「MKV Normal」設定檔,並在其中加入 decomb=bob:

handbrake-general=--decomb=bob --detelecine --loose-anamorphic --verbose=2 -O

我其實希望完全不需要加上 -cfr,因為 GUI 版本裡並不需要。理想情況下,這個預設也能對 24 fps 拍攝的節目做 detelecine,所以我正試著只用一個設定檔,就讓 MCEBuddy 永遠輸出與原始素材相符的檔案。

我現在正在測試檔案上跑,跑完後會再回報。再次感謝。

太好了!从你的帖子来看,你似乎已经接近答案了,这让我有点困惑,但当我仔细看后,发现其实更微妙一些。

你注意到
1080i60 → 1080p30

1080i60 → 1080p60 --decomb / --decomb bob
之间有区别吗?

挺好奇的,我可能会研究一下,以前从没想过这个问题。

刚完成测试,效果非常棒。开启 --decomb 后我确实注意到差异,动作比 1080p30 流畅得多。输出文件现在与输入文件在视觉上无法区分。(这可能也是因为文件大小翻倍,所以码率/质量是接下来要解决的问题……)

很高興你解決了,因為我也遇到同樣的問題。使用這個方法時,還需要在「專家設定」裡指定 59.94 fps 嗎?

我試過使用 handbrake-general=--decomb=bob --detelecine --loose-anamorphic --verbose=2 -O,但沒成功。

結果得到的是斷斷續續的 30fps 幀率。我也放棄了對影片進行去交錯處理的想法,只想用 MCEBuddy 剪掉廣告,但現在連這個也做不到了。

  1. 任何組合的 AutoDeinterlace=falseffmpeg-VideoOptimized=truehandbrake-VideoOptimized=true 搭配任何預設設定檔,都無法保留我的 60 fields per second 交錯式影片。

  2. 使用 MP4 Unprocessed 同樣無法保留 fields per second,最終得到的是 1080i30 的斷續影片。

我現在真的不知道該怎麼辦了,需要一些建議!