Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi DSPack : Länge von Lied vor Abspielen herausbekommen (https://www.delphipraxis.net/85558-dspack-laenge-von-lied-vor-abspielen-herausbekommen.html)

Sunlight7 17. Feb 2007 17:41

Re: DSPack : Länge von Lied vor Abspielen herausbekommen
 
Eben doch, da MCI auf 16 Bit aufsetzt und das hier beschriebene Problem auftaucht, das die Werte bei größeren Dateien nicht stimmen.

EWeiss 17. Feb 2007 17:55

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

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. :mrgreen: :zwinker:

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

Sunlight7 17. Feb 2007 18:57

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:

Zitat von EWeiss
Geschrieben nicht getestet!

Stimmt, da seh ich beim hinschauen 3 Fehler :wink:
Der Typ Data muß PChar oder ein Array sein.
Rückgabewert wird nicht überprüft.
Semikolon vergessen :mrgreen:

"Movie" ist der Aliasname :wink:

EWeiss 17. Feb 2007 19:29

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

Zitat von Sunlight7
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:

Zitat von EWeiss
Geschrieben nicht getestet!

Stimmt, da seh ich beim hinschauen 3 Fehler :wink:
Der Typ Data muß PChar oder ein Array sein.
Rückgabewert wird nicht überprüft.
Semikolon vergessen :mrgreen:

"Movie" ist der Aliasname :wink:

HEheheehehee erwischt..
translated from Vb ;) muss noch was lernen.! :wall:

gruss

Nils_13 18. Feb 2007 10:29

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:
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.

EWeiss 18. Feb 2007 14:12

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

Sunlight7 18. Feb 2007 20:23

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:
...

   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;
...
Grüßle!

Nils_13 19. Feb 2007 08:47

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).

Lasse2002 19. Feb 2007 10:34

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:
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');

Nils_13 19. Feb 2007 12:50

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:59 Uhr.
Seite 2 von 3     12 3      

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