Přehrátí videa v openGL? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Přehrátí videa v openGL? – C / C++ – Fórum – Programujte.comPřehrátí videa v openGL? – C / C++ – Fórum – Programujte.com

 

hlp
~ Anonymní uživatel
9 příspěvků
8. 7. 2011   #1
-
0
-

Ahoj,já bych potřeboval zjistit jak udělat v openGL video,díval jsem se na nehe ale tam mi to nezkomplikovalo ,myslím že budu muset použít:

#include <vfw.h>
#pragma comment(lib, "vfw32.lib")

a načíst to video nějak do textury ,já jsem tohle v c++ ještě nikdy nedělal takže bych potřeboval spíš nějakej příklad.Dík.

Nahlásit jako SPAM
IP: 213.19.38.–
liborb
~ Redaktor
+18
Guru
8. 7. 2011   #2
-
0
-

Na NeHe to máš i s příklady, což je to, co hledáš. Takže by možná bylo lepší zjistit, proč ti to nejde přeložit, ne?

Nahlásit jako SPAM
IP: 78.80.52.–
hlp
~ Anonymní uživatel
9 příspěvků
8. 7. 2011   #3
-
0
-

Když jsem zam skusit dát funkci: OpenAVI:

void OpenAVI(LPCSTR szFile)
{
TCHAR title[100];
AVIFileInit();
if (AVIStreamOpenFromFile(&pavi, szFile, streamtypeVIDEO, 0, OF_READ, NULL) != 0)// Otevře AVI proud
{
MessageBox (HWND_DESKTOP, "Failed To Open The AVI Stream", "Error", MB_OK | MB_ICONEXCLAMATION);
}
AVIStreamInfo(pavi, &psi, sizeof(psi));
width = psi.rcFrame.right - psi.rcFrame.left;
height = psi.rcFrame.bottom - psi.rcFrame.top;
lastframe = AVIStreamLength(pavi);
mpf = AVIStreamSampleToTime(pavi, lastframe) / lastframe;
bmih.biSize = sizeof(BITMAPINFOHEADER);
bmih.biPlanes = 1;
bmih.biBitCount = 24;
bmih.biWidth = 256;
bmih.biHeight = 256;
bmih.biCompression = BI_RGB;
hBitmap = CreateDIBSection(hdc, (BITMAPINFO*)(&bmih), DIB_RGB_COLORS, (void**)(&data), NULL, NULL);
SelectObject(hdc, hBitmap);
pgf = AVIStreamGetFrameOpen(pavi, NULL);
if (pgf == NULL)
{
MessageBox (HWND_DESKTOP, "Failed To Open The AVI Frame", "Error", MB_OK | MB_ICONEXCLAMATION);
}
wsprintf (title, "NeHe's AVI Player: Width: %d, Height: %d, Frames: %d", width, height, lastframe);
SetWindowText(g_window->hWnd, title);
}

tak mi to vyhodilo hned několik chyb:

error C2664: AVIStreamOpenFromFileW' : cannot convert parameter 2 from 'LPCSTR' to 'LPCWSTR'

error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'const char [30]' to 'LPCWSTR'

error C2065: 'data' : undeclared identifier

error C2664: 'wsprintfW' : cannot convert parameter 2 from 'const char [53]' to 'LPCWSTR'

error C2065: 'g_window' : undeclared identifier

error C2227: left of '->hWnd' must point to class/struct/union/generic type

Nahlásit jako SPAM
IP: 213.19.38.–
liborb
~ Redaktor
+18
Guru
8. 7. 2011   #4
-
0
-

Máš nahozený UNICODE, ale řetězce máš ANSII, takže vyhoď UNICODE a přijdeš o polovinu chybových hlášek. No a pak definuj globální proměnnou g_window a přijdeš i o zbytek.

Nahlásit jako SPAM
IP: 78.80.52.–
hlp
~ Anonymní uživatel
9 příspěvků
8. 7. 2011   #5
-
0
-

Chyby v ostatních funkcích se mi podařilo nějak opravit ,než jsem se dostal sem:

BOOL Initialize (GL_Window* window, Keys* keys)
{
g_window = window;
g_keys = keys;
angle = 0.0f;
hdd = DrawDibOpen();
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
glClearDepth(1.0f);
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
quadratic = gluNewQuadric();
gluQuadricNormals(quadratic, GLU_SMOOTH);
gluQuadricTexture(quadratic, GL_TRUE);
glEnable(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
OpenAVI("data/face2.avi");
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
return TRUE;
}

zde na mě vyskočily další chyby:error C2065: 'GL_Window' : undeclared identifier 

error C2065: 'window' : undeclared identifier

error C2065: 'Keys' : undeclared identifier

error C2065: 'keys' : undeclared identifier

error C2448: 'Initialize' : function-style initializer appears to be a function definition

Nahlásit jako SPAM
IP: 213.19.38.–
liborb
~ Redaktor
+18
Guru
8. 7. 2011   #6
-
0
-

   

#include "NeHeGL.h"
Nahlásit jako SPAM
IP: 78.80.52.–
hlp
~ Anonymní uživatel
9 příspěvků
8. 7. 2011   #7
-
0
-

už se mi to zmenšilo pouze na 1 chybu:

error C2143: syntax error : missing ';' before '='

v:

g_keys = keys;

Nahlásit jako SPAM
IP: 213.19.38.–
liborb
~ Redaktor
+18
Guru
8. 7. 2011   #8
-
0
-

Na tom řádku žádná chyba není. Nechybí ti na předchozím řádku na konci středník?

Nahlásit jako SPAM
IP: 78.80.52.–
hlp
~ Anonymní uživatel
9 příspěvků
8. 7. 2011   #9
-
0
-

Já myslím že tam chyba není: zde je celý kod:

#include <gl/glut.h>  
#include <windows.h>   
#include "NeHeGL.h"
#include <vfw.h>
#pragma comment(lib, "vfw32.lib")
#define g_window
#define g_keys
float angle;int next;int frame = 0;int effect;bool env = TRUE;bool bg = TRUE;bool sp;bool ep;bool bp;AVISTREAMINFO psi;PAVISTREAM pavi;PGETFRAME pgf;BITMAPINFOHEADER bmih;long lastframe;int width;int height;char* pdata;int mpf;GLUquadricObj *quadratic;HDRAWDIB hdd;HBITMAP hBitmap;HDC hdc = CreateCompatibleDC(0);

void flipIt(void* buffer)
{
void* b = buffer;// Ukazatel na buffer
__asm // ASM kód
{
mov ecx, 256*256 
mov ebx, b 
label: 
mov al, [ebx+0] 
mov ah, [ebx+2] 
mov [ebx+2], al 
mov [ebx+0], ah 
add ebx, 3 
dec ecx 
jnz label 
}
}

unsigned char* data = 0;
HWND hWnd;
void OpenAVI(LPCSTR szFile)
{
TCHAR title[100];
AVIFileInit();
AVIStreamInfo(pavi, &psi, sizeof(psi));
width = psi.rcFrame.right - psi.rcFrame.left;
height = psi.rcFrame.bottom - psi.rcFrame.top;
lastframe = AVIStreamLength(pavi);
mpf = AVIStreamSampleToTime(pavi, lastframe) / lastframe;
bmih.biSize = sizeof(BITMAPINFOHEADER);
bmih.biPlanes = 1;
bmih.biBitCount = 24;
bmih.biWidth = 256;
bmih.biHeight = 256;
bmih.biCompression = BI_RGB;
hBitmap = CreateDIBSection(hdc, (BITMAPINFO*)(&bmih), DIB_RGB_COLORS, (void**)(&data), NULL, NULL);
SelectObject(hdc, hBitmap);
pgf = AVIStreamGetFrameOpen(pavi, NULL);
if (pgf == NULL)
{
MessageBox (HWND_DESKTOP, TEXT("Failed To Open The AVI Frame"), TEXT("Error"), MB_OK | MB_ICONEXCLAMATION);
}
wsprintf (title, TEXT("NeHe's AVI Player: Width: %d, Height: %d, Frames: %d"), width, height, lastframe);
}

void GrabAVIFrame(int frame)
{
LPBITMAPINFOHEADER lpbi;// Hlavička bitmapy
lpbi = (LPBITMAPINFOHEADER)AVIStreamGetFrame(pgf, frame);
pdata = (char *)lpbi + lpbi->biSize + lpbi->biClrUsed * sizeof(RGBQUAD);
DrawDibDraw(hdd, hdc, 0, 0, 256, 256, lpbi, pdata, 0, 0, width, height, 0);
flipIt(data);// Prohodí R a B složku pixelů
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 256, GL_RGB, GL_UNSIGNED_BYTE, data);
}

void CloseAVI(void)
{
DeleteObject(hBitmap);
DrawDibClose(hdd);
AVIStreamGetFrameClose(pgf);
AVIStreamRelease(pavi);
AVIFileExit();
}


BOOL Initialize (GL_Window* window, Keys* keys)
{
g_window = window;
g_keys = keys;
angle = 0.0f;
hdd = DrawDibOpen();
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
glClearDepth(1.0f);
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
quadratic = gluNewQuadric();
gluQuadricNormals(quadratic, GLU_SMOOTH);
gluQuadricTexture(quadratic, GL_TRUE);
glEnable(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
OpenAVI("data/face2.avi");
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
return TRUE;
}


void onResize(int w, int h) {glMatrixMode(GL_PROJECTION);glLoadIdentity();glViewport(0, 0, w, h);gluPerspective(45,(double)w/(double)h,1,100);glMatrixMode(GL_MODELVIEW);}      
void init(){glEnable(GL_DEPTH_TEST);glClearColor(1.0,1.0,1.0,1.0);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);}    
void onDisplay(void){                              
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );glLoadIdentity();glTranslatef(0.0, 0.0, -2.0);glRotatef(20,1.0,1.0,1.0);    
glEnd();glutSwapBuffers();}   
int main (int argc, char **argv) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);glutInitWindowSize(640,480);glutInitWindowPosition(10,10);glutCreateWindow("OpenGL");glutDisplayFunc(init);glutIdleFunc(onDisplay);glutReshapeFunc(onResize);glutMainLoop();return 0;}  
Nahlásit jako SPAM
IP: 213.19.38.–
liborb
~ Redaktor
+18
Guru
8. 7. 2011   #10
-
0
-

Místo

#define g_window
#define g_keys

má být

GL_Window*	g_window;
Keys*		g_keys;

Pomocí #define se definují konstanty, makra ... Proměnné se definují jinak.

Nahlásit jako SPAM
IP: 78.80.52.–
hlp
~ Anonymní uživatel
9 příspěvků
8. 7. 2011   #11
-
0
-

Už mi to jde celý zkomplikovat a myslím že už mám z:

http://nehe.ceske-hry.cz/tut_35.php

uplně všechny funkce ,ale teď nevím co mám napsat  aby se mi to video vykreslilo:

mám tento kod: myslím že se to bude psát do onDisplay

#include <gl/glut.h>  
#include <windows.h>   
#include "NeHeGL.h"
#include <vfw.h>
#pragma comment(lib, "vfw32.lib")
GL_Window*	g_window;
Keys*		g_keys;
float angle;int next;int frame = 0;int effect;bool env = TRUE;bool bg = TRUE;bool sp;bool ep;bool bp;AVISTREAMINFO psi;PAVISTREAM pavi;PGETFRAME pgf;BITMAPINFOHEADER bmih;long lastframe;int width;int height;char* pdata;int mpf;GLUquadricObj *quadratic;HDRAWDIB hdd;HBITMAP hBitmap;HDC hdc = CreateCompatibleDC(0);

void flipIt(void* buffer)
{
void* b = buffer;// Ukazatel na buffer
__asm // ASM kód
{
mov ecx, 256*256 
mov ebx, b 
label: 
mov al, [ebx+0] 
mov ah, [ebx+2] 
mov [ebx+2], al 
mov [ebx+0], ah 
add ebx, 3 
dec ecx 
jnz label 
}
}

unsigned char* data = 0;
HWND hWnd;
void OpenAVI(LPCSTR szFile)
{
TCHAR title[100];
AVIFileInit();
AVIStreamInfo(pavi, &psi, sizeof(psi));
width = psi.rcFrame.right - psi.rcFrame.left;
height = psi.rcFrame.bottom - psi.rcFrame.top;
lastframe = AVIStreamLength(pavi);
mpf = AVIStreamSampleToTime(pavi, lastframe) / lastframe;
bmih.biSize = sizeof(BITMAPINFOHEADER);
bmih.biPlanes = 1;
bmih.biBitCount = 24;
bmih.biWidth = 256;
bmih.biHeight = 256;
bmih.biCompression = BI_RGB;
hBitmap = CreateDIBSection(hdc, (BITMAPINFO*)(&bmih), DIB_RGB_COLORS, (void**)(&data), NULL, NULL);
SelectObject(hdc, hBitmap);
pgf = AVIStreamGetFrameOpen(pavi, NULL);
if (pgf == NULL)
{
MessageBox (HWND_DESKTOP, TEXT("Failed To Open The AVI Frame"), TEXT("Error"), MB_OK | MB_ICONEXCLAMATION);
}
wsprintf (title, TEXT("NeHe's AVI Player: Width: %d, Height: %d, Frames: %d"), width, height, lastframe);
}

void GrabAVIFrame(int frame)
{
LPBITMAPINFOHEADER lpbi;// Hlavička bitmapy
lpbi = (LPBITMAPINFOHEADER)AVIStreamGetFrame(pgf, frame);
pdata = (char *)lpbi + lpbi->biSize + lpbi->biClrUsed * sizeof(RGBQUAD);
DrawDibDraw(hdd, hdc, 0, 0, 256, 256, lpbi, pdata, 0, 0, width, height, 0);
flipIt(data);// Prohodí R a B složku pixelů
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 256, GL_RGB, GL_UNSIGNED_BYTE, data);
}

void CloseAVI(void)
{
DeleteObject(hBitmap);
DrawDibClose(hdd);
AVIStreamGetFrameClose(pgf);
AVIStreamRelease(pavi);
AVIFileExit();
}


BOOL Initialize (GL_Window* window, Keys* keys)
{
g_window = window;
g_keys = keys;
angle = 0.0f;
hdd = DrawDibOpen();
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
glClearDepth(1.0f);
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
quadratic = gluNewQuadric();
gluQuadricNormals(quadratic, GLU_SMOOTH);
gluQuadricTexture(quadratic, GL_TRUE);
glEnable(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
OpenAVI("data/face2.avi");
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
return TRUE;
}

void Deinitialize(void)
{
CloseAVI();
}

void Update(DWORD milliseconds)
{
if ((g_keys->keyDown[' ']) && !sp)
{
sp = TRUE;
effect++;
if (effect > 3)
{
effect = 0;
}
}
if (!g_keys->keyDown[' '])
{
sp = FALSE;
}
if ((g_keys->keyDown['B']) && !bp)
{
bp = TRUE;
bg = !bg;
}
if (!g_keys->keyDown['B'])
{
bp = FALSE;
}
if ((g_keys->keyDown['E']) && !ep)
{
ep = TRUE;
env = !env;
}
if (!g_keys->keyDown['E'])
{
ep = FALSE;
}
angle += (float)(milliseconds) / 60.0f;
next += milliseconds;
frame = next / mpf;
if (frame >= lastframe)
{
frame = 0;// Přetočí video na začátek
next = 0;// Nulování času
}
}




void onResize(int w, int h) {glMatrixMode(GL_PROJECTION);glLoadIdentity();glViewport(0, 0, w, h);gluPerspective(45,(double)w/(double)h,1,100);glMatrixMode(GL_MODELVIEW);}      
void init(){glEnable(GL_DEPTH_TEST);glClearColor(1.0,1.0,1.0,1.0);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);}    
void onDisplay(void)
{    
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );



glEnd();glutSwapBuffers();

}   
int main (int argc, char **argv) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);glutInitWindowSize(640,480);glutInitWindowPosition(10,10);glutCreateWindow("OpenGL");glutDisplayFunc(init);glutIdleFunc(onDisplay);glutReshapeFunc(onResize);glutMainLoop();return 0;}  
Nahlásit jako SPAM
IP: 213.19.38.–
liborb
~ Redaktor
+18
Guru
8. 7. 2011   #12
-
0
-

Pokud se ti onDisplay zavolá minimálně při požadavku vykreslení okna, tak ano. 

Nahlásit jako SPAM
IP: 78.80.52.–
hlp
~ Anonymní uživatel
9 příspěvků
8. 7. 2011   #13
-
0
-

teď ale nevím co mám napsat do onDisplay aby se mi zobrazilo video:

zkoušel jsem: Initialize(window,keys);

nebo:

GrabAVIFrame(frame);

ale to mi napsalo error

: Access violation reading location 0x00000000.

Nahlásit jako SPAM
IP: 213.19.38.–
liborb
~ Redaktor
+18
Guru
8. 7. 2011   #14
-
0
-

Initialize musíš zavolat nejlépe před vytvoření okna aplikace. Takže GrabAVIFrame je správně.

Nahlásit jako SPAM
IP: 78.80.52.–
hlp
~ Anonymní uživatel
9 příspěvků
8. 7. 2011   #15
-
0
-

za glutCreateWindow("OpenGL"); dám: Initialize(g_window,g_keys); a napíše to znova:

0xC0000005: Access violation reading location 0x00000000.

Nahlásit jako SPAM
IP: 213.19.38.–
liborb
~ Redaktor
+18
Guru
8. 7. 2011   #16
-
0
-

Initialize se volá, aby se mimo jiné inicializovaly proměnné (pointery) g_window a g_keys. Takže je nemůžeš předávat jako parametr. Někde musíš deklarovat proměnné (členské, globální ... podle toho, jak to máš udělané), které budeš do Inicializace předávat jako parametr (resp. pointer na ně).

Nahlásit jako SPAM
IP: 78.80.52.–
hlp
~ Anonymní uživatel
9 příspěvků
8. 7. 2011   #17
-
0
-

Asi jsem to nějak nepochopil,nebyl by třeba nějaký příklad jak vykreslit na texturu video?

Nahlásit jako SPAM
IP: 213.19.38.–
nervak0
Věrný člen
8. 7. 2011   #18
-
0
-

Na konci článku jsou zdrojáky.

Když zápolíš se základy Céčka, tak je na OpenGL trošku brzy...

Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 56 hostů

Podobná vlákna

C++, OpenGL, SDL /// C++, OpenGL — založil Kolemjdouci

Videa — založil lolik

Uprava videa — založil Jan Malý

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý