Ich verwende Ogre als Engine, ich denke mal viele kennen Sie bzw. haben davon gehört. Da Ogre an sich keine Videos unterstützt gibt es dieses Plugin:
http://www.ogre3d.org/tikiwiki/tiki-inde…ucture=Cookbook
Es verwendet DirectShow.
Ich habe es in meinem Projekt eingebaut. Allerdings ist die Funktion ConnectFilters unbekannt. Dazu hab ich das im Internet gefunden:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
HRESULT GetPin (IBaseFilter * pFilter, PIN_DIRECTION PinDir, IPin ** ppPin)
{
IEnumPins *pEnum;
IPin *pPin;
pFilter->EnumPins(&pEnum);
while(pEnum->Next(1, &pPin, 0) == S_OK)
{
PIN_DIRECTION PinDirThis;
pPin->QueryDirection(&PinDirThis);
if (PinDir == PinDirThis)
{
pEnum->Release();
*ppPin = pPin;
printf("connected\n");
//MessageBox(NULL, L"connected", L"success", MB_OK);
return S_OK;
}
pPin->Release();
}
pEnum->Release();
return E_FAIL;
}
HRESULT ConnectFilters(IGraphBuilder *pGraph, IBaseFilter *pFirst, IBaseFilter *pSecond)
{
IPin *pOut = NULL, *pIn = NULL;
HRESULT hr = GetPin(pFirst, PINDIR_OUTPUT, &pOut);
if (FAILED(hr))
return hr;
hr = GetPin(pSecond, PINDIR_INPUT, &pIn);
if (FAILED(hr))
{
pOut->Release();
return E_FAIL;
}
hr = pGraph->Connect(pOut, pIn);
pIn->Release();
pOut->Release();
return hr;
}
|
Jedenfalls will ich jetzt ein Video laden, was aber nicht funktioniert: Ich erhalte eine Fehlermeldung mit dem Inhalt: Abnormal program termination
Als ich alles ins Projektverzeichnis kopiert hatte (auch die intro.mp4) schaltete ich den Debugger an. Danach war ich verwirrt:
Erst mal der Code zum laden:
|
C-/C++-Quelltext
|
1
2
|
introTex = new OgreUtils::DirectShowMovieTexture(OgreFramework::getSingletonPtr()->m_pViewport->getActualWidth(),OgreFramework::getSingletonPtr()->m_pViewport->getActualHeight());
introTex->loadMovie("intro.mp4");
|
Alles funktioniert, die Initialisierung mit new wird korrekt ausgeführt, doch dann...
|
C-/C++-Quelltext
|
1
2
|
hr = ConnectFilters(dsdata->pGraph, srcFilter, dsdata->pGrabberF);
if(FAILED(hr)) throw ("[DSHOW] Unsupported media type!");
|
In der zweiten Zeile der beiden (Funktion loadMovie) wird eine Speicherverletzung (typischer Fehler) ausgegeben. Der grüne Pfeil zeigt aber in den Konstruktor auf folgende Zeile:
|
C-/C++-Quelltext
|
1
|
hr=CoInitialize(NULL);
|
Ich frage mich wie er dahin kommt. Die Ausgabe Unsupported media type wurde nicht ausgegeben, die logfile zeigt folgendes:
00:20:14: [DSHOW] Creating texture with dimensions 1584x822.
00:20:14: [DSHOW] Loading movie named 'intro.mp4'.
Ja ich hab auch mal versucht das komplette Verzeichnis anzugeben bringt aber auch nichts.
Ich weiß echt nicht mehr weiter und hoffe jemand kann mir helfen.
mfg