Вопрос к умным и мудрым..
От: Tremer  
Дата: 31.10.07 09:39
Оценка:
Есть Dll которая с внешней камеры дает bitmapы. куда помещает не знаю еще..
нужно брать эти битмапы и выводить на экран с большой скоростью(ок. 30 кадров/сек), чтобы получалось видео. Разрешение у камеры пока низкое, изображение монохромное..

Собственно вопрос: Что конкретно стоит изучить досконально(Классы, методы и т.д.) для реализации задачи..

ЗЫ Пишите попроще, я пока скорее чайник...

31.10.07 12:59: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Re: Вопрос к умным и мудрым..
От: Formidable  
Дата: 31.10.07 09:51
Оценка:
T>Собственно вопрос: Что конкретно стоит изучить досконально(Классы, методы и т.д.) для реализации задачи..
Если просто, то изучать сайт MSDN.
Ели конкретно то DirectShow. Если еще конкретней написание DirectShow Source Filters (и воспроизведение естественно).

Если совсем просто, то нужно скачать "Microsoft Platform SDK for Windows Server 2003" + "Microsoft DirectX SDK" и смотреть на документацию и примеры.
Re: Вопрос к умным и мудрым..
От: Степанов Андрей  
Дата: 31.10.07 11:00
Оценка:
Здравствуйте, Tremer, Вы писали:

T>Есть Dll которая с внешней камеры дает bitmapы. куда помещает не знаю еще..


Скорее всего поможет DirectDraw — это набор функций/интерфейсов, которые позволяют копировать изображения напрямую в видеопамять. Примерно выглядит так (взято из реального кода, без редактирования, может быть и неполностью):


// Инициализируем DirectDraw
    LPDIRECTDRAW        pDD;
    LPDIRECTDRAWSURFACE primSurf;
    LPDIRECTDRAWSURFACE backSurf;
    LPDIRECTDRAWCLIPPER clipper;
    if ( FAILED ( DirectDrawCreate ( NULL, &pDD, NULL ) ) )
        return 0;
    
    // Проверку ошибок пока :) опустим
    pDD->SetCooperativeLevel ( hWnd, DDSCL_NORMAL );
    // Основной буфер
    DDSURFACEDESC ddsd = {0};
    ddsd.dwSize = sizeof(ddsd);
    ddsd.dwFlags = DDSD_CAPS;
    ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
    pDD->CreateSurface ( &ddsd, &primSurf, NULL );
    // Задний буфер
    DDSURFACEDESC ddsd1 = {0};
    ddsd1.dwSize = sizeof(ddsd);
    ddsd1.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
    ddsd1.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY; //DDSCAPS_SYSTEMMEMORY DDSCAPS_VIDEOMEMORY;
    ddsd1.dwWidth = magResp.imageX;
    ddsd1.dwHeight = magResp.imageY;
    pDD->CreateSurface ( &ddsd1, &backSurf, NULL );
    // Обрезатель
    pDD->CreateClipper ( 0, &clipper, NULL );
    primSurf->SetClipper ( clipper );

.....
// Блокируем буфер и рисуем в нем
    DDSURFACEDESC  sd = {0};
    sd.dwSize = sizeof(sd);
    state->backSurf->Lock ( NULL, &sd, DDLOCK_WRITEONLY | DDLOCK_WAIT, NULL ); 
...........
// Разблокируем буфер
state->backSurf->Unlock ( NULL );

    // Перебрасываем изображение на основную поверхность
    RECT    rcDest;
    POINT   p;
    p.x = 0; p.y = 0;
    ClientToScreen ( state->hWnd, &p );
    GetClientRect ( state->hWnd, &rcDest );
    OffsetRect ( &rcDest, p.x, p.y );
    state->clipper->SetHWnd ( 0, state->hWnd );
    state->primSurf->Blt ( &rcDest, state->backSurf, NULL, DDBLT_WAIT, NULL );
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.