Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

06.03.2010, 09:44

Video wird in einem externen Fenster abgespielt

Hallo.
Ich bin's leider schon wieder.
Irgendwie will auch nichts mehr klappen.
Ich hab jetzt versucht als Intro ein Video abspielen zu lassen.
Was auch klappt, nur er öffnet mir dazu ein neues kleines Fenster
und nimmt nicht das eigentliche Fenster.

Hier mal die Render-Funktion:

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
SIntroVertex aVertex[4];

    tbDirect3D& D3D = tbDirect3D::Instance();
    D3D->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, tbColor(0.0f, 0.0f, 0.0f), 1.0f, 0);
    D3D->BeginScene();

    D3D.SetFVF(SIntroVertex::dwFVF);
    
    D3D.SetTexture(0, m_pVideo->GetRenderer()->GetTexture()); 
    D3D.SetRS(D3DRS_ZENABLE, D3DZB_FALSE);

    aVertex[0].vPosition = tbVector3( 0.0f, D3D.GetScreenSize().y , 0.0f);
    aVertex[0].fRHW = 1.0f;
    aVertex[0].Color = tbColor( 0.0f, 0.0f, 0.0f);
    aVertex[0].vTex0 = tbVector2( 0.0f, m_pVideo->GetRenderer()->GetBottomRightTex().y);

    aVertex[1].vPosition = tbVector3( 0.0f, 0.0f, 0.0f);
    aVertex[1].fRHW = 1.0f;
    aVertex[1].Color = tbColor( 1.0f, 0.0f, 0.0f);
    aVertex[1].vTex0 = tbVector2( 0.0f, 0.0f);

    aVertex[2].vPosition = tbVector3( D3D.GetScreenSize().x, D3D.GetScreenSize().y, 0.0f);
    aVertex[2].fRHW = 1.0f;
    aVertex[2].Color = tbColor( 0.0f, 0.0f, 2.0f);
    aVertex[2].vTex0 = tbVector2( m_pVideo->GetRenderer()->GetBottomRightTex());

    aVertex[3].vPosition = tbVector3( D3D.GetScreenSize().x, 0.0f, 0.0f);
    aVertex[3].fRHW = 1.0f;
    aVertex[3].Color = tbColor( 0.0f, 1.0f, 0.0f);
    aVertex[3].vTex0 = tbVector2( m_pVideo->GetRenderer()->GetBottomRightTex().x, 0.0f);

    D3D->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, aVertex, sizeof(SIntroVertex));

    D3D->EndScene();
    m_pVideo->NextFrame();


Und in der MoveFunktion steht:

C-/C++-Quelltext

1
m_pVideo->Process();

mfg

2

06.03.2010, 12:34

Bin auf diesen Thread gestoßen http://spieleprogrammierer.de/phpBB2/vie…t=video+fenster
Aber welchen Avi-Codec braucht man da? DivX sollte
doch eigentlich immer laufen, oder?
Aber er spielt mir auch nicht die Videos ab, die im Beispielprogramm
waren.

mfg

3

07.03.2010, 11:47

Hat keiner eine Vermutung?

4

07.03.2010, 12:46

Ich habe dasselbe Problem auch gehabt, als ich ein kleines Introvideo für mein aktuelles Spiel eingebaute habe. Ich habe dabei viele codecs durchprobiert, und bei manchen codecs kann das video nicht im normalen fenster abgespielt werden.

Ich empfehle dir den AnyVideoConverter von AnvSoft (freeware) zu laden und verschidene codecs auszubrobieren, bis du dein gewünschtes video hast. Denke aber daran immer den avi-container zu benutzen.

Ich meine der richtige codec wäre wmv2.

Müsste klappen.

Nick
Aller Anfang ist schwer

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

5

07.03.2010, 13:09

Wenn ihr das Buch habt, dann lest es mal genau:

Zitat

(Kapitel 9.3.2.1 Warum ein eigener Filter?)
Der normale DirectShow-Video-Renderer [...] arbeitet normalerweise nur im Fenstermodus (es öffnet sich dann automatisch ein neues Fenster, in dem das Video abgespielt wird. [...] Wohl oder übel bedeutet das, das wir einen eigenen Video-Renderer schreiben müssen [...]


;) Das sollte genügen.

EDIT: Mist, du verwendest den ja schon :oops:

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

6

07.03.2010, 15:39

Danke für eure Antworten.
Ich habe mir das Programm mal geladen und alle
Avi-Codecs durch probiert aber leider klappt keiner.
(Paar starten wieder in einem Fenster, andere klappen gar nicht)
Ich versuch jetzt mal die Animation mit Blender neu zu rendern.

mfg

7

07.03.2010, 21:23

Klappt auch nicht.
Jetzt startet zwar kein externes Fenster mehr aber
er bricht hier ab:

C-/C++-Quelltext

1
D3D.SetTexture(0, m_pVideo->GetRenderer()->GetTexture());

Das Problem hatte ich hier schon mal:
http://spieleprogrammierer.de/phpBB2/vie…der=asc&start=0
Aber die Lösung klappt hier nicht.

Und wenn ich nach dem Laden einen Haltepunkt mache und mal gucke
ob auch alle Werte in ordnung sind, habe ich folgendes gesehen:

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
-       m_pReader   0x00000000  CMemReader *
-       CAsyncReader    {m_csFilter={...} m_Io={...} m_OutputPin={...} ...} CAsyncReader
-       CBaseFilter {m_State=??? m_pClock=??? m_tStart={...} ...}   CBaseFilter
+       CUnknown    {m_pUnknown=??? m_cRef=??? }    CUnknown
+       IBaseFilter {...}   IBaseFilter
+       IAMovieSetup    {...}   IAMovieSetup
        m_State CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden 
        m_pClock    CXX0017: Fehler: Symbol "" nicht gefunden   
+       m_tStart    {m_time=??? }   CRefTime
+       m_clsid {????????-????-????-????-????????????}  _GUID
        m_pLock CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden 
        m_pName CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden 
        m_pGraph    CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden 
        m_pSink CXX0017: Fehler: Symbol "" nicht gefunden   
        m_PinVersion    CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden 
+       m_csFilter  {m_CritSec={...} m_currentOwner=??? m_lockCount=??? ...}    CCritSec
+       m_Io    {m_csReader={...} m_pStream=??? m_csLists={...} ...}    CAsyncIo
+       m_OutputPin {m_pReader=??? m_pIo=??? m_bQueriedForAsyncReader=??? } CAsyncOutputPin
+       m_mt    {...}   CMediaType
-       m_pStream   0x00000000 {m_csLock={...} m_pbData=??? m_llLength=??? ...} CMemStream *
+       CAsyncStream    {...}   CAsyncStream
+       m_csLock    {m_CritSec={...} m_currentOwner=??? m_lockCount=??? ...}    CCritSec
        m_pbData    CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden 
        m_llLength  CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden 
        m_llPosition    CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden 
        m_dwKBPerSec    CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden 
        m_dwTimeStart   CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden

(Alle Unterpunkte haben "Fehler: Ausdruck kann nciht ausgewertet werden")

mfg

//Edit: Es muss aber am Code liegen, weil die mit gelieferten Videos auch nicht gehen.

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
tbDirect3D& D3D = tbDirect3D::Instance();

    CVertex aVertex[4];

    D3D.SetFVF(CVertex::dwFVF);
    D3D.SetTexture(0, m_pVideo->GetRenderer()->GetTexture()); 

    aVertex[0].vPos = tbVector3(0.0f, D3D.GetScreenSize().y, 0.5f);
    aVertex[0].fRHW = 1.0f;
    aVertex[0].vTex = tbVector2(0.0f, m_pVideo->GetRenderer()->GetBottomRightTex().y); 
                                        

    aVertex[1].vPos = tbVector3(0.0f, 0.0f, 0.0f);
    aVertex[1].fRHW = 1.0f;
    aVertex[1].vTex = tbVector2(0.0f, 0.0f);

    aVertex[2].vPos = tbVector3(D3D.GetScreenSize().x, D3D.GetScreenSize().y, 0.5f);
    aVertex[2].fRHW = 1.0f;
    aVertex[2].vTex = m_pVideo->GetRenderer()->GetBottomRightTex(); 

    aVertex[3].vPos = tbVector3(D3D.GetScreenSize().x, 0.0f, 0.5f);
    aVertex[3].fRHW = 1.0f;
    aVertex[3].vTex = tbVector2(m_pVideo->GetRenderer()->GetBottomRightTex().x, 0.0f); 

    D3D->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, aVertex, sizeof(CVertex));

    D3D->EndScene();

    m_pVideo->NextFrame();

    return TB_OK;
}

8

08.03.2010, 16:44

Ich versteh das nicht.
Das gleiche Video kann ich mit meinem älteren Spiel abspielen lassen
und auch im Spielfenster.
Und der Code ist eigentlich gleich.

//Edit: Ja, Okay dann ist das eigentlich eine dumme Frage.
Hab dann mal die Libs vergliechen und siehe da:
Eine hat gefehlt.
Ich weiß jetzt leider nicht welche es war,
weil ich die Libs von meinem alten Spiel einfach einmal kopiert habe.

Danke für eure Hilfe ;)

mfg

Werbeanzeige