mch
1
你們過去曾提過沒有 AMD 硬體可供測試,所以我自行測試。我把 ffmpeg/ffprobe 換成 Zeranoe nightly 的版本,並複製了一份 MKV Normal 設定檔,將影片編碼器從 x264 改成 h264_vce。
我的來源是 HDHomeRun Prime 的 30 分鐘電視節目,用軟體轉檔完全正常。除了指定不同的編碼器給 ffmpeg 外,我沒有改動複製的 MKV Normal 設定檔任何其他設定。
第一個最明顯的結果是影片檔無法播放:
檔案在 MediaInfo 中能被正確辨識(VCE 編碼器、長度等),但在我使用的播放器中卻是損毀/無法播放。VLC 拒絕播放,並跳出警告「Cannot get block EOF?」。Plex 常常會立即退出檔案,之後雖然能播放,但無法續播。似乎與告訴播放器檔案長度的時間戳記有關,但 MediaInfo 卻能正常讀取。
第二個大變化是記錄檔變得巨大:
記錄檔高達 22MB,而軟體轉檔通常不到 2MB。我已將記錄檔上傳這裡供檢視。內容大多是軟體轉檔時不會出現的大量裁切操作。
總之,我會盡力協助,但目前卡住了。希望能讓這與 VLC/Plex 相容,並減少巨大的記錄檔?
Goose
(Goose)
2
日誌看起來正常,就連最終輸出的影片也沒問題:
2018-05-26T13:04:38 MCEBuddy.AppWrapper.Base → Stream #0:0: Video: h264 (Main), yuv420p(tv, progressive), 1920x1072 [SAR 1:1 DAR 120:67], 29.97 fps, 29.97 tbr, 1k tbn, 60 tbc (default)
我建議換一台電腦,用像 Windows Media Player 這種基本播放器試播,排除播放端解碼器的問題。
如果還是不行,那就是 ffmpeg 的問題,你可以考慮回報給那邊的開發者分析。
另外,我會先試著在 profile 與 MCEBuddy 裡用更簡單的選項,找出在哪裡出錯後再回報給 ffmpeg。
試試看這個 profile:
[AMD Test]
Description=AMD Test
order=ffmpeg
ffmpeg-general=-threads 0
ffmpeg-video=-ss 0 -vcodec h264_amf -b 1000k -map 0:v -sn
ffmpeg-audio=-acodec ac3 -ab 128k -map 0:a
ffmpeg-audioac3=-acodec ac3 -ab 160k -map 0:a
ffmpeg-ext=.mp4
ffmpeg-audiodelay=skip
PreConversionCommercialRemover=true
AutoDeinterlace=false
SkipCropping=true
ffmpeg-UsingHardwareEncoding=true
這基本上關閉所有進階選項(包含裁剪),並告訴 MCEBuddy 不要調整任何影片設定,因為它們已針對硬體編碼最佳化。
如果這樣可行,你就可以一次加回一個選項,看看哪個會出錯(例如先啟用裁剪,再移除硬體編碼選項,然後加回 x264opts 等)。
mch
3
你給我的程式碼運作正常,很快就產生了一個檔案,甚至能在 VLC 中順利播放,並產生了一個簡短的(700K)日誌。
於是我把容器類型改成 VLC。得到的檔案可以在 Windows Media Player 播放,但 VLC 卻無法播放。接下來幾天我會再做一些測試,不過初步看來,這個方法確實可行,但對 MP4 檔案的相容性最好,對 MKV 則較差。
mch
5
两个配置文件都能正常播放视频,但第二个在 VLC 中产生了大量关于音频时间戳和丢失毫秒数据的警告。观众看来第二个视频似乎完全没有音画不同步(虽然我跳着时间线浏览,并未完整观看),而第一个视频在播放器日志里“风平浪静”,显然更理想。
我已选用第一个配置文件,把码率提到 1400,并启用了 AutoDeinterlace(我在录制电视,以便在没有硬件解码器的设备上串流)。这将作为我近期日常使用的设置。不过,如果你需要我做其他测试,请告诉我。我主要用 Cartoon Network 的 15 分钟剧集做测试,虽然平时不会用 HEVC 等编码,但帮你们跑些测试完全没问题。希望以后某个测试版能把 AMD 直接加到“硬件编码”复选框里,而不用手动建自定义配置文件。
Goose
(Goose)
6
嗯,這可能可以解釋原因,你能貼出你正在使用的設定檔嗎?
mch
7
嗨,我现在用的是你之前给我的一个修改版,目前看起来是这样:
[AMD Test MKV]
Description=AMD Test MKV
order=ffmpeg
ffmpeg-general=-threads 0
ffmpeg-video=-ss 0 -vcodec h264_amf -b 1400k -map 0:v -sn
ffmpeg-audio=-acodec ac3 -ab 128k -map 0:a
ffmpeg-audioac3=-acodec ac3 -ab 160k -map 0:a
ffmpeg-ext=.mkv
ffmpeg-audiodelay=skip
PreConversionCommercialRemover=true
AutoDeinterlace=true
SkipCropping=true
ffmpeg-UsingHardwareEncoding=true
我开这个帖子时,用的是“MKV Normal”的副本,只是把编码器换了。那就是导致文件损坏并出现EOF错误的原因。
我觉得还有些文件是在别的程序(A’s、StaxRip等)里用AMD硬件编码转码后,再让MCEBuddy直接跑comskip/重命名时损坏的,也出现了类似的EOF错误。我曾短暂用过一个折中办法:让MCEBuddy先跑一遍,把未压缩的.ts做comskip,然后丢给A’s转码,最后移动/重命名转好的文件;但我不想这么复杂,就想简化到一个程序里。自打ffmpeg 4.0正式版出来后,我就一直想在MCEBuddy里把它弄好。
看来我的问题出在配置文件?可我不是ffmpeg CLI高手,不知道怎么写能用的配置。把自带的ffmpeg换成4.0很简单,但ffmpeg-video那行里一堆x264参数我根本看不懂,即使把那行x264参数全删掉,文件还是不稳定。而你给的配置就能正常出片。
Goose
(Goose)
8
好的,我们快要找出哪个参数与AMD不兼容了,试试这个配置文件:
[MP4 AC3 AMD]
Description=主配置,高质量1次MP4(H.264/AC3)转换,使用AMD AMF
order=ffmpeg
ffmpeg-general=-threads 0
ffmpeg-video=-ss 0 -vf yadif=0:-1:1,hqdn3d -vcodec h264_amf -b 1400k -x264opts me=hex:trellis=1:subq=8:partitions=all:8x8dct=1:ref=3:rc-lookahead=50:keyint=25:min-keyint=20:bframes=1:weightb=1:level=4.0:b-pyramid=normal:direct=auto:mixed-refs=1:deblock=-1,-1:no-fast-pskip=1:no-dct-decimate=1:b-adapt=0:threads=auto -map 0:v -sn
ffmpeg-audio=-acodec ac3 -ab 128k -map 0:a
ffmpeg-audioac3=-acodec ac3 -ab 160k -map 0:a
ffmpeg-ext=.mp4
ffmpeg-audiodelay=skip
PreConversionCommercialRemover=true
AutoDeinterlace=true
SkipCropping=true
ffmpeg-UsingHardwareEncoding=true
Goose
(Goose)
9
如果您使用的是 AMD 顯示卡,請嘗試今天的 2.5.1 BETA 版本,它現在支援自動偵測 NVidia(CUDA/NvEnc)、Intel(QuickSync)和 AMD(AMF/VCE)硬體,並自動啟用硬體加速。