游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6191|回复: 10

使用vmr9在游戏中播放多个视频

[复制链接]

52

主题

155

帖子

160

积分

注册会员

Rank: 2

积分
160
发表于 2007-8-26 11:16:00 | 显示全部楼层 |阅读模式
我想模拟实现电视那种画中画的效果,所以考虑使用direct show里的vmr9.
首先我参考了VMR9Allocator.
代码位置在:
C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Samples\Multimedia\DirectShow\VMR9\VMR9Allocator
原始代码是用PresentImage回调中显示的, 而我是借助DXUT框架开发的,所以要修改成多线程使用.
由PresentImage生成texture,再在OnFrameRender中显示纹理.

现在的情况是可以生成texture,但在OnFrameRender中显示为空白.
我调用 D3DXSaveTextureToFile,把传递来的纹理存成,它却是是正常的.
我怀疑是因为不同IDirect3DDevice9的原因,尝试自己createtexture
以下是创建代码:
                if(m_Texture)
                {
                        CComPtr<IDirect3DSurface9> surface;
                        FAIL_RET( m_Texture->GetSurfaceLevel( 0 , & surface.p ) );

                        // copy the full surface onto the texture's surface
                        FAIL_RET( m_D3DDev2->StretchRect( lpPresInfo->lpSurf, NULL,
                                surface, NULL,
                                D3DTEXF_NONE ) );
                }
                else
                {

                        D3DDISPLAYMODE dm;
            FAIL_RET( m_D3DDev2->GetDisplayMode(NULL,  & dm ) );

            // create the private texture
            FAIL_RET( m_D3DDev2->CreateTexture(100, 100,
                                    1,
                                    D3DUSAGE_RENDERTARGET,
                                    dm.Format,
                                    D3DPOOL_DEFAULT /* default pool - usually video memory */,
                                    & m_Texture.p, NULL ) );
                }
还是不行.
我想我一定是某个很小的细节卡住了,已经两天没有任何进展了.特此请教.

52

主题

155

帖子

160

积分

注册会员

Rank: 2

积分
160
 楼主| 发表于 2007-8-26 11:30:00 | 显示全部楼层

Re: 使用vmr9在游戏中播放多个视频

这是代码.
缺少一个视频文件,因为这里空间限制,请把代码中的ruby.avi换一下,谢谢啦!

sf_2007826112956.rar

297.67 KB, 下载次数:

1367

主题

1993

帖子

2118

积分

金牌会员

Rank: 6Rank: 6

积分
2118
发表于 2007-8-26 15:26:00 | 显示全部楼层

Re:使用vmr9在游戏中播放多个视频

hao src

5

主题

52

帖子

58

积分

注册会员

Rank: 2

积分
58
发表于 2007-8-28 09:38:00 | 显示全部楼层

Re:使用vmr9在游戏中播放多个视频

vmr9? 感觉好像会和游戏循环有冲突,

52

主题

155

帖子

160

积分

注册会员

Rank: 2

积分
160
 楼主| 发表于 2007-8-28 11:55:00 | 显示全部楼层

Re:使用vmr9在游戏中播放多个视频

是的,我用多线程来处理.

目前我可以从把纹理先存储到内存里,再读取出来,是可以显示的,但是性能很慢,只能得到10fps,原始的应该是25fps啊
方法如下:
D3DXSaveTextureToFileInMemory(&buf,D3DXIFF_BMP,ppTextureToFilter,NULL);
D3DXCreateTextureFromFileInMemory(pd3dDevice,buf->GetBufferPointer(),320*1240,&ppTextureToFilter);

我不知道这两个处理函数内部做了什么,使得纹理与当前的设备格式兼容?
可是vmr9在初始化回调中InitializeDevice,做了兼容测试,它是兼容的texture.

hr = m_lpIVMRSurfAllocNotify->AllocateSurfaceHelper(lpAllocInfo, lpNumBuffers, & m_surfaces.at(0) );
if(FAILED(hr) && !(lpAllocInfo->dwFlags & VMR9AllocFlag_3DRenderTarget))
{
//不兼容处理
            D3DDISPLAYMODE dm;
            FAIL_RET( m_D3DDev->GetDisplayMode(NULL,  & dm ) );

            // create the private texture
            FAIL_RET( m_D3DDev->CreateTexture(lpAllocInfo->dwWidth, lpAllocInfo->dwHeight,
                                    1,
                                    D3DUSAGE_RENDERTARGET,
                                    dm.Format,
                                    D3DPOOL_DEFAULT /* default pool - usually video memory */,
                                    & m_privateTexture.p, NULL ) );
}
else
{
//格式兼容,直接从surface取数据.
}
                       

52

主题

155

帖子

160

积分

注册会员

Rank: 2

积分
160
 楼主| 发表于 2007-8-28 12:03:00 | 显示全部楼层

Re:使用vmr9在游戏中播放多个视频

企盼深入了解texture机制的朋友做个解答吧

6

主题

307

帖子

309

积分

中级会员

Rank: 3Rank: 3

积分
309
发表于 2007-8-28 17:51:00 | 显示全部楼层

Re:使用vmr9在游戏中播放多个视频

要用一个Device还得设成多线程的

VMR用的Device可以通过一个接口设进去

IVMRSurfaceAllocatorNotify9

RenderLess模式才能用

52

主题

155

帖子

160

积分

注册会员

Rank: 2

积分
160
 楼主| 发表于 2007-8-29 09:30:00 | 显示全部楼层

Re:使用vmr9在游戏中播放多个视频

谢谢,我是用Mute来实现线程同步的.不过没有用.
hInitDone = CreateMutex(NULL, 0, NULL);
WaitForSingleObject(hInitDone, INFINITE);
ReleaseMutex(hInitDone);

而且尝试了传入device后,显示混乱,它把显存的旧画面读取出来.是否是rendertarget的问题? 我尝试了只在setRendertarget(0,m_target) 貌似也没有结果.

52

主题

155

帖子

160

积分

注册会员

Rank: 2

积分
160
 楼主| 发表于 2007-8-29 09:37:00 | 显示全部楼层

Re:使用vmr9在游戏中播放多个视频

搞了几天也没结果,无奈准备放弃了,改用动态纹理了.没法先做简单的吧.
之所以想用vmr9是因为它支持shader的渲染,可以高速实现很多视频效果.

5

主题

52

帖子

58

积分

注册会员

Rank: 2

积分
58
发表于 2007-9-3 13:26:00 | 显示全部楼层

Re:使用vmr9在游戏中播放多个视频

我以前做的时候没有用vmr9或者vmr7,就是简单的用了一下dshow里面的东西,然后多线程播放,记得要创建D3Ddevice的时候打开多线程flag, 在没帧update的时候 将逐象素拷贝到目标位置,就实现播放了,而且可以和游戏循环结合的很好
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-8 11:52

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表