Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi TMediaplayer: Ruckeln bei XVid (https://www.delphipraxis.net/84621-tmediaplayer-ruckeln-bei-xvid.html)

GlobalImpact 19. Jan 2007 00:36


TMediaplayer: Ruckeln bei XVid
 
Hallo,
ich möchte ein kleines Programm schreiben um meine Facharbeit, einen gerenderten Film zu verpacken.
Mein Film liegt aus Platzgründen als Xvid vor.
Um den Film in einem Panel abzuspielen verwende ich TMediaplayer.
Klappt soweit auch alles ganz gut, nur nun kommt das eigentliche Problem, das ich mir eigentlich nicht erklären kann. In jedem Player von VLC bis WindowsMediaPlayer lässt sich mein Film problemlos und absolut ruckelfrei (hat 27fps) abspielen, nur über TMediaplayer ruckelt er, gerade so, als würden nur noch 15 fps angezeigt werden.
Ich habe festgestellt, je stärker ich die Kompression in XVid stelle, genauer gesagt besonders die "Motion Search Precision" desto stärker ist das Ruckeln ausgeprägt. Eine hohe "Motion Search Precision" ist aber notwendig, da die Qualität sonst sehr stark leidet.
Gibt es irgendeine Möglichkeit den Film in Delphi anständig (und möglichst unkompliziert) zum Laufen zu kriegen?


Danke für die Antwort

mfg

Global Impact


PS:
Meine Delphiversion ist Turbodelphi Explorer

Mein Computer:
2BG Ram, 3800+ X2 Dualcore und Geforce 7900 GT

Ich sollte also eigentlich in der Lage sein einen Film mit der Auflösung 640 * 480 und 27 fps kodiert in XVid ruckelfrei über Delphi abzuspielen.
Ich habs auch bei meinem Bruder mal probiert, er hat 3 Ghz, und auch da isses nur über Delphi ruckelig.

Gandalfus 19. Jan 2007 22:47

Re: TMediaplayer: Ruckeln bei XVid
 
TMediaplayer ist so langsam weil er auf einer veralteten api basiert. Videos muss man mit directX oder vergleichbarem abspielen bzw mit DSpack wenn man nicht sobviel Aufwand betreiben will.

loetmann 20. Jan 2007 02:46

Re: TMediaplayer: Ruckeln bei XVid
 
Hallo,

eine andere Möglichkeit währe den VLC-Player über ActiveX einzubinden.

Ein Gruß

GlobalImpact 20. Jan 2007 03:25

Re: TMediaplayer: Ruckeln bei XVid
 
Hallo,
erstmal danke für die Antworten!
Gibt es denn eine Möglichkeit, mit Standard-Delphi-Komponenten Filme über DirectX abzuspielen? (Habe leider TurobDelphi Explorer, kann also keine externen Komponenten installieren)

mfg

Global Impact

Ydobon 20. Jan 2007 09:02

Re: TMediaplayer: Ruckeln bei XVid
 
Zumindest brauchst du die DX-Header Übersetzungen bzw. gleich mit Komponenten das DSPack. Es sollte nicht sehr aufwendig sein, die Komponenten erst zur Laufzeit zu erstellen.
Eine primitivst Wiedergabe ohne Komponenten könnte so aussehen. Opendialog, Panel oben, darauf 2 Button und 2 Label, das Video wird einfach auf das Formular geknallt (bzw. per put_Owner() auf eine passende Komponente). Wie es sich für DirectShow gehört, schluckt es dann jede Mediendatei, die der Computer wiedergeben kann.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var pGraph: IGraphBuilder;
    pMediaControl: IMediaControl;
    pEvent: IMediaEvent;
    pSeek: IMediaSeeking;
    pVidWin: IVideoWindow;
    evCode, x, y, lpParam1, lpParam2: Integer;
    tim, dim: Int64;
begin
  if Not OpenDialog1.Execute then exit;
  CoCreateInstance(CLSID_FilterGraph, Nil, CLSCTX_INPROC_SERVER,
                    IID_IGraphBuilder, pGraph);
  pGraph.QueryInterface(IID_IMediaControl, pMediaControl);
  pGraph.QueryInterface(IID_IMediaEventEx, pEvent);
  pGraph.RenderFile(PWideChar(WideString(OpenDialog1.FileName)), Nil);
  pGraph.QueryInterface(IID_IMediaSeeking, pSeek);
  pSeek.GetDuration(tim);
  Label1.Caption:=IntToStr(tim div 10000000);
  pGraph.QueryInterface(IID_IVideoWindow, pVidWin);
  pVidWin.put_Owner(Handle);
  pVidWin.put_WindowStyle(WS_CHILD);
  pVidWin.get_Width(x);
  pVidWin.get_Height(y);
  pVidWin.SetWindowPosition(2, Panel1.Height+2, x, y);
  weiter:=true;
  pMediaControl.Run;
  while weiter do
  begin
    if pEvent.GetEvent(evCode, lpParam1, lpParam2, 0)<>E_ABORT then
    begin
      if evCode=EC_COMPLETE then weiter:=false;
      pEvent.FreeEventParams(evCode, lpParam1, lpParam2);
    end;
    pSeek.GetPositions(tim, dim);
    Label2.Caption:=IntToStr(tim div 10000000);
    Application.ProcessMessages;
  end;
  pVidWin.put_Visible(FALSE);
  pVidWin.put_Owner(0);
  pVidWin._Release;
  Pointer(pVidWin):=Nil;
  pMediaControl._Release;
  Pointer(pMediaControl):=Nil;
  pEvent._Release;
  Pointer(pEvent):=Nil;
  pGraph._Release;
  Pointer(pGraph):=Nil;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  weiter:=false;
end;
Welche Späße damit noch angestellt werden können, gibt es bei der MSDN Library

GlobalImpact 20. Jan 2007 15:49

Re: TMediaplayer: Ruckeln bei XVid
 
Puhhh,danke für die Antwort.
Ich habe nur irgendwie Verständnisschwierigkeiten bei denem Code!
Ich hab ne Delphi 5 Version aufgetrieben, und habs mal mit der probiert, doch auch da hab ich Schwierigkeiten:

Mein Code zum abspielen:

Delphi-Quellcode:
videowindow1.FilterGraph := filtergraph1;
filtergraph1.Active := true;
filtergraph1.ClearGraph;
filtergraph1.RenderFile('..\Filme\Intro.avi');
filtergraph1.Play;
Es erscheint imemr eine Meldung, der Vorgang kann nicht fortgesetzt werden, da die Filteranschlüsse nicht verbunden sind.
Habe ich Filtergraph und Videowindow nicht über:

videowindow1.FilterGraph := filtergraph1;

miteinander verbunden?


Danke für die Antwort


mfg

Global Impact

GlobalImpact 20. Jan 2007 21:58

Re: TMediaplayer: Ruckeln bei XVid
 
Habs hinbekommen, das Ding kommt scheinbar nicht gut mit XVid zurecht.
Abspielen tut ers jetz, nur das Ruckeln is nach wie vor, woran kann das nur liegen?

loetmann 22. Jan 2007 18:21

Re: TMediaplayer: Ruckeln bei XVid
 
Hallo,

wird die Datei den im normalen Player normal abgespielt?

Hast Du noch irgendwas anderes rechenintensives im Programm laufen?

Ein Gruß

GlobalImpact 23. Jan 2007 23:46

Re: TMediaplayer: Ruckeln bei XVid
 
Im normalen Player wird sie absolut ruckelfrei abgespielt.
Ich hab nichts anderes nebenbei laufen (immer maximal 3 % cpu last) und noch locker 1,5 gb ram frei.
Das ganze is bei XVid eben nur, wenn diese Motion Search Precision eingestellt is, wenn ich das ausstelle isses ruckelfrei, aber dann wird die Datei so gross, dass ich gleich auf xvid verzichten kann.
Es muss doch wohl möglich sein, eine XVid Datei ruckelfrei abzuspielen.
Ich dachte erst, dass Delphi vllt den falschen Codec nimmt oder so, weil ich in letzter Zeit viele verschiedene Codecs ausprobiert hab und auch immer wieder verschiedene XVid-Versionen installiert und deinstalliert hab, habs dann bei meinem Bruder (3GHz, Computer vor ner woche erst frisch aufgesetzt) und noch nem Computer mit 1,7 Ghz ausprobiert, selbes Problem, je langsamer der Computer, desto ruckeliger die Wiedergabe. Aber meiner Meinung nach sollte ein 1,7 Ghz Computer oder zumindest eienr mit 3Ghz doch in der Lage sein einen Film flüssig darzustellen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz