Ik kom er niet meer uit 
Het probleem is als volgt:
Ik ben bezig met een movie player in Delphi5 mbv DelphiX, ik decode zelf de video bestanden. Ik maak een DirectSound buffer aan van 1 seconde. Hierin geef ik voor elke frame een notify event marker aan (SetNotificationPositions(), om de 1470 bytes), in totaal 15 markers (15 fps)
Ik maak een thread aan die zorgt voor het decoderen en renderen van het video/geluid. Na veel frustraties heb ik 't programma zo ver gekregen dat het geluid goed loopt (en BLIJFT lopen), maar nu zit ik nog met 1 probleem, en ik weet het echt niet meer
Vaak blijft het video spontaan steken (geluid loopt wel goed door tot het einde van het filmpje), soms na 1 seconde, soms bijna op het einde, soms een keer gewoon niet (maar das uniek). Het enige wat ik dan kan doen is het programma afsluiten (hij reageerd verder nog wel), en opnieuw openen.
Nu ben ik er 99% zeker van dat het ergens in deze routine in de soep loopt (uitleg volgt):
EventNr is het index nummer uit de event array waar het programma eigenlijk op wacht. Doe ik dit niet (dus reageert op elke index uit de array als de play positie voorbij een marker komt) dan raakt het filmpje uit sync na pauseren. Vraag me niet waarom maar zo werkt het prima.
Get bovenste gedeelte (While PeekMessage...) ben ik tegengekomen op vele sites hierover. Ik heb heel veel varianten hierop geprobeerd. Sommigen zorgden voor minder freezes dan anderen, maar geen enkele loste het probleem op
Ik heb geprobeerd met MsgWaitForSingleObject, dat zorgde ervoor dat ie m'n filmpje in sprongetjes afspeelde.
Ik heb geprobeerd zonder...laat ik daar maar over zwijgen
Anyways, m'n filmpjes freezen nog steeds, het ligt bijna zeker aan de code hierboven. Voor alle duidelijkheid: Hij decodeerd WEL alle frames tijdens de freeze, hij laat ze alleen niet zien
Het probleem is als volgt:
Ik ben bezig met een movie player in Delphi5 mbv DelphiX, ik decode zelf de video bestanden. Ik maak een DirectSound buffer aan van 1 seconde. Hierin geef ik voor elke frame een notify event marker aan (SetNotificationPositions(), om de 1470 bytes), in totaal 15 markers (15 fps)
Ik maak een thread aan die zorgt voor het decoderen en renderen van het video/geluid. Na veel frustraties heb ik 't programma zo ver gekregen dat het geluid goed loopt (en BLIJFT lopen), maar nu zit ik nog met 1 probleem, en ik weet het echt niet meer
Vaak blijft het video spontaan steken (geluid loopt wel goed door tot het einde van het filmpje), soms na 1 seconde, soms bijna op het einde, soms een keer gewoon niet (maar das uniek). Het enige wat ik dan kan doen is het programma afsluiten (hij reageerd verder nog wel), en opnieuw openen.
Nu ben ik er 99% zeker van dat het ergens in deze routine in de soep loopt (uitleg volgt):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| Procedure Render;
var
CurrentEvent : DWord;
Msg : TMgs;
begin
EventNr := FrameNr mod EventCount;
CurrentEvent := MsgWaitForMultipleObjects(EventCount, SoundEventArray[0],
False, INFINITE, QS_ALLINPUT);
If (CurrentEvent >= WAITOBJECT_0 + EventCount) then
While PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
begin
If Msg.Message = WM_QUIT then BREAK;
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
If (CurrentEvent - WAIT_OBJECT_0) = EventNr then
begin
If FrameNr > 0 then ShowFrame;
RenderFrame;
end;
end; |
EventNr is het index nummer uit de event array waar het programma eigenlijk op wacht. Doe ik dit niet (dus reageert op elke index uit de array als de play positie voorbij een marker komt) dan raakt het filmpje uit sync na pauseren. Vraag me niet waarom maar zo werkt het prima.
Get bovenste gedeelte (While PeekMessage...) ben ik tegengekomen op vele sites hierover. Ik heb heel veel varianten hierop geprobeerd. Sommigen zorgden voor minder freezes dan anderen, maar geen enkele loste het probleem op
Ik heb geprobeerd met MsgWaitForSingleObject, dat zorgde ervoor dat ie m'n filmpje in sprongetjes afspeelde.
Ik heb geprobeerd zonder...laat ik daar maar over zwijgen
Anyways, m'n filmpjes freezen nog steeds, het ligt bijna zeker aan de code hierboven. Voor alle duidelijkheid: Hij decodeerd WEL alle frames tijdens de freeze, hij laat ze alleen niet zien
edit:
De code wat browser-vriendelijker gemaakt
De code wat browser-vriendelijker gemaakt