![]() |
DSPack : Länge von Lied vor Abspielen herausbekommen
Hi,
wie kann man mit dem DSPack die Länge eines beliebigen Liedes, bevor man es abspielt, herausfinden bzw. auf eine Variable zuweisen ? Ich habe keine Befehle gefunden, welche dies "im Vorraus" erledigen könnten. |
Re: DSPack : Länge von Lied vor Abspielen herausbekommen
Zitat:
Aber ich weiss das es über MPEGInfo geht. EDIT: Und beliebig geht gar nicht. Immer abhängig vom Dateityp gruss |
Re: DSPack : Länge von Lied vor Abspielen herausbekommen
Ich brauche die Länge von .mpeg, .wmv, .avi, .dat. MPEG hast du eben schon genannt, werde mich gleich drumkümmern. DAT ist nichts anderes als MPEG. Wie steht es allerdings mit WMV und AVI ?
|
Re: DSPack : Länge von Lied vor Abspielen herausbekommen
Zitat:
"WMV", "WMA", "RMI", "AVI", "ASF", "DAT", "WAV", "RM" Kannst du die länge über FilgraphManager erfahren. FilgraphManager befindet sich in der Typelib QuartzTypeLib Quartz.dll. von meinen Projekt!
Code:
CDA mußt du binär auslesenSet MediaControl = New FilgraphManager If MediaControl Is Nothing Then MsgBox "Kann die Ojektlib Mediacontrol nicht erstellen" Exit Sub End If Set MediaPosition = MediaControl MediaControl.RenderFile (strFullSongName) SongTime = MediaPosition.Duration strMin = SongTime \ 60 strSec = Int(SongTime - strMin * 60) strX = format(strMin, "00") & ":" & format(strSec, "00") "MPE", "MPEG", "MPG", "MOV", "3GP", "MID" Kannst du über mci in erfahrung bringen gruß |
Re: DSPack : Länge von Lied vor Abspielen herausbekommen
Zitat:
|
Re: DSPack : Länge von Lied vor Abspielen herausbekommen
@Nils
Nimm dir mal die mmsystem unit wenn die noch nicht in dein projekt eingebunden ist Damit kannst du die länge der songs / Videos einfach in erfahrung bringen. MCI ist das schlagwort. gruss |
Re: DSPack : Länge von Lied vor Abspielen herausbekommen
Und wie mit MCI ? Die Msdn-Hilfe hat nicht mal eine Liste aller Parameter oder ich bin blind :roll:
|
Re: DSPack : Länge von Lied vor Abspielen herausbekommen
Hallo,
wenn Du DirectShow verwenden willst, kannst Du folgende Funktion verwenden (Ergebnis in Millisekunden):
Delphi-Quellcode:
Gruß
uses
ActiveX, DirectShow9; ... function GetDuration(const FileName: WideString): Cardinal; var GB: IGraphBuilder; MediaSeeking: IMediaSeeking; RefTime: Int64; begin Result := 0; if Succeeded(CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, GB)) and Succeeded(GB.RenderFile(PWideChar(FileName), nil)) and Succeeded(GB.QueryInterface(IMediaSeeking, MediaSeeking)) then begin MediaSeeking.GetDuration(RefTime); Result := Cardinal(RefTime div 10000); end; end; xaromz |
Re: DSPack : Länge von Lied vor Abspielen herausbekommen
MCI ist mit Vorsicht zu geniesen, weil nur 16 Bit und je nach Typ 1 oder 2 GB Dateibeschräkung.
|
Re: DSPack : Länge von Lied vor Abspielen herausbekommen
Zitat:
Er will ja nichts damit abspielen. Dabei spielt es keine rolle ob 16Bit oder 32. Oder? @Nils .. Wie das geht habe ich dir doch anhand eines Beispiel geschildert. gruss |
Re: DSPack : Länge von Lied vor Abspielen herausbekommen
Eben doch, da MCI auf 16 Bit aufsetzt und das
![]() |
Re: DSPack : Länge von Lied vor Abspielen herausbekommen
Zitat:
Dazu reicht Error := mciSendString('status movie time format', Data, 128, 0); getTimeFormat := Data Das ist alles. Data ist ein String wobei 128 der rückgabe wert des Strings in einer länge von 128 ist. Und Songs mit einer größe von 2GB hab ich noch nicht gesehen. :mrgreen: :zwinker: EDIT: Ergänzung:
Delphi-Quellcode:
Error gibt den wert 0 zurück wenn alles in ordnung.
function getLengthInMS; string;
Var Error : Integer: Data : string; begin Error := mciSendString('set movie time format ms', 0, 0, 0) Error := mciSendString('status movie length', Data, 128, 0) Result := Data; end; Geschrieben nicht getestet! gruss |
Re: DSPack : Länge von Lied vor Abspielen herausbekommen
Bei AVIs gilt 1 GB Beschränkung :zwinker:
Und wer sagt, das sich die Nutzer nur Musikvideos ansehen? :stupid: Ich habe Filme, die über 1 GB sind :mrgreen: Zitat:
Der Typ Data muß PChar oder ein Array sein. Rückgabewert wird nicht überprüft. Semikolon vergessen :mrgreen: "Movie" ist der Aliasname :wink: |
Re: DSPack : Länge von Lied vor Abspielen herausbekommen
Zitat:
translated from Vb ;) muss noch was lernen.! :wall: gruss |
Re: DSPack : Länge von Lied vor Abspielen herausbekommen
Und wie wendet man die Prozedur korrekt an ? Ich habe eine normalerweise funktionierende Überprüfung eingebaut, ob es eine Audio oder Videodatei ist und ab diesem Zeitpunkt knallt es bei Application.Run. Der Debugger ist duch alles durch und beim Run bleibt der Debugger in einer Schleife hängen. Deshalb weiß ich nicht ansatzweise, wo der Fehler liegt.
Nachtrag: Ich weiß jetzt wo der Fehler liegt:
Delphi-Quellcode:
Was tun ?
Result := Data;
Der Fehler tritt übrigens beim Anwendungsstart auf, wenn die zuletzt in der Playlist gewesenen Lieder ausgelesen werden (aus Playlist). Ich habe mit Absicht nur Videos in der Playlist stehen, welche zu Anfang geladen wird. |
Re: DSPack : Länge von Lied vor Abspielen herausbekommen
Schick mir dein Teil nochmal das Sample ..
Baue dir dann Heute .. Morgen eine funktionierende Abfrage ein, wenn ich das kann ;) gruss |
Re: DSPack : Länge von Lied vor Abspielen herausbekommen
Abend!
Du solltest Dateinamen in das 8+3 Format wandeln :wink: , da sonst MCI bei zu langen Dateinamen crasht. :stupid: Hier ein Auszug von meiner Komponente, welche MCI nutzt.
Delphi-Quellcode:
Grüßle!
...
CloseMedia; FIDString:='SMC'+IntToStr(Random(16777216)); If UpperCase(ExtractFileExt(FileName))='.CDA' then goto OpenTrack; OpenFile: // Nur im 8+3 Dateiformat öffnen, Dateienamen mit mehr als 64 Zeichen lassen MCI crashen! i:=mciSendString(PChar('open "'+SExtractShortFileName(FFileName)+'" alias '+FIDString), nil, 0, TSMCForm(SMCForm).Handle); If i<>0 then begin ShowErrorMessage(i); SetLastError(i); Exit; end; mciSendString(PChar('status "'+FIDString+'" length '), PC, 255, 0); FFrames:=StrToIntDef(PC, 0); mciSendString(PChar('status "'+FIDString+'" nominal frame rate'), PC, 255, 0); FFrameRate:=StrToIntDef(PC, 0) / 1000; Goto Resume; mciSendString(PChar('capability "'+FIDString+'" has video'), PC, 255, 0); FIsVideoDevice:=(PC='true'); mciSendString(PChar('capability "'+FIDString+'" has audio'), PC, 255, 0); FIsAudioDevice:=(PC='true'); // Test ob Audio im geladenen Media ist, falls dies ein Video ist // Achtung: Muß vor SetAudio sein ! If FIsVideoDevice then begin mciSendString(PChar('status "'+FIDString+'" audio'), PC, 255, 0); FIsAudioDevice:=(PC='on'); end; FFileName:=FileName; SavedMode:=smcNotReady; SendString('set', 'time format ms'); If Assigned(FOnGetDisplayHandle) then FOnGetDisplayHandle(Self, FDisplayHandle); SetDisplayHandle(FDisplayHandle); // Video Größe If FIsVideoDevice then begin mciSendString(PChar('where "'+FIDString+'" source '), PC, 255, 0); s:=Copy(PC, 5, 255); If s<>'' then begin For i:=1 to System.Length(s) do If s[i]=' ' then begin FVideoWidth:=StrToIntDef(Copy(s, 1, i-1), 0); FVideoHeight:=StrToIntDef(Copy(s, i+1, System.Length(s)-i), 0); Break; end; end; FDisplayRect:=Rect(0, 0, FVideoWidth, FVideoHeight); end; FDisplayWidth:=FVideoWidth; FDisplayHeight:=FVideoHeight; // Umgehen eines MCI Bug's bei .MP3 und .WMA If FIsVideoDevice then if (FVideoWidth<4) or (FVideoHeight<4) then FIsVideoDevice:=False; If Assigned(FOnSetDisplayRect) then try FOnSetDisplayRect(Self); except end; If FIsVideoDevice then SetDisplaySize(FDisplayRect, FStretchToWindow); If not FAutoPlay then UpdateDisplay; If not FPlayAudio then DisableAudio; If not FPlayVideo then DisableVideo; mciSendString(PChar('status "'+FIDString+'" length '), PC, 255, 0); FLength:=StrToIntDef(PC, 0); mciSendString(PChar('set "'+FIDString+'" seek exactly on'), PC, 255, TSMCForm(SMCForm).Handle); If FSpeed<>1000 then SetSpeed(FSpeed); DoPlay: If FAutoPlay then Play; ... |
Re: DSPack : Länge von Lied vor Abspielen herausbekommen
Kannst du mir auch noch sagen, was ich davon überhaupt in mein Testprogramm einbauen kann ? Da sind so viele Zeilen, mit denen ich überhaupt nichts anfangen kann, drinnen (so ist das nunmal bei Codeausschnitten).
|
Re: DSPack : Länge von Lied vor Abspielen herausbekommen
Hat es schon mal jemand mit IMediaDet probiert? Dieses Interface ist dafür gedacht, die Länge und evtl. noch ein paar weitere Infos von einer Mediadatei herauszubekommen.
Delphi-Quellcode:
Aufrufen mit:
function GetMediaLength(const AFileName: WideString): Double;
var MediaDet: IMediaDet; hr: HResult; begin hr := CoCreateInstance(CLSID_MediaDet, nil, CLSCTX_INPROC_SERVER, IID_IMediaDet, MediaDet); if Succeeded(hr) then begin MediaDet.put_Filename(AFilename); MediaDet.get_StreamLength(Result); end else Result := -1; MediaDet := nil; end;
Delphi-Quellcode:
I := GetMediaLength('E:\demo.avi');
ShowMessage('Länge: ' + FloatToStr(i) + ' Sekunden'); |
Re: DSPack : Länge von Lied vor Abspielen herausbekommen
Und was braucht und woher bekommt man die dazugehörigen Sachen ? Ich hoffe, dass man MediaDet nicht mitschicken muss.
|
Re: DSPack : Länge von Lied vor Abspielen herausbekommen
Hallo,
das IMediaDet-Interface ist wohl ein Teil von DirectShow. Du benötigst also nur die Header, welche ja beim DSPack dabei sind. Gruß xaromz |
Re: DSPack : Länge von Lied vor Abspielen herausbekommen
Ok, schön. Aber irgendwie gibt es immer Probleme:
Delphi-Quellcode:
Dann soll das natürlich noch verwandelt werden. Dies soll mit folgender Prozedur geschehen, aber wie ?
var i : Double;
begin i := GetMediaLength('E:\asd.avi'); ShowMessage('Länge: ' + FloatToStr(i) + ' Sekunden');
Delphi-Quellcode:
*** EDIT ***
function TfrmMain.DurationMinSec(Sekunden : Integer) : String;
var Hour, Min, Sec : Integer; begin Hour := Sekunden div 1440; dec(Sekunden, Hour*1440); Min := Sekunden div 60; Sec := Sekunden - Min * 60; if Boolean(Hour) then Result := Format('%d:%.2d:%.2d', [Hour, Min, Sec]) else Result := Format('%.2d:%.2d', [Min, Sec]); end; Zwar nicht gerade elegant, aber es funktioniert:
Delphi-Quellcode:
Ich werde noch ein wenig rumtesten, aber bedanke mich hiermit schonmal bei allen Benutzern, welche in diesem Thread gepostet haben :) ! Es funktioniert endlich :party:
procedure TfrmMain.b1Click(Sender: TObject);
var s : String; i : Integer; p : Integer; begin s := FloatToStr(GetMediaLength('<<<Pfad+Dateiname>>>')); p := Pos(',', s); if not p <= -1 then begin s := Copy(s, 0, p-1); s := DurationMinSec(StrToInt(s)); end; ShowMessage(s); end; function TfrmMain.DurationMinSec(Sekunden : Integer) : String; var Hour, Min, Sec : Integer; begin Hour := Sekunden div 1440; dec(Sekunden, Hour*1440); Min := Sekunden div 60; Sec := Sekunden - Min * 60; if Boolean(Hour) then Result := Format('%d:%.2d:%.2d', [Hour, Min, Sec]) else Result := Format('%.2d:%.2d', [Min, Sec]); end; |
Re: DSPack : Länge von Lied vor Abspielen herausbekommen
Einfacher geht es so:
Delphi-Quellcode:
Man kann mit einer einfachen Divison durch SecsPerDay einen Wert von Sekunden in ein TDateTime umwandeln.
function TfrmMain.DurationMinSec(Sekunden : Integer) : String;
begin Result := TimeToStr(Sekunden / SecsPerDay); end; Oder wenn GetMediaLength gleich ein TDateTime zurückgeben soll:
Delphi-Quellcode:
Da -1 von TimeToStr in 1 Sekunde umgewandelt wird, ist es besser im Fehlerfall 0 zurückzugeben.
function GetMediaLength(const AFileName: WideString): TDateTime;
var MediaDet: IMediaDet; hr: HResult; Tmp: Double; begin hr := CoCreateInstance(CLSID_MediaDet, nil, CLSCTX_INPROC_SERVER, IID_IMediaDet, MediaDet); if Succeeded(hr) then begin MediaDet.put_Filename(AFilename); if Succeeded(MediaDet.get_StreamLength(Tmp)) then Tmp := Tmp / SecsPerDay else Tmp := 0; end else Tmp := 0; Result := Tmp; MediaDet := nil; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:19 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