dshow videorender 直接接收yuv

unsway123 2013-12-31 04:36:59
用dshow开发camera的应用程序,实现预览功能后,发现预览cpu的占用率很高,后来通过debug,发现占用cpu占用率高的原因是因为YUV->RGB的转换。
我的显示驱动是支持OVERLAY的,支持两种OVERLAY,YUVoverlay,RGBoverlay,理想的状态下,从capturefilter传递过来的camera数据(yuv)直接传递给videorender,videorender通过ddraw来创建一个YUVoverlay,然后直接显示。

但是实际测试的结果是videorender永远都是创建一个RGBoverlay,肯定yuv的数据放到了RGB的表面,videorender或许就给我转了格式了。

现在预览的时候cpu占用率高,加上录像,还有录音,导致我在录像的时候有丢帧的现象,格外的录像的时候cpu占用率太高了,都到了%80多了,所以考虑到从根本上解决这个问题,只能够让videorender能够直接接收yuv数据,创建YUVoverlay

在微软的文档上看过文档,
大致上的意思是videorender在第一次协商的时候是需要连接和主屏幕格式一样的格式,一般就是RGB,当run了之后,再通过协商新的格式,实现动态格式改变

大家都有何见解
...全文
196 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
unsway123 2014-01-02
  • 打赏
  • 举报
回复
咋没人呢。顶起
WebRTC源码分析1视频显示 分类: google webRTC媒体引擎 2012-07-22 21:16 382人阅读 评论(0) 收藏 举报 来源:http://blog.csdn.net/lezhiyong WebRTC是google一项在浏览器内部进行实时视频和音频通信的技术,其他关于WebRTC具体介绍和来源,大家google一下基本能知道,Webrtc里面的系统架构清晰精妙,代码风格良好,如此好的东西能开源出来,无论是学习还是使用,我们受益匪浅。 Webrtc的底层的结构相当清晰,就视频来说分视频采集、视频处理、视频编解码、视频显示、视频录制几个典型模块。 所属模块:video_render_module 接口路径:webrtc\trunk\src\modules\video_render\main\interface\video_render.h 代码路径:webrtc\trunk\src\modules\video_render\main\source 通过video_render.hVideoRender提供的对外接口完成render的创建和调用,代码结构如下图所示: 可见video_render模块通过继承IVideoRender实现多操作系统以及第三方数据的支持,通过继承IVideoRenderWin实现D3D和DirectDraw支持。最后通过VideoRender提供的接口给应用层调度。 video_render提供的功能挺强大的,支持插入字幕,支持插入图片、支持一个视频窗口显示多路视频,支持D3D,DDRAW,支持多操作系统,这些功能足够胜任日常使用了。 关于video_render模块VideoRender的使用方法,可以从webrtc\trunk\src\modules\video_render\main\test\testAPI目录下的testAPI.cpp文件了解得清清楚楚。 大致步骤: 1、 创建VideoRender对象: VideoRender* renderModule= NULL; renderModule =VideoRender::CreateVideoRender(myId, window, false, windowType); VideoRenderCallback* renderCallback0 = renderModule->AddIncomingRenderStream(streamId0,0, 0.0f, 0.0f, 1.0f, 1.0f); assert(renderCallback0 != NULL); 2、获取VideoRenderCallback并通过renderModule->StartRender启动render const int streamId0 = 0; VideoRenderCallback* renderCallback0 = renderModule->AddIncomingRenderStream(streamId0,0, 0.0f, 0.0f, 1.0f, 1.0f); error = renderModule->StartRender(streamId0); 3、调用RenderFrame逐帧显示 renderCallback0->RenderFrame(streamId0, videoFrame0); 4、停止render error = renderModule->StopRender(streamId0); error = renderModule->DeleteIncomingRenderStream(streamId0);

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧