列出后可以根据自己的需求去做,如果没有驱动就使用software去做就好了,以下列出对比,视频源为1280 720 的摄像头,使用RGB24来测试
CPU占用率在1.3% 到 1.5% 之间 GPU在5%到6.2%之间
D3D9cpu 占用率在0.9 到1.6 之间 GPU在5%到6.2%之间
D3D11CPU 占用率在0.7%到2.0% 之间 GPU在4.6%到5.7%之间 DEBUG 和RELEASE 并没有多大差异。 三者清晰度基本一致。
softwareCPU 占用率在0.6%- 1.6%之间 GPU为零
测试代码以下代码有冗余
int ret = cap.OpenCameraRGB(name.c_str(), w, h);
if (ret != 0)
return -1;
int screen_w, screen_h;
SDL_Window *screen = NULL;
SDL_Window *screenD3D = NULL;
SDL_Window *screenD3D11 = NULL;
SDL_Renderer *sdlRenderer = NULL;
SDL_Renderer *sdlRendererD3D = NULL;
SDL_Renderer *sdlRendererD3D11 = NULL;
SDL_Texture *sdlTexture = NULL;
SDL_Texture *sdlTextureD3D = NULL;
SDL_Texture *sdlTextureD3D11 = NULL;
SDL_Rect sdlRect;
SDL_Thread *video_tid;
SDL_Event event;
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1");
//SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
//SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4);
int MODE =-1;
screen_w = w;
screen_h = w *9 /16;
//screen_h = screen_w * 9 / 16;
if (MODE == -1)
screen = SDL_CreateWindow("FF", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
640, 360, SDL_WINDOW_SHOWN/* SDL_WINDOW_OPENGL*/); //,
else if(MODE == 0)
screenD3D = SDL_CreateWindow("FFD3D", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
640, 360, SDL_WINDOW_SHOWN/* SDL_WINDOW_OPENGL*/);
else if(MODE == 1)
screenD3D11 = SDL_CreateWindow("FFD3D11", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
640, 360, SDL_WINDOW_SHOWN/* SDL_WINDOW_OPENGL*/);
for (int i = 0; i format), D3DPOOL_DEFAULT, &texturerep->texture, NULL);
//1 改成0 ,
各项异性过滤加上,mipmap 生成等级map加上,结果出问题
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC);
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
在d3d9 的render里面修改使用后,sdl 窗口大小必须和纹理大小一样,否则黑屏。所以这个方式就没有用了。
显示正确方法前面得修改都去除,sdl 源代码不修改,如果直接使用ffmpeg的缩小方法,缩放到和窗口一样大小,那直接显示就非常好了。下面对比以下
前面使用了一堆好的方法,sdl最后放到窗口上时没有算法保证过滤。这个要修正。
不使用sdl不使用sdl,直接使用opengl 或者 direct3d是比较合适的。快速地做出一个显示效果可以使用sdl,不建议在产品中使用。