
我有 950 個 PNG 文件,這些文件旨在成為 38 秒視訊軌道中的各個幀,每秒 25 幀。除了序號之外,檔案名稱是相同的,這是此類情況下的慣例。
我想從這一系列 PNG 圖像中產生一個廣泛支援的格式的容器,如果可以滿足所有標準,最好是 WebM,或者例如 MPEG-4,使用現代瀏覽器支援播放的編解碼器有。問題在於顏色發生了偏移,並且解碼影片中的背景顏色不再與從 PNG 影像中的背景顏色採樣的相同 RGB 三元組相匹配。這會導致影片從嵌入影片的 HTML 頁面上的預期背景中突出。
我嘗試了簡單的:
ffmpeg -f image2 -i image%03d.png output.webm
這確實給了我一個打包在 WebM 容器中的 25 fps VP9 視訊軌道。
PNG 圖像是動畫風格,具有純色背景和簡單的前景動畫形狀。它們看起來有顏色未標記的(這就是 Adobe Bridge 告訴我的,我認為這意味著沒有嵌入的顏色配置文件或對顏色配置文件的引用)。我上述嘗試的問題是,即使在 Chrome 中播放容器,從帶有 RGB 三元組的 PNG 圖像中採樣的背景顏色#ED4D56
在感知上與正在播放的視頻中出現的背景顏色並不匹配。
這是 RGB 到 YUV(編碼)到 RGB(播放)顏色轉換不可避免的副作用嗎?有什麼辦法可以緩解這種情況嗎?我不堅持使用 RGB 對視訊軌道中的幀進行編碼,我認為 YUV 沒問題,只要現代瀏覽器在解碼和顯示視訊時播放這些幀時會產生相同的(誤差範圍可以忽略不計)RGB 三元組。幀。
我的問題是,我可以使用什麼命令列ffmpeg
來嘗試緩解這個問題?我願意切換視訊編解碼器、像素格式、在 ffmpeg 中啟用顏色管理(如果存在)等。
答案1
我最近有一個非常類似的任務,我想說仍然沒有完美的解決方案(截至 2018 年 10 月)。這確實是低精度 RGB 到 YUV 到 RGB 顏色轉換的副作用。libvpx-vp9 -lossless
由於 YUV 色彩空間,甚至某些「無損」編解碼器變體(例如)也會產生扭曲的顏色。
如果不精確的顏色是可以接受的,那麼庫vpx編解碼器可以做得很好:
ffmpeg -r 25 -i image%03d.png -c:v libvpx -crf 4 -b:v 0 output.webm
透過這些設置,它產生的顏色偏移量可以忽略不計,甚至某些幀組的顏色也完全相同。 VPx 編解碼器獲得廣泛支援(除 IE 和 Safari 之外的所有主要瀏覽器)並產生合理的檔案大小。
如果嚴格要求精確的顏色,那麼我們需要避免色彩空間轉換。我想出的唯一跨瀏覽器解決方案是使用動畫 PNG圖片。
ffmpeg
對 apng 僅提供非常基本的支持,因此最好使用其他工具,例如apngasm
:apngasm output.png image001.png 1 25
它可以在 IE 和 Edge 之外的任何地方工作(在那裡它將回退到靜態第一幀)。文件大小巨大,但這就是真正無損編碼的代價。
- 這庫x264rgb也應該提到編解碼器 - 使用它將要 當/如果瀏覽器支援它時,它是編碼精確 RGB 顏色的正確方法。