昨天上完这个星期的最后一节计算机体系结构,因为实在忍受不了学校寝室的闷热,我搬回了家。临近夜幕中的三环,天阴蒙蒙的,不过却是个下雨的好征兆。行驶间天空下起了雨,一颗一颗的水滴穿过车窗打在了我身上。久违的雨啊,在9月成都的闷热中,让我感觉到一丝兴奋。
其实9月的成都也算是个多雨的季节,不过和南京相比,也许就不值得一提了吧。就像成都的我与南京的她一样。
今早醒来,奶奶已经回来了。所以我也开始摸索Xvid的应用。
我不太清楚Xvid与H264在编解码方面的差异,不过今天的我,更愿意看看Xvid的代码,是如何实现的。在网上下了个linux的xvid1.2.2版本,里面自带了一个encraw的例子,今天大部分的时间也用在了对其代码结构的理解上。
对于我这个不懂音视频数据编码的人来说,Xvid是比较复杂的,不过我想,这也是种机遇,因为之前实现过YUV格式的摄像头数据采集与传输,所以养成了个习惯:不管代码内容有多复杂难懂,只关心几个方面,1就是encode前的数据类型与size,2就是encoded过的数据类型与size,3就是参数。粗略看了下,Xvid需要init操作的参数有很多,有些可以通过命名猜到意思,有些让我很费解的就忽略过去。可能我一开始只是想浅尝辄止的缘故,所以我宁愿花更多的时间研究怎样对代码进行移植,而不是注重对程序的优化。
今天收获的Xvid编码流程大概如下:
/*------------------------------------------------------------------------
* XviD core initialization
*----------------------------------------------------------------------*/
xvid_gbl_init_t xvid_gbl_init;
memset(&xvid_gbl_init, 0, sizeof(xvid_gbl_init));
xvid_gbl_init.version = XVID_VERSION;
xvid_gbl_init.cpu_flags = XVID_CPU_FORCE;
/* Initialize XviD core -- Should be done once per __process__ */
xvid_global(NULL, XVID_GBL_INIT, &xvid_gbl_init, NULL);
/*------------------------------------------------------------------------
* XviD encoder initialization
*----------------------------------------------------------------------*/
memset(&xvid_enc_create, 0, sizeof(xvid_enc_create));
xvid_enc_create.version = XVID_VERSION;
/* Width and Height of input frames */
xvid_enc_create.width = 320;(实现的QT程序中视频输出大小)
xvid_enc_create.height = 240;(实现的QT程序中视频输出大小)
xvid_enc_create.profile = XVID_PROFILE_AS_L4; //不清楚什么意思
..........
..........
然后是encode。特别注意的是malloc的内存大小
与之前单纯的YUV转RGB不同,Xvid支持很多种格式到mpeg4或avi的转换,所以可以封装一个简单的视频编码的类以便今后调用。
ps:今天看了零秒出手第9集有点小郁闷...