DivX videó lejátszás

DivX videó lejátszás
2008-03-06T16:44:24+01:00
2008-03-16T17:00:52+01:00
2022-11-07T23:41:55+01:00
Sx Xavier
Hi!

Egy Webkamera képét kell elmentenem és visszajátszanom egy Delphi program segítségével. A videoképet sikerült elmentenem tömörített formában, és a Windows Media Player meg is birkózik az elkészített fájllal.

A TMediaPlayer kompnenssel viszont nem sikerült lejátszani a fájlokat. Mi lehet az oka, hogy nem múködik? Esetleg van valahol némi infó arról, hogyan lehet a DirectShow vagy más eszközök segítségével lejátszani a fájlt?
Mutasd a teljes hozzászólást!
Na ennyire azért nem kell túlkomplikálni. Ehhez a kis demonstrációhoz bőven elég ennyi:

program DirectShow; {$APPTYPE CONSOLE} uses SysUtils, Windows, ActiveX, DirectShow9; var GraphBuilder: IGraphBuilder; MediaControl: IMediaControl; MediaEvent : IMediaEvent; HR : HRESULT; EventCode : Longint; const AVIFILE_NAME: WideString = 'C:\Downloads\HIM\HIM - Sweet Pandemonium.wmv'; //------------------------------------------------------------------------------ // kivételt dobunk a DirectShow rendszerhibával, feltéve ha kell // procedure ThrowExceptionForHR(HR: HRESULT); var Buffer: array[0..MAX_ERROR_TEXT_LEN] of Char; begin if Failed(HR) then begin if AMGetErrorText(HR, Buffer, MAX_ERROR_TEXT_LEN) = 0 then StrPCopy(Buffer, Format('Unknown error: %d', [HR])); raise Exception.Create(Buffer); end; end; begin CoInitialize(nil); try WriteLn('Creating Filter Graph Manager...'); // FilterGraph létrehozása HR:= CoCreateInstance( CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, GraphBuilder ); ThrowExceptionForHR(HR); // felületek kinyerése GraphBuilder.QueryInterface(IID_IMediaControl, MediaControl); GraphBuilder.QueryInterface(IID_IMediaEvent, MediaEvent); WriteLn('Opening the file... '); // renderelés HR:= GraphBuilder.RenderFile(PWideChar(AVIFILE_NAME), nil); ThrowExceptionForHR(HR); // lejátszás elindítása HR:= MediaControl.Run; ThrowExceptionForHR(HR); MediaEvent.WaitForCompletion(INFINITE, EventCode) except on E: Exception do Write(E.Message); end; CoUninitialize; ReadLn; end.
Mutasd a teljes hozzászólást!

  • A TMediaPlayer nem igazán ilyen modern dolgokra való.
    2 lehetőséget ajánlok:

    - Component -> Import AxtiveX Control-> Windows Media Player (Version 1.0): ezzel használhatod a TWindowsMediaPlayer-t, ami tulajdonképpen egy 10-es Media Player

    - http://player.sagura.com/mpdemo.zip ez egy külső dll, amivel teljesen egyedi lejátszót lehet készíteni, nekem mindent lejátszott még az mkv kiterjesztésű HD filmet is.
    Mutasd a teljes hozzászólást!
  • Én a képek kiszedéséhez is a DirectShow-t használom: Kamerák képének rögzítése

    Az, hogy egyes dolgokat nem játszik le a media player, annak több oka is lehet. Ha pl. egy üres fekete kép jelenik meg, esetleg hanggal, akkor majdnem biztos, hogy codec gond van. Én az FFDShow-t használom és javaslom másnak is, a többi szutyokkal ellentétben (mint pl. ACE mega codec, ami pl. az MPEG-re elég káros kihatással tud lenni ): FFDShow

    Én írtam a DiectShow használatáról egy kis bevezető cikket, ugyan C#-ban, de hátha segít: DirectShow. Ott van minden az elejétől a végéig, még a tavaly május körüli bejegyzéseim körül lehet.
    Mutasd a teljes hozzászólást!
  • Szükséged lesz 1 gombra, 1 panel illetve 1 média lejátszó komponensre. Aztán írd be az állábiakat. Annyi baj van vele, hogy csak az mpg illetve az mpeg-et játsza le. De ha az Avi átnevezed mpg-re akkor azt lejátsza a többi fájl formátumot nem próbáltam.

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    MediaPlayer1.FileName:='az elérési út meg adása vagy opendialog használata';
    MediaPlayer1.open;
    MediaPlayer1.Display:=panel1;
    MediaPlayer1.DisplayRect:=Panel1.ClientRect;
    MediaPlayer1.Play;
    end;
    Mutasd a teljes hozzászólást!
  • A rögzítésen már túl vagyok (pont ezt használtam mintának), a lejátszáshoz kell segítség. Elkezdtem tapogatózni a DirectShow irányába, de egyelőre nyögvenyelősen megy a dolog.

    Sajnos Turbo Delphi Explorerben kell megcsinálni a dologt, abba meg nem lehet más kompikat importálni...

    Gizmo... A TMediaPlayer állítgatásán túl vagyok már rég...
    Mutasd a teljes hozzászólást!
  • A DirectShow-hoz nem kell külső komponenseket telepíteni. Az egész COM alapú, megcsinálták hozzá a Delphi unitokat is, úgyhogy az, hogy az Explorer verziókat használod nem akadály. Többek között a Windows Media Player is erősen erre épül. Piszok egyszerű egyébként használni, minden ott van a blogomban.
    Mutasd a teljes hozzászólást!
  • Tudom, közben rátaláltam a neten egy-két hasznos linkre a témában. Azért köszi a segítséget, és várom továbra is az ötleteket.
    Mutasd a teljes hozzászólást!
  • Üdv!
    importáld a MediaPlayer ActiveX-et és a TMediaPlayered képes lesz lejátszani, ha telepítve vannak a megfelelő kodekek.
    Mutasd a teljes hozzászólást!
  • Nahh, azóta találtam a MSDN-en egy viszonylag érthető, konzolos példapogramot. Letöltöttem mellé a Clootie-flée Delphis-s DirectX SDK átírást, és átírtam a C++ kódot Delphire, ami viszont sajnos nem működik.


    program ConPlay2; {$APPTYPE CONSOLE} uses SysUtils, Windows, ActiveX, DirectShow9 in 'W:\SDK\Microsoft DirectX SDK (2007) Delphi\Borland_D9-10\DirectShow9.pas', Direct3D9 in 'W:\SDK\Microsoft DirectX SDK (2007) Delphi\Borland_D9-10\Direct3D9.pas', DXTypes in 'W:\SDK\Microsoft DirectX SDK (2007) Delphi\Borland_D9-10\DXTypes.pas', DirectSound in 'W:\SDK\Microsoft DirectX SDK (2007) Delphi\Borland_D9-10\DirectSound.pas', DirectDraw in 'W:\SDK\Microsoft DirectX SDK (2007) Delphi\Borland_D9-10\DirectDraw.pas', UTools in '..\..\..\..\..\_Libraries\Delphi\UTools.pas'; type TpIGraphBuider = ^IGraphBuilder; var myGraphBuilder: ^IGraphBuilder; myMediaControl: ^IMediaControl; myMediaEvent: ^IMediaEvent; myPGraphBuilder, myPMediaControl, myPMediaEvent: ^Pointer; myHr: HRESULT; myEventCode: Longint; myPNameStr: PWideChar; AVIFILE_NAME: string = 'test.avi'; begin (* New(myGraphBuilder); New(myMediaControl); New(myMediaEvent); *) myPGraphBuilder := @myGraphBuilder; myPMediaControl := @myMediaControl; myPMediaEvent := @myMEdiaEvent; Write('Initializing COM library... '); myHr := CoInitialize(nil); if Failed(myHR) then HaltMessageCMD(#13 + 'ERROR - Could not initialize COM library') else Writeln('Done.'); write('Creating Filter Graph Manager... '); myHR := CoCreateInstance( CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, myPGraphBuilder ); if Failed(myHR) then HaltMessageCMD(#13 + ' ERROR - Could not create the Filter Graph Manager.') else Writeln('Done.'); myGraphBuilder := myPGraphBuilder^; if not(Assigned(myGraphBuilder)) then HaltMessageCMD(' ERROR - Address of interface unknown.'); myHR := myGraphBuilder.QueryInterface(IID_IMediaControl, myMediaControl); Writeln('Done'); Write('Creating render event inteface... '); myHR := myGraphBuilder.QueryInterface(IID_IMediaEvent, myPMediaEvent); Writeln('Done.'); Write('Opening the file... '); GetMem(myPNameStr, Length(AVIFILE_NAME)); StringToWideChar(AVIFILE_NAME, myPNameStr, Length(AVIFILE_NAME)+1); myHR := myGraphBuilder.RenderFile(myPNameStr, nil); Writeln('Done.'); if Succeeded(myHR) then begin myHR := myMediaControl.Run; if Succeeded(myHR) then begin myMediaEvent.WaitForCompletion(INFINITE, myEventCode) end; end; myMediaControl._Release; myMediaEvent._Release; myGraphBuilder._Release; CoUninitialize; readln; end.

    A "CoCreateInstance" még rendben lefut. Minden mutat valahova, viszont ahogy használni akarom az újonnan létrehozott példányt, megáll a dolog. Valakinek tapasztalata, ötlete?
    Mutasd a teljes hozzászólást!
  • Nem egészen értem hogy mi a bajod, nekem (D7) a Tmediaplayer simán lejátsza a divx-es dolgokat. Semmi extra nem kell hozzá csak hogy a gépen meg legyen a codek, de az meg amúgy is kell minden lejátszó mellé, pláne ha még kódolsz is. Szóval neked miért nem megy értem ez alatt hogy milyen hibaüzenetet kapsz ha megpróbálod?
    Mutasd a teljes hozzászólást!
  • Nekem sem igazn világos. Én mondjuk Turbo Delphit használok (Ugye, a kereskedelem...)

    A program kimenete:
    W:\Projects\Ruget\ActiveCam\_CurrentVersion\.Dev\ConPlay>conplay2 Initializing COM library... Done. Creating Filter Graph Manager... Done. Creating render control interface... Exception EAccessViolation in module ConPlay2.exe at 8B55EF8B. Access violation at address 8B55FF8B. Read of address 8B55FF8B.
    Mutasd a teljes hozzászólást!
  • Hmmm... érdekes.
    1. Milyen fomrátumban mented le a videót? Most nem arra gondolok hogy divx törmörítés hanem hogy kiterjesztés szerint. Csak mert a buta Tmediaplayer nem a fájl tartalma alapján akarja lejátszani a dolgokat hanem a kiterjesztés alapján és ha mondjuk oda *.divx van írva akkor hiába is próbálod. Úgy itt sem megy (hibaüzi) még ha nem is auto-n hagyom devicetype-ot akkor sem. De átnevezem avi-ra és máris megy.

    2. Próbáltad úgy hogy nem adsz meg a Tmediaplayer-nek display-t. Ebben az esetben egy új ablakot nyit és ott játsza le a filmet.
    Mutasd a teljes hozzászólást!
  • Sima aviként. Van a Prog.hu-n egy video tömörítő példaprogi, az alapján írtam egy osztályt, ami összefűz egy rakás képet videofájlnak.

    Nem próbáltam. De egyrészt mindenképp ott kell, ahova én akarom rakni, másrészt pedig pl a "Length" tulajdonsága 1. Pedig kemény 20 mp-s video.
    Mutasd a teljes hozzászólást!
  • Most mondanám hogy küld át a videot ha nem valami titkos izé és megnézem hogy itt mit csinál vele az mp. PMben adok címet ha kell.
    Mutasd a teljes hozzászólást!
  • Oks, elküldöm. De csak hétfőn leszek majd netközelben.
    Mutasd a teljes hozzászólást!
  • Nekem nem sürgős. Küldtem PM-et.
    Mutasd a teljes hozzászólást!
  • Na ennyire azért nem kell túlkomplikálni. Ehhez a kis demonstrációhoz bőven elég ennyi:

    program DirectShow; {$APPTYPE CONSOLE} uses SysUtils, Windows, ActiveX, DirectShow9; var GraphBuilder: IGraphBuilder; MediaControl: IMediaControl; MediaEvent : IMediaEvent; HR : HRESULT; EventCode : Longint; const AVIFILE_NAME: WideString = 'C:\Downloads\HIM\HIM - Sweet Pandemonium.wmv'; //------------------------------------------------------------------------------ // kivételt dobunk a DirectShow rendszerhibával, feltéve ha kell // procedure ThrowExceptionForHR(HR: HRESULT); var Buffer: array[0..MAX_ERROR_TEXT_LEN] of Char; begin if Failed(HR) then begin if AMGetErrorText(HR, Buffer, MAX_ERROR_TEXT_LEN) = 0 then StrPCopy(Buffer, Format('Unknown error: %d', [HR])); raise Exception.Create(Buffer); end; end; begin CoInitialize(nil); try WriteLn('Creating Filter Graph Manager...'); // FilterGraph létrehozása HR:= CoCreateInstance( CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, GraphBuilder ); ThrowExceptionForHR(HR); // felületek kinyerése GraphBuilder.QueryInterface(IID_IMediaControl, MediaControl); GraphBuilder.QueryInterface(IID_IMediaEvent, MediaEvent); WriteLn('Opening the file... '); // renderelés HR:= GraphBuilder.RenderFile(PWideChar(AVIFILE_NAME), nil); ThrowExceptionForHR(HR); // lejátszás elindítása HR:= MediaControl.Run; ThrowExceptionForHR(HR); MediaEvent.WaitForCompletion(INFINITE, EventCode) except on E: Exception do Write(E.Message); end; CoUninitialize; ReadLn; end.
    Mutasd a teljes hozzászólást!
  • Egy kicsit tényleg túlbonyolítottam a dolgot: ahelyett, hogy közvetlenül az IGraphBuilder-t használtam volna, mindenféle mutatókkal próbálkoztam. Persze, hogy nem jött össze...

    Kösz a tippet, bdcc32, tied a pont!
    Mutasd a teljes hozzászólást!
  • Szívesen.

    Elfelejtettem, hogy ez most Delphi, ezek helyett:

    GraphBuilder.QueryInterface(IID_IMediaControl, MediaControl); GraphBuilder.QueryInterface(IID_IMediaEvent, MediaEvent);

    rövidebben:

    MediaControl:= GraphBuilder as IMediaControl; MediaEvent := GraphBuilder as IMediaEvent;

    Meg még van egy millió interfész, ami támogatott. Azokon keresztül mindent be tudsz állítani és le is tudsz kérdezni. Vagy úgy manipulálod a renderelést, ahogy akarod (lsd. DirectShow SDK).
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd