2007年4月23日星期一

ffmpeg,libquicktime,nuke像素格式笔记

NUKE:
nuke的图像数据保存在channel中,我们只需要用到其中的r,g,b三个channel。这三个channel是相互独立的,可以分别从中读取数据,每一次可以读取图像的一行像素。这样看来,最合理的线性存储方式就是每个channel的数据作为一组来保存,即:RRRR...RRRRGGGG...GGGGBBBB...BBBB的形似。

FFMPEG:
ffmpeg支持的编码比较多,如果按照像素格式来分,主要有两类,一类是是RGB,另一类是YUV。对于影像类编码,比如xvid/mpeg4之类,颜色模式只能是YUV,甚至仅仅支持yuv420p这一种。因为要考虑到与nuke相结合,这里只看rgb像素格式中的rgb24。rgb24的线性格式为:RRRR...RRRRGGGG...GGGGBBBB...BBBB,可以很方便的和nuke中的channel数据结合。

ffmpeg提供了一个函数可以在各种像素格式之间转换。yuv420p的Cr和Cb分量只有Y分量大小的一半,因此需要的空间只有rgb24的2/3。

libquicktime:
libquicktime中没有与上面RGB24一致的原始rgb格式,有一种rgb888格式。其线性格式为:RGBRGBRGB...。libquicktime在保存帧的时候也要先将rgb转换为yuv,不过这个过程是自动完成的。

从rgb24到rgb888的转换:


pFrameBufferLinear[y*w*3+3*x] = pFrameRGB_r[Y*w+i]; //R
pFrameBufferLinear[y*w*3+3*x+1] = pFrameRGB_g[Y*w+i]; //G
pFrameBufferLinear[y*w*3+3*x+2] = pFrameRGB_b[Y*w+i]; //B

没有评论: