Проигрывание видео файлов

Тема в разделе "WASM.HEAP", создана пользователем jimiforce, 24 авг 2005.

  1. jimiforce

    jimiforce New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2005
    Сообщения:
    4
    Наткнулся на статью "Проигрывание AVI файлов в OpenGL"

    http://pmg.org.ru/nehe/nehe35.htm и подумал а что если сделать прлеиер файлов только не добавлением ActveX Controla в диалог а минимальным открытием video файлов и отображением кадров в окно в общем то файлы играются

    только пока ещё без звука и не все . Ну со звуком ещё не разбирался ,а вот что не все показывают это другое

    вот программка
    Код (Text):
    1.  
    2. #include<windows.h>
    3. //
    4. #include <vidguids.h>
    5. #include <KS.h>
    6. #include <KSMEDIA.h>
    7. #include <uuids.h>
    8. //#include <WiaDef.h>
    9. //
    10. #include <vfw.h>
    11. //
    12.  
    13. #pragma comment( lib, "KSGuid.lib" )
    14. #pragma comment( lib, "WiaGuid.lib" )
    15. #pragma comment( lib, "Uuid.lib" )
    16. //
    17. #pragma comment( lib, "vfw32.lib" )    
    18. HDC hDC;
    19. //HINSTANCE hThisInst;
    20. HINSTANCE  dliagofd;
    21. HWND hWnd;
    22. //
    23.   RECT Rect;
    24. HDRAWDIB      hdd;        // Дескриптор для нашего рисунка
    25.  
    26. unsigned char* data = 0;
    27.  
    28. AVISTREAMINFO    psi;       // Указатель на структуру содержащую информацию о потоке
    29. PAVISTREAM       pavi;      // Дескриптор для открытия потока
    30. PGETFRAME        pgf;       // Указатель на объект GetFrame
    31. BITMAPINFOHEADER bmih;      // Заголовочная информация для DrawDibDraw декодирования
    32. long             lastframe; // Последний кадр анимации
    33. int              width;     // Ширина видео
    34. int              height;    // Высота видео
    35. char             *pdata;    // Указатель на данные текстуры
    36. int              mpf;       // Сколько миллисекунд отображен кадр
    37. LONG                 frame;
    38. int            ier=5;
    39. OPENFILENAME                  gofd;
    40.  
    41. char  fname[250];
    42.  
    43.  
    44. //
    45. LRESULT CALLBACK WindowFunc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
    46. {
    47.  PAINTSTRUCT ps;  
    48.  
    49. switch(msg)
    50.     {
    51.     case WM_CREATE:
    52.         AVIFileInit(); //инициализируем библиотеку
    53.         gofd.lStructSize=sizeof(OPENFILENAME);
    54.         gofd.hwndOwner=hWnd;
    55.         gofd.hInstance=dliagofd;
    56.         gofd.lpstrFilter="video(*)\0*\0mpeg(*.mpeg)\0*.mpeg\0\0";
    57.          
    58.         gofd.lpstrCustomFilter=NULL;
    59.         gofd.nFilterIndex=0;
    60.         gofd.lpstrFile=fname;
    61.             gofd.nMaxFile=MAX_PATH;
    62.         gofd.nMaxFileTitle=NULL;
    63.         gofd.lpstrInitialDir=NULL;
    64.         gofd.lpstrTitle="open video";
    65.         gofd.Flags=  NULL;                    /*OFN_EXPLORER ;  /*|OFN_FILEMUSTEXIST|
    66.             OFN_HIDEREADONLY|OFN_LONGNAMES|
    67.             OFN_PATHMUSTEXIST;*/
    68.         gofd.lpstrDefExt=NULL;
    69.         //**********************//
    70.        
    71.  
    72. if(GetOpenFileNamePreview(&gofd))         // dialog вы  бора файла
    73. {
    74. strcpy(fname,gofd.lpstrFile);
    75.                ier=0;
    76. switch( AVIStreamOpenFromFile(&pavi,fname, streamtypeVIDEO ,0,OF_READ,NULL ) )  
    77.    { case AVIERR_BADFORMAT:
    78. MessageBox(NULL," "," AVIERR_BADFORMAT",MB_OK); ier=1;
    79.      break;
    80.      case AVIERR_MEMORY:
    81. MessageBox(NULL," "," AVIERR_memory",MB_OK);  ier=1;  
    82.        break;
    83.      case AVIERR_FILEREAD:
    84. MessageBox(NULL," "," AVIERR_FILEREAD",MB_OK); ier=1;
    85.      break;
    86.      case AVIERR_FILEOPEN:
    87. MessageBox(NULL," "," AVIERR_FILEOPEN",MB_OK); ier=1;
    88.                break;
    89.      case REGDB_E_CLASSNOTREG:
    90. MessageBox(NULL," "," AVIERR_CLASSNOTREG",MB_OK); ier=1;
    91.       break;
    92.    }
    93. }
    94.  
    95. if(ier==0)
    96. {
    97.   AVIStreamInfo(pavi, ?, sizeof(psi));   // Записываем информацию о потоке в psi
    98.   width=psi.rcFrame.right-psi.rcFrame.left; // Ширина = правая граница минус левая
    99.   height=psi.rcFrame.bottom-psi.rcFrame.top;// Высота равна верх минус низ
    100.  
    101.   lastframe=AVIStreamLength(pavi); // Последний кадр потока
    102.   // Вычисление приблизительных миллисекунд на кадр
    103.   mpf=AVIStreamSampleToTime(pavi,lastframe)/lastframe;
    104.   hdd = DrawDibOpen();
    105.   pgf=AVIStreamGetFrameOpen(pavi, NULL);
    106.     frame=1;
    107.      GetClientRect(hWnd,&Rect);
    108.     SetTimer(hWnd,1,mpf,0);
    109. }
    110.    
    111.         break;
    112.  
    113.    
    114.     case WM_DESTROY:          
    115. if(ier==0){
    116.     DrawDibClose(hdd);                                          // Closes The DrawDib Device Context
    117.     AVIStreamGetFrameClose(pgf);                                // Deallocates The GetFrame Resources
    118.     AVIStreamRelease(pavi);                                     // Release The Stream
    119.         }
    120.     AVIFileExit(); 
    121.  
    122.     ReleaseDC(hWnd, hDC);
    123.     PostQuitMessage(0);
    124.    
    125.     break;
    126.    
    127.     case  WM_TIMER:
    128.         InvalidateRect(hWnd,NULL,FALSE);
    129.     break;
    130.    
    131.     case WM_PAINT:
    132. hDC=BeginPaint(hWnd, &ps);
    133. if(ier==0){
    134. frame=frame+1;
    135.  
    136. if(frame==(lastframe-1)){  frame=0;    };
    137.  
    138.   LPBITMAPINFOHEADER lpbi;                                  // Holds The Bitmap Header Information
    139.     lpbi = (LPBITMAPINFOHEADER)AVIStreamGetFrame(pgf, frame);   // Grab Data From The AVI Stream
    140.     pdata=(char *)lpbi+lpbi->biSize+lpbi->biClrUsed * sizeof(RGBQUAD);  // Pointer To Data Returned By AVIStreamGetFrame
    141.  
    142.     // Convert Data To Requested Bitmap Format
    143.     DrawDibDraw(hdd,hDC, 0, 0, Rect.right, Rect.bottom, lpbi, pdata, 0, 0, width, height, 0);
    144.   }
    145.  
    146. EndPaint(hWnd, &ps);
    147.  
    148. break;  
    149.  
    150.     case WM_SIZE:
    151.        GetClientRect(hWnd,&Rect);
    152.     break;  
    153.  
    154.  
    155.                    
    156.     default:
    157.     return DefWindowProc(hWnd,msg,wParam,lParam);
    158.     }
    159.  
    160. return 0;
    161. }
    162.  
    163.  
    164.  
    165.  
    166.  
    167.  
    168.  
    169.  
    170.  
    171.  
    172. int WINAPI WinMain(HINSTANCE hThisInst,
    173.                    HINSTANCE hPrevInst,
    174.                    LPSTR str,int nWinMode)
    175. {
    176. MSG msg;
    177. WNDCLASS wcl;
    178.  
    179. dliagofd=hThisInst;
    180. wcl.hInstance=hThisInst;
    181. wcl.lpszClassName = "OpenGLWinClass";
    182. wcl.lpfnWndProc = WindowFunc;
    183. wcl.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
    184.  
    185. wcl.hIcon = NULL;
    186. wcl.hCursor = LoadCursor(NULL,IDC_ARROW);
    187. wcl.lpszMenuName = NULL;
    188.  
    189. wcl.cbClsExtra = 0;
    190. wcl.cbWndExtra = 0;
    191.  
    192. wcl.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    193. RegisterClass(&wcl);
    194.  
    195. hWnd = CreateWindowEx(0,"OpenGLWinClass", "Win API Template",
    196.                       WS_OVERLAPPEDWINDOW ,
    197.                      0,
    198.                      0,
    199.                      700,
    200.                      500,
    201.                      NULL, NULL,
    202.                      hThisInst, NULL);
    203.  
    204.  
    205. ShowWindow(hWnd,nWinMode);
    206. UpdateWindow(hWnd);
    207.  
    208.  
    209.  
    210. while( GetMessage(&msg,NULL,0,0))
    211.     {
    212.       TranslateMessage(&msg);
    213.       DispatchMessage(&msg);
    214.      }  
    215.  
    216.    
    217.     return 0;
    218. }


    показывает avi и некоторые mpg,mpeg файлы а вот wmv вообще непоказывает

    AVIStreamOpenFromFile&pavi,fname,streamtypeVIDEO ,0,OF_READ,NULL) в статье "AVI в OPENGL" последний параметр этой функции был вуставлен в ноль (пусть система сама решает каким кодеком ей жевать файл) но при открытии

    некоторых файлов система выдаёт AVIERR_CLASSNOTREG(жевать файл нечем).

    дак я подумал а если подставить свой параметр (чтобы выбрать кодек ) ведь другие программы находят его.

    только что это за параметр я знаю очень приблизительно

    Вродибы это что то вроде ключа в реестре , и тогда какой функцией его приобразовать чтобы подставить за место нуля

    должно получиться вот это CLSID * pclsidHandler



    <font color="red]Модератор: длинный кодезь - аттачем. Читаем правила.</font><!--color-->