Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   WMV-Dauer ermitteln (https://www.delphipraxis.net/157931-wmv-dauer-ermitteln.html)

stahli 30. Jan 2011 13:15

WMV-Dauer ermitteln
 
Hallo zusammen,

ich lasse díe User über Buttons WMV-Videos abspielen:
Delphi-Quellcode:
ShellExecute(Handle, 'open', PChar(ClipName), '', '', SW_NORMAL);

Nun möchte ich vorher die Clipdauer im Button-Hint anzeigen.

Wie kann ich die am einfachsten ermitteln?

mkinzler 30. Jan 2011 13:21

AW: WMV-Dauer ermitteln
 
Dazu müsstest du die Metadaten der Datei auswerten
http://www.codeproject.com/KB/audio-...ataReader.aspx

stahli 30. Jan 2011 14:02

AW: WMV-Dauer ermitteln
 
Gibt es auch eine Lösung für Delphi?
Ich finde auch im Netz keinen Ansatz...

stahli 31. Jan 2011 11:34

AW: WMV-Dauer ermitteln
 
*push*

Neutral General 31. Jan 2011 11:43

AW: WMV-Dauer ermitteln
 
In Delphi funktioniert es wahrscheinlich ganz genauso^^
Du musst den Code nur eben nach Delphi übersetzen ;-)

Bzw. schau mal hier: http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Bummi 31. Jan 2011 11:55

AW: WMV-Dauer ermitteln
 
oder so:

Delphi-Quellcode:
Mediaplayer1.TimeFormat := tfMilliseconds;
Mediaplayer1.Open;
Showmessage(FormatDatetime('hh:nn:ss', Mediaplayer1.Length / 1000 / (24*60*60)));

stahli 31. Jan 2011 21:07

AW: WMV-Dauer ermitteln
 
Zitat:

Zitat von Bummi (Beitrag 1078521)
oder so:

Delphi-Quellcode:
Mediaplayer1.TimeFormat := tfMilliseconds;
Mediaplayer1.Open;
Showmessage(FormatDatetime('hh:nn:ss', Mediaplayer1.Length / 1000 / (24*60*60)));

Funktioniert im Grunde perfekt, Open dauert aber zu lange (1-2 Sek). Da ich mehrere Werte ermitteln will, ist das etwas ungünstig.

Zitat:

Zitat von Neutral General (Beitrag 1078520)
In Delphi funktioniert es wahrscheinlich ganz genauso^^
Du musst den Code nur eben nach Delphi übersetzen ;-)

Bzw. schau mal hier: http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

:wink: Würde ich ja gern. Ich komme nur damit nicht klar.
Wenn das schneller wäre als die obige Lösung hätte ich schon Interesse...

stahli 2. Feb 2011 11:29

AW: WMV-Dauer ermitteln
 
Zitat:

Zitat von stahli (Beitrag 1078657)
Funktioniert im Grunde perfekt, Open dauert aber zu lange (1-2 Sek). Da ich mehrere Werte ermitteln will, ist das etwas ungünstig.

Ups, unter XP (in VM und auf anderem PC) geht das MediaPlayer.Open deutlich schneller als auf meinem Win7 !?
Ich werde es erst mal so belassen, falls jemand mal eine schnellere Lösung findet - immer her damit :)

Cylence 2. Feb 2011 13:54

AW: WMV-Dauer ermitteln
 
Hi,

in meinem Mediaplayer verwende ich die Mediainfo.dll, damit könnte man das auch machen.

http://www.delphipraxis.net/32578-ve...ainfo-dll.html

gruß

tom

lbccaleb 2. Feb 2011 17:04

AW: WMV-Dauer ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Oder das ganze mit DirectShow! Hab das mal nen test Proggy fertig gemacht, nur ist das vllt auch net die schnellste Variante??!!

Die DirectX Header Dateien von hier werden benötigt!

stahli 2. Feb 2011 17:32

AW: WMV-Dauer ermitteln
 
Ich habe gerade festgestellt, dass es unter Delphi (Debugmodus) sehr langsam läuft (die Debuginfos zeigen mehrfach Thread- und Modusl-Infos an).
Läuft das Programm selbnständig geht es schon schneller.
Ich werde es so belassen, da es als einfachster Weg erscheint.

Die DirectX-Variante funktioniert scheinbar gleichermaßen.

Danke Euch nochmal.

lbccaleb 2. Feb 2011 17:55

AW: WMV-Dauer ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab die DirectX Version noch einwenig überarbeitet, wenn dir das jetze nicht gefällt, dann weiß ich auch net :lol:

stahli 2. Feb 2011 19:44

AW: WMV-Dauer ermitteln
 
Gefällt jetze :-D

Ich habe es noch etwas umgestellt.
Unter Win7 ging alles perfekt. In meiner VM unter nacktem XP war jedoch keine Dauer ermittelbar. Vermutlich, weil kein passendes DirectX installiert ist!?

Ich habe jetzt einfach eine alternative Ermittlung über einen MediaPlayer eingebunden.
Ich denke, so passt das für alle Fälle...
Danke nochmal :thumb:

Delphi-Quellcode:
unit VideoDuration;

interface

function GetVideoDuration(FileName: String): TDateTime;

implementation

uses
  DirectShow9, ActiveX, Dialogs, SysUtils, MPlayer, Forms;

var
  hr: HRESULT;
  MediaDet: IMediaDet;

procedure ClearDirectShow;
begin
  MediaDet := nil;
end;

function DurationFromMediaPlayer(FileName: String): TDateTime;
var
  MediaPlayer: TMediaPlayer;
begin
  MediaPlayer := TMediaPlayer.Create(nil);
  MediaPlayer.Visible := False;
  MediaPlayer.Parent := Application.MainForm;
  MediaPlayer.FileName := FileName;
  MediaPlayer.TimeFormat := tfMilliseconds;
  MediaPlayer.Open;
  Result := MediaPlayer.Length / 1000 / (24 * 60 * 60);
  MediaPlayer.Close;
  FreeAndNil(MediaPlayer);
end;

function GetVideoDuration(FileName: String): TDateTime;
var
  Duration: Double;
  wFileName: PWideChar;
begin;
  ClearDirectShow;
  Result := 0;

  wFileName := StringToOleStr(FileName);
  try
    hr := CoCreateInstance(CLSID_MediaDet, nil, CLSCTX_INPROC, IMediaDet, MediaDet);
    if hr = S_OK then
      hr := MediaDet.put_Filename(wFileName);
    if hr = S_OK then
      hr := MediaDet.get_StreamLength(Duration);
    if hr = S_OK then
      Result := Duration / (24 * 60 * 60)
    else
      Result := DurationFromMediaPlayer(FileName);
  finally
    SysFreeString(wFileName);
  end;
  ClearDirectShow;
end;

initialization

CoInitialize(nil);

finalization

CoUnInitialize;

end.

lbccaleb 2. Feb 2011 19:47

AW: WMV-Dauer ermitteln
 
Zitat:

Zitat von stahli (Beitrag 1079178)
Gefällt jetze :-D

Ich habe es noch etwas umgestellt.
Unter Win7 ging alles perfekt. In meiner VM unter nacktem XP war jedoch keine Dauer ermittelbar. Vermutlich, weil kein passendes DirectX installiert ist!?

Ich denke eher das liegt daran das kein Codec auf dem System der VM installiert ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:54 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