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

2007年4月20日星期五

mel笔记 2

把一个locator约束到一个cv点上。
vector $cvpoint=`xform -query -worldSpace -translation curve1.cv[1]`;
locator1.translateX=$cvpoint.x;
locator1.translateY=$cvpoint.y;
locator1.translateZ=$cvpoint.z;
存在的问题:
只有在播放的时候表达式的值才会被更新。

2007年4月17日星期二

Nuke videoWriter参考资源列表

libquicktime:
http://libquicktime.sourceforge.net/doc/apiref/index.html

Multi-Process:
http://linux.chinaunix.net/doc/program/2005-01-27/957.shtml
http://www.linuxforum.net/books/upfaq/book1.htm
http://www.ibm.com/developerworks/cn/views/linux/articles.jsp

FIFO:
http://www.linuxhq.com/guides/LPG/node11.html#SECTION00722000000000000000

Nuke4.6 for linux的video输出插件

第一个测试版终于完成了。
一共两个 程序,videoWriter是nuke的插件,lqt_server是mov编码程序。
依赖关系:
lqt_server依赖libquicktime,而libquicktime依赖ffmpeg,要编译的话,需要先编译安装ffmpeg和libquicktime。
我的libquicktime和ffmpeg都在/opt里,zip里包含的预编译版本都是链接/opt里的libquicktime和ffmpeg。
安装:
编译完成后,将videoWriter.linuxfc4_intel复制到~/.nuke里,lqtEncodeServer复制到/usr/local/bin里。
使用:
创建一个write节点,文件类型选择video,".mov"的输出留给foundry去实现吧。在Total frames设置要输出的总帧数,framerate是帧率。在execute的时候还要输入帧范围,务必使这个帧数和Total frames中设置的相等,否则程序会出错。最后输出的文件是是由ffmpeg_mpeg4编码的mov格式的文件。用libquicktime的qtinfo工具可以看到格式的信息,用mplayer和vlc可以正常播放,但是xine不能。

其它:
videoWriter是在NDK中yuvWriter的基础上改写的,因此继承了yuvWriter类的局限,Total frames参数就是其一。在yuvWriter无法获得序列的总帧数,而视频输出的过程中,这个帧数必须是知道的。在Write类中是可以知道总帧数, yuvWriter并未继承Write类,而是从FileWriter类里继承过来的,也就是说需要从Write类派生出一个新的类才能解决帧数未知的问题。




文件:
http://cobranail.googlepages.com/videoWriter_Nuke.zip

MEL笔记 1

source命令:
Maya的文档上说:“ It is important for advanced MEL users to understand that "source" is not a MEL command.”
在文档中举的几个例子似乎对此也有暗示。根据我的体会,source不接受变量做参数。比如source "mel_file.mel"是可以的,但是如果用这种形式:
string $mfile = "mel_file.mel";
source $mfile;
就会提示语法错误。使用eval似乎也不可以trick。

$gShelfTopLevel变量:
global string $gShelfTopLevel;
这个变量似乎是工具架的默认父级部件,createNewShelf等创建shelf的命令都会将新的shelf添加到这个变量所指的部件之下。

shelf文件:
SaveAllShelves之后,各个工具架上的button都会被保存到mel文件中,里面是一个函数,函数命即为工具架的名称。函数的内容就是一些shelfButton命令。
例如:
global proc Polys () {
global string $gBuffStr;
global string $gBuffStr0;
global string $gBuffStr1;


shelfButton
-enableCommandRepeat 1
-enable 1
-width 38
-height 38
-manage 1
-visible 1
-preventOverride 0
-align "center"
-label "Sphere"
-labelOffset 0
-font "tinyBoldLabelFont"
-image "polySphere.xpm"
-image1 "polySphere.xpm"
-style "iconOnly"
-marginWidth 1
-marginHeight 1
-command "polySphere -r 1 -sx 20 -sy 20 -ax 0 1 0 -cuv 2 -ch 1; objectMoveCommand;"
-sourceType "mel"
-actionIsSubstitute 0
;
}