Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Verwenden der MediaInfo.DLL (https://www.delphipraxis.net/32578-verwenden-der-mediainfo-dll.html)

Garfield 25. Okt 2004 16:28


Verwenden der MediaInfo.DLL
 
Hallo,

es gibt mehrere Befehlszeilenprogramme, mit denen man Informationen zu Videodateien erhalten kann. Für mein Programm benötige ich die Spieldauer von MPEG-2-Videos.

Beim Projekt MediaInfo (http://mediainfo.sourceforge.net/, http://sourceforge.net/projects/mediainfo/) gibt es neben einem Befehlszeilentool und einer GUI auch eine DLL. Diese MediaInfo.DLL würde ich gern benutzen. Jedoch scheitere ich bereits beim Öffnen der Datei.

Die DLL ist in C++ geschrieben und in der Dokumentation steht:

Zitat:

int MediaInfoLib::MediaInfo::Open ( const std::string & File )

Open a file.


Parameters:
File File to open

Return values:
0 File not opened
1 File opened
Meine Procedure sieht so aus:

Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, MPlayer;

...

procedure TForm1.LiesDLLClick(Sender: TObject);

type
  TMediaOpen = function (Name: string) : Integer;

var
  Fehler: integer;
  LibHandle: THandle;
  MediaOpen: TMediaOpen;

  procedure add(Zeile : string);

  begin
    with Memo.Lines do Append(Zeile);
  end;

begin
  try
    LibHandle := LoadLibrary ('MediaInfo.dll');
    MediaOpen := GetProcAddress (LibHandle, 'MediaInfo_Open');
    if assigned(MediaOpen)
    then begin
      Fehler := MediaOpen (Datei);
      add (IntToStr(Fehler));
    end;
  finally
    FreeLibrary (LibHandle);
  end;
end;
Der Wert für den Fehler beträgt jedoch weder 0 noch 1 sondern bei zwei verschiedenen MPEG-2-Videos zuerst 17245408 und danach 170861792. Eine Fehlermeldung bekomme ich von Delphi 3 Prof nicht.

Nachtrag:

Das einzig brauchbare erschien mir http://www.delphipraxis.net/internal...ct.php?t=29012 zu sein. Allerdings scheitert der Import mit der Meldung, dass Selbstregistrierungsinformationen fehlen.

shmia 25. Okt 2004 17:11

Re: Verwenden der MediaInfo.DLL
 
Zitat:

Zitat von Garfield
Das einzig brauchbare erschien mir http://www.delphipraxis.net/internal...ct.php?t=29012 zu sein. Allerdings scheitert der Import mit der Meldung, dass Selbstregistrierungsinformationen fehlen.

Es handelt sich nicht um eine ActiveX-DLL, sondern um eine "normale" DLL.
Delphi-Quellcode:
TMediaOpen = function (Name: string) : Integer;  // Falsch
TMediaOpen = function (Name: PChar) : Integer;  // Richtig

Garfield 25. Okt 2004 18:21

Re: Verwenden der MediaInfo.DLL
 
Zitat:

Zitat von shmia
Es handelt sich nicht um eine ActiveX-DLL, sondern um eine "normale" DLL.

Stimmt leider.

Zitat:

Zitat von shmia
Delphi-Quellcode:
TMediaOpen = function (Name: string) : Integer;  // Falsch
TMediaOpen = function (Name: PChar) : Integer;  // Richtig

Danke für den Hinweis. Ich habe es geändert. Aber leider hat sich am Ergebnis nichts geändert.

Ich habe jetzt mehrere Wochen nach Informationen gesucht und eben bin ich über das gestolpert:

http://cvs.sourceforge.net/viewcvs.p...elphi/Example/

Ist ein Delphi 7 Projekt. Mal sehen, ob es auch unter Delphi 3 Prof funktioniert.

Garfield 25. Okt 2004 20:05

Re: Verwenden der MediaInfo.DLL
 
Das Delphi Projekt läuft unter Delphi 7 Personal. In den USES ist tntstdctrls eingetragen, was nicht dabei ist. Man kann es ohne Fehlermeldung löschen. Es existiert kein Dateiöffnendialog und dementsprechend ist die Anzeige im Beispiel äußerst sinnfrei.

Nachtrag:

Unter Delphi 3 Prof gibt es den Fehler: HowToUse_Dll Modul-Header fehlt oder ist beschädigt.

Garfield 26. Okt 2004 17:42

Re: Verwenden der MediaInfo.DLL
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe versucht das gestern gefundene Delphi-Example unter D7 Personal zum Laufen zu bringen. Leider funktionierte es nicht auf Anhieb. Nach einigem Probieren habe ich es so geschafft:

1. Die MediaInfoLib - DLL (MediaInfo.DLL) und die von ihr benötigte MSVCR70.DLL gibt es auf Sourceforge (Auch unten im Archiv enthalten).

2. Das Example gab es ebenfalls bei Sourceforge.

3. Das Example habe ich angepasst.

a) In der 'HowToUse_Dll.pas' wurden die TNTSTDCTRLS aus den USES gestrichen, da die Benutzung des TntMemos anstelle des normalen Memos nur eine etwas veränderte Darstellung brachte.

b) In der 'MediaInfoDll.pas' wurden bei der Deklaration der Functions und Procedures die Variablentypen PWideChar in PChar geändert. Nun konnte der Dateiname übergeben werden und aus den vielen ? wurde lesbarer Text. Bei D3 Prof bekam ich allerdings beim Öffnen der Datei eine Fehlermeldung.

c) Nebenbei habe ich die Größe des Fensters geändert und es zentriert.

Wenn ich das ganze noch in mein D3 Prof Projekt unterbekomme, ist das Problem gelöst.

Garfield 27. Okt 2004 09:48

Re: Verwenden der MediaInfo.DLL
 
Liste der Anhänge anzeigen (Anzahl: 2)
Nun will ich diese recht einseitige Diskussion abschließen.

Die wie oben modifizierte MediaInfoDll.pas wird über USES eingebunden. Anschließend kann man die Mediadatei öffnen:
Delphi-Quellcode:
Handle := MediaInfo_Open(PChar(Datei));
Dabei ist Datei vom Typ String und wurde über einen Dialog eingegeben. Handle ist vom Typ Cardinal.

Es können Info Sets oder Einzelinformationen abgefordert werden. Die Sets dürften Stringlisten sein. Die Einzelinformationen sind Strings.

Beispiel Set:
Delphi-Quellcode:
MediaInfo_Complete_Set(false);
Memo.Text := MediaInfo_Inform(Handle);
Das Memo ist, wie kann es anders sein, ein TMemo. Einzelinfos werden mit
Delphi-Quellcode:
InfoText := MediaInfo_Get(Handle, StreamKind, StreamNumber, Parameter, KindOfInfo, KindOfSearch)
abgerufen. InfoText ist vom Typ String. Was die letzten beiden Parameter bedeuten, weiß ich nicht. Dafür habe ich die Werte aus dem Beispiel genommen. Das Handle gab es beim Öffnen der Datei. Das StreamKind bezeichnet einen bestimmten Abschnitt im InfoSet. Das sind General, Video, Audio, Text, Chapters, Image und Max. Die StreamNumber ist der Zähler für den gewünschten Stream. Der Parameter ist ein in '' eingeschlossener casesenstiver String. Er bezeichnet die gewünschte Information.

Beispiel: Abtastfrequenz der zweiten Tonspur
Delphi-Quellcode:
InfoText := MediaInfo_Get(Handle, 2, 1, 'SamplingRate_String', 1, 0);
Handle - gab's beim Öffnen der Datei,
2 - Audio,
1 - zweiter Stream,
'SamplingRate_String' - Abtastfrequenz als String, wird in kHz mit Einheit zurückgegeben,
1 - ?,
0 - ?.

Hat man alle Informationen, wird die Mediadatei wieder geschlossen:
Delphi-Quellcode:
MediaInfo_Close(Handle);
Das war es schon. Unten habe ich meine BeispielGUI angehängt. In der GUI werden in einem Memo ein InfoSet und in Editfenstern Einzelinformationen ausgegeben. Es sind einmal Source mit den beiden notwendigen DLL und einmal EXE mit DLLs. Unter D3Prof kompiliert ist die EXE 208 kB, unter D7Pers 399 kb.

Garfield 28. Okt 2004 07:54

Re: Verwenden der MediaInfo.DLL
 
Ergänzung zu

Delphi-Quellcode:
InfoText := MediaInfo_Get(Handle, StreamKind, StreamNumber, Parameter, KindOfInfo, KindOfSearch)
Delphi-Quellcode:
{     KindOfInfo  - 0 = Info_Name       : Unique name of parameter
                     1 = Info_Text       : Value of parameter
                     2 = Info_Measure    : Unique name of measure unit of
                                            parameter
                     3 = Info_Options    : InfoOption_ShowInInform    = 0
                                            InfoOption_Support         = 1
                                            -> could be N (No), R (Read only), W (Read/Write),
                                               space (Non applicable)
                                            InfoOption_ShowInSupported = 2,
                                            -> Internal use only (info : Must be showed in
                                               Info_Capacities() )
                                            InfoOption_Max             = 3
                     4 = Info_Name_Text  : Translated name of parameter
                     5 = Info_Measure_Text: Translated name of measure unit
                     6 = Info_Info       : More info about the parameter
                     7 = Info_HowTo      : Information : how data is found
                     8 = Info_Max

      KindOfSearch - Where to look for the parameter}

Amnon82 17. Mär 2006 14:51

Re: Verwenden der MediaInfo.DLL
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab mal Deine Source auf Version 0.7.1.2 upgedated.

http://img95.imageshack.us/img95/7383/mdll07124xp.png

Garfield 25. Mär 2006 08:26

Re: Verwenden der MediaInfo.DLL
 
Danke, Amnon82.

Das Handling der DLL hat sich jeweils mit den Versionen 0.5.0.0 und 0.7.0.0 geändert. Beim letzten Mal waren die Änderungen umfangreicher, so dass die Aktualisierung notwendig war.

Bei Fr_An gibt es auch eine GUI mit Source für MediaInfo Version 0.4.*.* und 0.5.*.*. Ein Update auf die 0.7.*.* hatte er eigentlich auch geplant. In SVCDPal2DVD ist es jedenfalls enthalten.

Garfield 25. Mär 2006 21:12

Re: Verwenden der MediaInfo.DLL
 
Ich denke wegen
Delphi-Quellcode:
{*******************************************************************}
{*** Öffnen der Mediadatei / Open media file                    ***}
{*******************************************************************}
    Handle := MediaInfoA_New();
    MediaInfoA_Open(Handle,PChar(Datei));
sollte nach
Delphi-Quellcode:
   { Mediadatei schließen , close media file}

    MediaInfoA_Close(Handle);
noch ein
Delphi-Quellcode:
    MediaInfoA_Delete(Handle);
eingefügt werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:45 Uhr.
Seite 1 von 5  1 23     Letzte »    

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