查看: 2668|回复: 5

osg保存AVI视频时image->data()异常

[复制链接]

该用户从未签到

发表于 2012-3-14 09:37:03 | 显示全部楼层 |阅读模式
通过rtt渲染出图片以后,写入avi视频文件中,通过下述语句

AVIStreamWrite( m_pStreamCompressed, WriteCt, 1, (LPBYTE)(image->data()), BitmapHeader.biSizeImage, AVIIF_KEYFRAME, NULL, NULL ); 保存的视频画面总是变质,与真实的不符。

而先写入bmp文件,在顺序读取内容则如:
   fread(&bmpFileHdr,sizeof(BITMAPFILEHEADER),1,fp);
     fread(&bmpInfoHdr,sizeof(BITMAPINFOHEADER),1,fp);
     BYTE* tmp_buf = NULL;
     tmp_buf = new BYTE[width * height * 3];
     fread(tmp_buf, 1, width * height * 3, fp);
再通过
AVIStreamWrite( m_pStreamCompressed, WriteCt, 1, (LPBYTE)(tmp_buf), BitmapHeader.biSizeImage, AVIIF_KEYFRAME, NULL, NULL );就不会出现问题。

按推理来说,bmp图片的内容是由image输出的。应该可以通过image->data得到与tmp_buf同样的内容。但测试了几次均不正确。还望高手指教下,对image的写出过程不是太了解。

该用户从未签到

发表于 2012-3-15 09:51:05 | 显示全部楼层
您是否检查过Image本身的格式(data type,pixel format)是否是标准的unsigned byte + RGB?否则保存的画面肯定是有问题的或者会崩掉;而保存BMP图片的时候OSG会进行格式的转换再记录

该用户从未签到

 楼主| 发表于 2012-3-15 10:43:06 | 显示全部楼层
array 发表于 2012-3-15 09:51
您是否检查过Image本身的格式(data type,pixel format)是否是标准的unsigned byte + RGB?否则保存的画面 ...

array老大,您终于回复了。我采用的是标准的posterImage->allocateImage( width, height, 1, GL_RGB, GL_UNSIGNED_BYTE ) 格式。

然后在 AVIStreamWrite( m_pStreamCompressed, WriteCt, 1, (LPBYTE)(posterImage->data()), BitmapHeader.biSizeImage, AVIIF_KEYFRAME, NULL, NULL );

把posterImage的data直接写出时,就会发现视频中的图像变质。不知道是什么原因。这个posterImage->data() 应该就是要往视频里写的内容吧。


我感觉应该不是视频保存的问题,因为直接把posterImage通过writeImageFile()写出时,本身就包含阴影的。背光比较严重。


还请问,osgViewer缺省的光源,是不是对rtt相机不起作用呢?

该用户从未签到

发表于 2012-3-16 09:39:53 | 显示全部楼层
AVIStreamWrite我不知道是什么,不过我印象中有些这种个人写的视频库可能是使用BGR格式来保存视频的,那样就会产生“变质”的结果。

osgViewer缺省的光源,是不是对rtt相机不起作用呢
当然起作用

该用户从未签到

 楼主| 发表于 2012-3-21 09:07:21 | 显示全部楼层
array 发表于 2012-3-16 09:39
AVIStreamWrite我不知道是什么,不过我印象中有些这种个人写的视频库可能是使用BGR格式来保存视频的,那样就 ...

array ,您好,我将RGB格式 image 的调整为BGR格式的 _finalPoster,下面的赋值方式:
                           for ( int s = 0; s < image->s(); ++s )
                        {
                                for ( int t = 0; t < image->t(); ++t )
                                {
                                        unsigned char* src = image->data(s, t);
                                        unsigned char* target = _finalPoster->data(s , t);
                                        {
                                                *(target + 2) = *(src++);
                                                *(target + 1) = *(src++);
                                                *(target ) = *(src++);
                                        }
                                }
                        }

效果是图片的颜色对了,但_finalPoster里的实体发生了倾斜,有些扭曲了。还请问array会是什么原因?

该用户从未签到

发表于 2012-3-29 17:47:39 | 显示全部楼层
投影矩阵
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表