AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi DSPack : Länge von Lied vor Abspielen herausbekommen
Thema durchsuchen
Ansicht
Themen-Optionen

DSPack : Länge von Lied vor Abspielen herausbekommen

Ein Thema von Nils_13 · begonnen am 1. Feb 2007 · letzter Beitrag vom 19. Feb 2007
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#11

Re: DSPack : Länge von Lied vor Abspielen herausbekommen

  Alt 17. Feb 2007, 18:41
Eben doch, da MCI auf 16 Bit aufsetzt und das hier beschriebene Problem auftaucht, das die Werte bei größeren Dateien nicht stimmen.
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#12

Re: DSPack : Länge von Lied vor Abspielen herausbekommen

  Alt 17. Feb 2007, 18:55
Zitat von Sunlight7:
Eben doch, da MCI auf 16 Bit aufsetzt und das hier beschriebene Problem auftaucht, das die Werte bei größeren Dateien nicht stimmen.
Destotrotz er braucht nur einen befehl um die länge eines Titels in ms zu bekommen.
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.

EDIT:
Ergänzung:
Delphi-Quellcode:
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;
Error gibt den wert 0 zurück wenn alles in ordnung.

Geschrieben nicht getestet!

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#13

Re: DSPack : Länge von Lied vor Abspielen herausbekommen

  Alt 17. Feb 2007, 19:57
Bei AVIs gilt 1 GB Beschränkung
Und wer sagt, das sich die Nutzer nur Musikvideos ansehen?
Ich habe Filme, die über 1 GB sind

Zitat von EWeiss:
Geschrieben nicht getestet!
Stimmt, da seh ich beim hinschauen 3 Fehler
Der Typ Data muß PChar oder ein Array sein.
Rückgabewert wird nicht überprüft.
Semikolon vergessen

"Movie" ist der Aliasname
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#14

Re: DSPack : Länge von Lied vor Abspielen herausbekommen

  Alt 17. Feb 2007, 20:29
Zitat von Sunlight7:
Bei AVIs gilt 1 GB Beschränkung
Und wer sagt, das sich die Nutzer nur Musikvideos ansehen?
Ich habe Filme, die über 1 GB sind

Zitat von EWeiss:
Geschrieben nicht getestet!
Stimmt, da seh ich beim hinschauen 3 Fehler
Der Typ Data muß PChar oder ein Array sein.
Rückgabewert wird nicht überprüft.
Semikolon vergessen

"Movie" ist der Aliasname
HEheheehehee erwischt..
translated from Vb muss noch was lernen.!

gruss
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#15

Re: DSPack : Länge von Lied vor Abspielen herausbekommen

  Alt 18. Feb 2007, 11:29
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:
Result := Data; Was tun ?

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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#16

Re: DSPack : Länge von Lied vor Abspielen herausbekommen

  Alt 18. Feb 2007, 15:12
Schick mir dein Teil nochmal das Sample ..
Baue dir dann Heute .. Morgen eine funktionierende Abfrage ein, wenn ich das kann

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#17

Re: DSPack : Länge von Lied vor Abspielen herausbekommen

  Alt 18. Feb 2007, 21:23
Abend!

Du solltest Dateinamen in das 8+3 Format wandeln , da sonst MCI bei zu langen Dateinamen crasht.
Hier ein Auszug von meiner Komponente, welche MCI nutzt.

Delphi-Quellcode:
...

   CloseMedia;

   FIDString:='SMC'+IntToStr(Random(16777216));
   If UpperCase(ExtractFileExt(FileName))='.CDAthen
      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;
...
Grüßle!
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#18

Re: DSPack : Länge von Lied vor Abspielen herausbekommen

  Alt 19. Feb 2007, 09:47
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).
  Mit Zitat antworten Zitat
Lasse2002

Registriert seit: 29. Nov 2004
79 Beiträge
 
RAD-Studio 2009 Pro
 
#19

Re: DSPack : Länge von Lied vor Abspielen herausbekommen

  Alt 19. Feb 2007, 11:34
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:
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;
Aufrufen mit:
Delphi-Quellcode:
I := GetMediaLength('E:\demo.avi');
ShowMessage('Länge: ' + FloatToStr(i) + ' Sekunden');
Lasse
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#20

Re: DSPack : Länge von Lied vor Abspielen herausbekommen

  Alt 19. Feb 2007, 13:50
Und was braucht und woher bekommt man die dazugehörigen Sachen ? Ich hoffe, dass man MediaDet nicht mitschicken muss.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:27 Uhr.
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