![]() |
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 ( ![]() ![]() Die DLL ist in C++ geschrieben und in der Dokumentation steht: Zitat:
Delphi-Quellcode:
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.
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; Nachtrag: Das einzig brauchbare erschien mir ![]() |
Re: Verwenden der MediaInfo.DLL
Zitat:
Delphi-Quellcode:
TMediaOpen = function (Name: string) : Integer; // Falsch
TMediaOpen = function (Name: PChar) : Integer; // Richtig |
Re: Verwenden der MediaInfo.DLL
Zitat:
Zitat:
Ich habe jetzt mehrere Wochen nach Informationen gesucht und eben bin ich über das gestolpert: ![]() Ist ein Delphi 7 Projekt. Mal sehen, ob es auch unter Delphi 3 Prof funktioniert. |
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. |
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 ![]() 2. Das Example gab es ebenfalls bei ![]() 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. |
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:
Dabei ist Datei vom Typ String und wurde über einen Dialog eingegeben. Handle ist vom Typ Cardinal.
Handle := MediaInfo_Open(PChar(Datei));
Es können Info Sets oder Einzelinformationen abgefordert werden. Die Sets dürften Stringlisten sein. Die Einzelinformationen sind Strings. Beispiel Set:
Delphi-Quellcode:
Das Memo ist, wie kann es anders sein, ein TMemo. Einzelinfos werden mit
MediaInfo_Complete_Set(false);
Memo.Text := MediaInfo_Inform(Handle);
Delphi-Quellcode:
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.
InfoText := MediaInfo_Get(Handle, StreamKind, StreamNumber, Parameter, KindOfInfo, KindOfSearch)
Beispiel: Abtastfrequenz der zweiten Tonspur
Delphi-Quellcode:
Handle - gab's beim Öffnen der Datei,
InfoText := MediaInfo_Get(Handle, 2, 1, 'SamplingRate_String', 1, 0);
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:
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.
MediaInfo_Close(Handle);
|
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} |
Re: Verwenden der MediaInfo.DLL
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab mal Deine Source auf Version 0.7.1.2 upgedated.
![]() |
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 ![]() |
Re: Verwenden der MediaInfo.DLL
Ich denke wegen
Delphi-Quellcode:
sollte nach
{*******************************************************************}
{*** Öffnen der Mediadatei / Open media file ***} {*******************************************************************} Handle := MediaInfoA_New(); MediaInfoA_Open(Handle,PChar(Datei));
Delphi-Quellcode:
noch ein
{ Mediadatei schließen , close media file}
MediaInfoA_Close(Handle);
Delphi-Quellcode:
eingefügt werden.
MediaInfoA_Delete(Handle);
|
Re: Verwenden der MediaInfo.DLL
@Garfield,
sorry wenn ich den alten Thread nochmal "herauskrame"... Ich wollte die MediaInfoDLL.pas um die Funktion "MediaInfo_Info_Version()" erweitern, die in der aktuellen DLL v0.7.18 (immer noch) enthalten ist:
Delphi-Quellcode:
Allerdings erhalte ich beim Aufruf anstelle der Versionsnummer nur folgenden Funktionswert:
interface
function MediaInfo_Info_Version: PChar cdecl stdcall; implementation function MediaInfo_Info_Version; external 'MediaInfo.Dll'; 'Your software uses an outdated interface, You must use MediaInfo.DLL 0.4.1.1 instead' Was mache ich da falsch? Oder kann man die DLL-Versionsnummer auch anders auslesen? Nachtrag: Die DLL aus deinem BeispielGUI (0.7.1.2) liefert das selbe Ergebnis. Nachtrag 2: So funktionierts:
Delphi-Quellcode:
Um auch ältere Versionen der DLL zu unterstützen kann man beide auch kombinieren:
MediaInfo_Option(0,'Info_Version',''); // liefert 'MediaInfoLib - v0.7.18'
(analog zu ![]()
Delphi-Quellcode:
.sundance.
result := MediaInfo_Info_Version();
if Pos('MediaInfoLib', result) = 0 then result := MediaInfo_Option(0,'Info_Version',''); |
Re: Verwenden der MediaInfo.DLL
Delphi-Quellcode:
Aus der Demo auf dieser
function String_holen : String;
begin Result := ''; @MediaInfo_Info_Version := NIL; @MediaInfo_Option := NIL; lib := LoadLibrary(@szNameDLL[1]); if lib <> 0 then try @MediaInfo_Info_Version := GetProcAddress(lib, @szNameMediaInfo_Info_Version[1]); if Assigned(MediaInfo_Info_Version) then Result := MediaInfo_Info_Version(); if pos('MediaInfoLib', Result) > 0 then Exit; @MediaInfo_Option := GetProcAddress(lib, @szNameMediaInfo_Option[1]); if Assigned(MediaInfo_Option) then Result := MediaInfo_Option (0, 'Info_Version', ''); except end; end; ![]() |
Re: Verwenden der MediaInfo.DLL
Garfield,
vielen Dank für deine Antwort. Leider bin ich jetzt noch auf ein Problem gestoßen. Wie kann ich ermitteln, ob und wieviele Kapitelmarken in einem Matroska-Container enthalten sind? So habe ich's schon (ohne Erfolg) probiert:
Delphi-Quellcode:
Edit:
FNumChapters := MediaInfoA_Get(FHandle, 0,0, 'ChaptersCount', 1,0);
FNumChapters := MediaInfoA_Get(FHandle, 4,0, 'Count', 1,0); FNumChapters := MediaInfoA_Get(FHandle, 4,0, 'Total', 1,0); Für das Ermitteln der Forced- und Default-Flags habe ich auch keinen Weg gefunden... Siehe Output von mkvinfo:
Code:
| + A track
| + Track number: 2 | + Track UID: 2808210362 | + Track type: audio | + Enabled: 1 | + Default flag: 1 | + Forced flag: 1 | + Lacing flag: 1 | + MinCache: 0 | + Timecode scale: 1 | + Max BlockAddition ID: 0 | + Codec ID: A_AC3 | + Codec decode all: 1 | + Default duration: 32.000ms (31.250 fps for a video track) | + Language: ger | + Audio track | + Sampling frequency: 48000 | + Channels: 6 |
Re: Verwenden der MediaInfo.DLL
Hier gibt ein wenig zu Matroska
![]() |
Re: Verwenden der MediaInfo.DLL
Garfield,
danke für den Hinweis im D9-Forum. Dort habe ich (mit Hilfe des Autors von MediaInfo) folgendes in Erfahrung gebracht: Zitat:
Zitat:
Delphi-Quellcode:
Das Auslesen der Flags ist im Moment leider noch nicht möglich...
// Anzahl der Kapitelmarken auslesen (altes und neues Verfahren ab v0.7.13)
FNumChapters := GetMediaInfoInt(FHandle, skGeneral, 0, 'ChaptersCount'); if (FNumChapters = 0) then begin num := GetMediaInfoInt(FHandle, skGeneral, 0, 'MenuCount'); if (num > 0) then for k:=0 to pred(num) do begin st := GetMediaInfoStr(FHandle, skMenu, k, 'StreamKind'); if CompareText(st, 'menu') = 0 then begin c1 := GetMediaInfoInt(FHandle, skMenu, k, 'Chapters_Pos_Begin'); c2 := GetMediaInfoInt(FHandle, skMenu, k, 'Chapters_Pos_End'); FNumChapters := c2 - c1; end; end; end; .sundance. |
Re: Verwenden der MediaInfo.DLL
Wenn Du nur Informationen zu Matroska willst, solltest Du Dir etwas eigenes entwickeln. Informationen findest Du auf
![]() ![]() ![]() ![]() |
Re: Verwenden der MediaInfo.DLL
Vielen Dank nochmal für deine Hilfe.
Ich habe mittlerweile noch eine interessante Matroska-Implementation gefunden: ![]() Für mein Progrämmchen werde ich mit nur einer "3rd-Party-DLL" nicht auskommen. Denn zum einen brauche ich eine komplette Streamübersicht (video/audio/subs/chapter/attachments), die ich z.B. mit obiger DLL oder auch mit dem output von mkvinfo von Moritz Bunkus bekommen kann. Leider kann ich über diese Schnittstellen nicht allzuviel über die Specs der einzelnen Streams (z.b. Audio-Bitrate) ermitteln; da hilft mir im Moment nur die mediainfo.dll weiter (die aber leider keine Attachments "kennt", bzw. man kann nur feststellen, ob welche da sind)... .sundance. |
Re: Verwenden der MediaInfo.DLL
Ich benutze D2009 und habe immer das Problm, dass ich nur schwarze dünne Striche sehe, statt Buchstaben und Texte.
|
Re: Verwenden der MediaInfo.DLL
Liegt vielleicht an Ansi und Wide.
|
AW: Verwenden der MediaInfo.DLL
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo, ich weiß das Thema ist älter, aber ich habe mich gestern mit der MediaInfo.dll beschäftigt und habe mir das Beispiel von Amnon82 geladen. Ich habe die exe erzeugt und kann die Edit-felder nicht lesen.
Ich habe ein Bild anbei könnte mir bitte jemand helfen Gruß Nero |
AW: Verwenden der MediaInfo.DLL
Liste der Anhänge anzeigen (Anzahl: 1)
Er hat bei der ANSI-Version Mist gebaut ... PChar muß dort explizit PAnsiChar sein usw. (drum funktionierte es bis D2007 noch)
Schnelle Lösung: Verwende seine Unicode-Variante, denn die ist scheinbar korrekt implementiert. Wobei du mit der Unicode-Version eh besser kommst, da dein Delphi sowieso Unicode ist. [add] Unicode und ANSI zusammengeschmissen ... je nach Delphi wird das Passende verwendet. |
AW: Verwenden der MediaInfo.DLL
himitsu, Tausend Dank :thumb: :thumb: :thumb:
Hat perfekt funktioniert Gruß Nero |
AW: Verwenden der MediaInfo.DLL
Liste der Anhänge anzeigen (Anzahl: 1)
Ich greif das Thema nochmal auf, weil ich leider nen kleines Problem habe.
wenn ich die heruntergeladene Exe-Datei benutze, funktioniert es (allerdings nicht für MP4-Dateien). Sobald ich aber den Source nehme und einmal selber kompiliere, sieht es aus wie aus dem angehängten Screenshot. Kann einer von euch was damit anfangen? |
AW: Verwenden der MediaInfo.DLL
Sieht so aus, als hättest Du einen Ansi-Source mit einem Unicode-Delphi übersetzt.
|
AW: Verwenden der MediaInfo.DLL
Siehe Bild in Antwort #20
Lösung: siehe die nachfolgenden Antworten |
AW: Verwenden der MediaInfo.DLL
Oh man.... Ich sollte aufhören die Threads nur zu überfliegen!!!! :oops:
Entschuldigung dafür! Und weiß einer von euch, warum ich bei MP4-Dateien bspw. keine PlayTime bekomme? |
AW: Verwenden der MediaInfo.DLL
Dateien defekt/fehlerhaft?
Oder... MP4 ist nur ein Container für verschiedne Formate ... Entweder wird das entsprechende DatenFormat nicht richtig unterstützt oder es gibt mit anderen enthaltenen Daten irgendwelche Probleme. |
AW: Verwenden der MediaInfo.DLL
Hallo zusammen.
Ich habe die Doku(s) derer ich habhaft werden konnte hin und her gelesen, finde aber keine Antwort auf meine Frage. Mein selber geklöppeltes Tool macht soweit alles richtig, liest brav die gewünschten Werte aus, versucht das aber auch bei anderen (teils) versteckten Dateien in einem Verzeichnis - z.B. der berühmten Thumbs.db. Dass da nur Quark rauskommt ist ja klar. Was ich vermisse ist eine Funktion "MediaInfo_IsValidFile", die mir zurückgibt, ob ich überhaupt versuche eine Moviedatei, welches Format auch immer, öffnen möchte. Ich habe es mal damit versucht die Stream-Anzahl auszulesen und bei Videofiles sollte die ja mindestens 1 sein. Aber hier bekomme ich ein paar "false positives", nämlich bei einigen MP4-Files, die ich anstandslos auf allen möglichen Geräten abspielen kann, mein Tool ermittelt aber Stream-Anzahl Null. Während die anderen Werte (Höhe, Breite, Laufzeit,....) alle korrekt sind. Also? Wie überprüfe ich, ob ich da überhaupt eine Moviedatei zwischen den Fingern habe? Danke schon mal.... |
AW: Verwenden der MediaInfo.DLL
Liste der Anhänge anzeigen (Anzahl: 2)
Hier sind alle Infos:
![]() Es gibt eine Database im Anhang. |
AW: Verwenden der MediaInfo.DLL
Auch ich greife das Thema auf, hat da wer irgendetwas aktuelles für Delphi 10 und 4K MKVs?
|
AW: Verwenden der MediaInfo.DLL
Zitat:
Um was geht es? gruss |
AW: Verwenden der MediaInfo.DLL
Wie ich am besten auf die MediaInfo dll zugreifen kann, ich bräuchte die lauflänge und Bitrate von einen mkv Video.
|
AW: Verwenden der MediaInfo.DLL
Zitat:
(Das ist ja mal eine Frechheit sowas!) Aber ein paar mehr Information könnten schon hilfreich sein damit man weiß was Du möchtest oder worin das Problem liegt. |
AW: Verwenden der MediaInfo.DLL
Zitat:
Und hole dir dann über (Hier BitRate)
Delphi-Quellcode:
MediaInfo_Get(handle, Stream_Video, iCpt, 'BitRate', Info_Text, Info_Name);
Die benötigten Informationen. gruss |
AW: Verwenden der MediaInfo.DLL
Mit un4seen Bass sollte man auch ans ziel kommen.
Die hatten mal ne BassVideo, ich glaub das wurde von BassDShow oder so abgelöst. |
AW: Verwenden der MediaInfo.DLL
Zitat:
Schon mal verwendet das du es hier als Alternative anpreist? Sorry das ist Klugscheiss.. Zitat:
gruss |
AW: Verwenden der MediaInfo.DLL
Oki, habs vergessen. Toi toi
|
AW: Verwenden der MediaInfo.DLL
Ich will mal nicht so sein.
Hier eine funktionierende Form. In dein Projekt einbinden die Form MediaInfoForm von außen aufrufen. Dafür sorgen das sich im Pfad die richtige Version der MediaInfo.dll befindet. (Ich habe die letzte (x64) verwendet und die *.pas dementsprechend angepasst) Die Infos findest du dann im Memo. Was du dann nur noch machen musst ist die beiden Funktionen aus dem Kram heraus zu parsen oder wie gezeigt alleine mit der jeweiligen Funktion auszulesen. Die DLL ist NICHT enthalten. gruss |
AW: Verwenden der MediaInfo.DLL
Danke für deine Tipps @EWeiss!
Hier die DLL herunterladen: ![]() Vom Paket die MediaInfoDLL.pas zum Projekt hinzufügen und in die Uses einbinden. DLL zur Anwendung(EXE) dazulegen.
Code:
procedure TfrmMain.FormCreate(Sender: TObject);
begin ... MediaInfoDLL_Load('MediaInfo.dll'); ... end; procedure TfrmMain.GetMediaInfo(FileName : String; var Runtime : Integer; var Bitrate : Double); var Handle: Cardinal; iCpt : Integer; Value : PWideChar; iHelp : Integer; str : String; P : Integer; begin Handle := MediaInfo_New(); MediaInfo_Open(Handle, PWideChar(FileName)); Value := MediaInfo_Get(Handle, Stream_Video, 0, 'BitRate', Info_Text, Info_Name); iHelp := StrToIntDef(Value, 0); BitRate := iHelp / 1000000; Value := MediaInfo_Get(Handle, Stream_Video, 0, 'Duration', Info_Text, Info_Name); str := Value; P := Pos('.', str); str := Copy(Value, 1, P-1); iHelp := StrToIntDef(str, 0); Runtime := iHelp div 60000; MediaInfo_Close(Handle); end; |
AW: Verwenden der MediaInfo.DLL
Und geht alles wie gewünscht?
iCpt wird nie verwendet kannst rausschmeißen. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 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