查看: 3024|回复: 26

OSG录制video

[复制链接]

该用户从未签到

发表于 2009-6-12 23:24:20 | 显示全部楼层 |阅读模式
osg录制video功能有谁实现过吗?

该用户从未签到

发表于 2009-6-13 01:39:37 | 显示全部楼层
这个功能比较普通,,且具有通用性,,相信很多人都实现过的~~~~可以参考WINDOWS下video的API来实现~~~~网上有类似的代码,,你可以找找~~~~~

该用户从未签到

 楼主| 发表于 2009-6-25 12:39:24 | 显示全部楼层
我基本上实现了录制功能,方法是:用glReadPixels(0,0,lpbih->biWidth,lpbih->biHeight,GL_BGR_EXT,GL_UNSIGNED_BYTE,bmBits);来读取。用AVIStreamWrite(m_pStreamCompressed,  m_lFrame,     1,    bmBits,    m_bih.biSizeImage,   AVIIF_KEYFRAME, NULL, NULL);来写入一个AVI文件头中。如果大家都感兴趣的话,我可以把代码原文整理后贴出。

但是我想进一步实现一边渲染一边录制,就是随意录制想要的一段漫游。不像我现在录制比较局限,只能先确定录制大小后开始录制。由于我对多线程不是很擅长,总是互斥量搞不好。我在想是不是这样的想法不可能实现,或者不用多线程也能实现的很好。希望大家讨论一下!

该用户从未签到

发表于 2009-6-25 12:52:39 | 显示全部楼层
我个人的希望是使用image->readPixels读取数据,然后把每帧的Image对象保存成ImageStream序列,然后再把序列输出为各种视频格式(不仅仅是avi,作为世界上最强大的编解码工具,ffmpeg可以输出不下30种视频格式)。

目前osgdb_ffmpeg插件已经具备了提供这一系列功能的能力,我想不久之后就有可能完成这一场景录制的利器~~

该用户从未签到

发表于 2009-6-25 13:38:29 | 显示全部楼层
osgdb_ffmpeg将在哪个版本提供呢?期待

该用户从未签到

发表于 2009-6-25 14:15:10 | 显示全部楼层
2.6就提供了,但是还不支持写出

该用户从未签到

 楼主| 发表于 2009-6-26 15:58:58 | 显示全部楼层
看样子还得期待!真的希望早点有这样的功能,急着用呀!

该用户从未签到

发表于 2009-11-9 13:01:58 | 显示全部楼层
3# season2005

请问你的glReadPixels是怎么用的?为什么我跟你写的一样,却读不到图像呢?图像是一片黑?

该用户从未签到

发表于 2009-11-10 00:33:41 | 显示全部楼层
你的这个问题已经被问了无数次,,因为你没有得到当前图形设备RC,,百度或者google一下你可以找到很多相关的答案~~~~~~~

该用户从未签到

发表于 2009-11-10 10:14:59 | 显示全部楼层
9# FlySky
请问OSG里怎么获得RC啊?RC不是OpenGL里的吗?

该用户从未签到

发表于 2009-11-10 11:00:28 | 显示全部楼层
glReadPixels不就是OpenGL里面的函数吗????

该用户从未签到

发表于 2009-11-10 11:02:56 | 显示全部楼层

该用户从未签到

发表于 2009-11-10 12:30:55 | 显示全部楼层
放在DrawCallback里读取~~

该用户从未签到

发表于 2009-11-10 16:15:03 | 显示全部楼层
12# FlySky
谢谢!问题解决了!但是又出现了另一个问题,读出图像后用AVIStreamWrite写成AVI时,输出的AVI文件显示文件头不完整,请问是在哪个函数里写出的文件头,哪个函数参数设置错误会出现这个问题?
再次谢谢各位大侠!
呵呵!

该用户从未签到

发表于 2009-11-10 16:16:00 | 显示全部楼层
13# tianxiao888
谢谢!问题解决了!但是又出现了另一个问题,读出图像后用AVIStreamWrite写成AVI时,输出的AVI文件显示文件头不完整,请问是在哪个函数里写出的文件头,哪个函数参数设置错误会出现这个问题?
再次谢谢各位大侠!
呵呵!

该用户从未签到

发表于 2009-11-11 01:09:55 | 显示全部楼层
你网上搜索下,,可以参考WINDOWS下video的API来实现~~~~~~

该用户从未签到

发表于 2009-11-11 14:04:23 | 显示全部楼层
16# FlySky
问题解决了,但是用setFinalDrawCallback把我写的new出来的自定义的DrawCallback设置进去后,怎么删除这个DrawCallback啊?我用setFinalDrawCallback(NULL),运行时报错了!

该用户从未签到

发表于 2009-11-11 14:22:11 | 显示全部楼层
在DrawCallback中写一个bool成员变量控制这个回调的运行就可以了,一般不建议直接删除它,除非您有新的回调对象要载入

该用户从未签到

发表于 2009-11-11 15:50:55 | 显示全部楼层
18# array
谢谢array!

该用户从未签到

发表于 2009-11-12 14:38:48 | 显示全部楼层
各位大侠:
  小弟又遇到问题了,保存video时,在调用AVIStreamRelease()函数释放avi流时,有时会报错,有时又不报错,请问这是为什么啊?与多线程有没有关系啊?我的OSG场景图使用单独开启的一个线程控制的,总体结构是MFC+OSG。这块被这个东西折磨疯了,救救我吧!

该用户从未签到

发表于 2009-11-12 14:55:07 | 显示全部楼层
呃,这个是和OSG无关的问题了吧,而且我个人也没有研究过~~抱歉爱莫能助

该用户从未签到

发表于 2009-11-12 16:27:14 | 显示全部楼层
还有一个问题:pick中的GUIEventAdapter 类型的ea,当我取ea.getX()时,在有的程序里是窗口坐标,有的程序里是-1~1之间的值,这是怎么回事啊?怎么才能直接取到窗口坐标啊?

该用户从未签到

发表于 2009-11-12 16:31:10 | 显示全部楼层
在MFC程序中可能有这个问题,此时将自动把所获得的坐标进行归一化;因此只要您自己知道窗口尺寸的话,很容易换算出来。其他GUI则基本都可以取得正确的窗口坐标

该用户从未签到

发表于 2009-11-13 09:48:21 | 显示全部楼层
23# array
楼主啊!我计算出的屏幕坐标,pick以后,得到的pick结果不对啊。getWorldIntersectPoint()出来得到的是屏幕坐标,还有的地方pick不到东西。
可是原来我的程序中getX()得到的坐标值是对的啊,我只是改了一下场景图的结构,现在getX()就不对了,怎么办才能让getX()出来的直接是屏幕坐标啊?

该用户从未签到

发表于 2009-11-13 10:19:20 | 显示全部楼层
我不知道您要说什么,况且“楼主”也不是我~~您先整理一下思路吧,也可以另外开贴提问

该用户从未签到

发表于 2009-11-13 11:00:36 | 显示全部楼层
25# array
问题解决了!不过还是要谢谢你!

该用户从未签到

 楼主| 发表于 2009-11-15 11:34:31 | 显示全部楼层
呵呵,看样子讨论的挺好。单线程也可以实现的挺好,可以不用考虑多线程!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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