2014-03-19 97 views
1

我目前正試圖在FFMPEG上使用H264對RGB24文件進行無損壓縮。然而,在H264壓縮(RGB24 - > YUV444)中使用的色彩空間轉換已被證明是有損的(我猜是由於量化誤差)。 還有什麼我可以使用(例如程序)在無損H264壓縮他們之前,無損地將RGB24文件轉換爲YUV?無損RGB24到YUV444轉換

最終目標是壓縮一個RGB24文件然後解壓縮它,解壓縮文件與原始文件完全匹配。例如RGB24-> YUV444->壓縮的YUV44->解壓縮的YUV444-> RGB24。

這是可能的嗎?

+0

編碼器'libx264rgb'可能是有用的,如果你想保持在RGB。 – LordNeckbeard

+0

這是一個好主意!我沒有意識到ffmpeg有這個選項。感謝堆! – Squid

回答

2

這是我的答案在這裏複製/粘貼: RGB-frame encoding - FFmpeg/libav

讓我們看看色彩空間轉換。

void YUVfromRGB(double& Y, double& U, double& V, const double R, const double G, const double B) 
{ 
    Y = 0.257 * R + 0.504 * G + 0.098 * B + 16; 
    U = -0.148 * R - 0.291 * G + 0.439 * B + 128; 
    V = 0.439 * R - 0.368 * G - 0.071 * B + 128; 
} 

,並插入一些虛擬值:

R = 255, G = 255, B = 255 
Y = 235 

R = 0, G = 0, B = 0 
Y = 16 

正如你可以看到,0範圍 - > 255壓扁至16 - > 235。因此,我們已經表明,有一些顏色(數字)YUV色彩空間中不存在的RGB色彩空間。因此,定義上的轉換是有損的。

+0

我明白你的意思了,我以爲JPEG2000使用YUV色彩空間,但它是完全可逆的,因此我認爲可能有辦法。謝謝你清理那個。 – Squid

+0

我在這裏使用的係數來自ITU-R BT.601標準。高清電視使用ITU-R BT.709。 JPEG使用ITU-R BT.2020,我認爲其中一個是無損的(但我從來沒有完成所有的數學工作來確認)。 – szatmary

+0

您可以嘗試在x264中使用ITU-R BT.2020。我不確定會發生什麼。我將不得不測試有一天:) – szatmary