Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi DirectShow IMediaSeeking MP3 (https://www.delphipraxis.net/156646-directshow-imediaseeking-mp3.html)

Linor 9. Dez 2010 15:35

DirectShow IMediaSeeking MP3
 
Hallo Zusammen,

weiss jemand wie man DirectShow dazu bringt per IMediaSeeking.GetDuration korrekte Werte bei MP3's zurückzuliefern? Bass & Co kriegen das alle hin, nur DS nicht?

FFDSHOW habe ich schon probiert, andere Codecs helfen da auch nicht?

Wegen Lizenzen (Kommerz) wollte ich eigentlich nicht auf Bass & Co umsteigen, da MP3 ja in Windows lizenziert ist...

lbccaleb 9. Dez 2010 16:33

AW: DirectShow IMediaSeeking MP3
 
Was genau ist da dein Problem, und wie rufst du MediaSeeking auf?

Bei mir funktioniert das, auch bei MP3´s!

Linor 9. Dez 2010 17:06

AW: DirectShow IMediaSeeking MP3
 
Hallo,
Zitat:

Zitat von lbccaleb (Beitrag 1067453)
Was genau ist da dein Problem, und wie rufst du MediaSeeking auf?

wie ich das oben schon schrieb, es geht auch nicht das ich keinen Wert erhalte, sondern falsche Werte. Google mal danach, trifft man häufig an, aber keine Lösung...

Zitat:

Zitat von lbccaleb (Beitrag 1067453)
Bei mir funktioniert das, auch bei MP3´s!

Du meinst deinen kleinen Player? Sorry, aber der tickt auch nicht richtig...

Nimm mal ein FLAC, konvertiere das runter auf ein 96KB MP3VBR (Lame) und lass die mal parallel in deinem Player und MediaMonkey spielen, deine Trackbar ist schon am Ende bevor der Song aufhört. (Grade getestet :stupid:) (MediaMonkey ist dann ungefähr bei 75%)

lbccaleb 9. Dez 2010 18:23

AW: DirectShow IMediaSeeking MP3
 
Besteht das Problem auch noch, wenn du die MP3 in einem der beigefügten Bsp. vom DSPack abspielst?
Und nein, ich möchte hier nicht groß rum konvertieren :stupid:! Es währe net, wenn du eine Datei anhängen könntest, welche Probleme macht!

Linor 10. Dez 2010 06:29

AW: DirectShow IMediaSeeking MP3
 
Hallo,
ich nutze das DSPack und der ruft ja IMediaSeeking.GetDuration auf.

Zitat:

Es wäre nett, wenn du eine Datei anhängen könntest, welche Probleme macht!
Zahlst du die GEMA Gebühren? :oops:

Bei Google suchenIMediaSeeking GetDuration mp3

OldGrumpy 10. Dez 2010 12:04

AW: DirectShow IMediaSeeking MP3
 
GEMA-freie Musik existiert ;)

Gausi 10. Dez 2010 12:13

AW: DirectShow IMediaSeeking MP3
 
Ich schätze, dass das an der variablen Bitrate liegt. Bei der Bass.dll gibt es da auch Probleme, wenn man beim Starten nicht das Flag BASS_PRESCAN (oder ähnlich) benutzt, was vor Beginn der Wiedergabe die komplette Datei liest und die Bitrate (bzw. Größe in Bytes) der einzelnen Frames scannt. Eine vergleichbare Technik müsste es bei DirectShow doch auch geben, oder nicht?

lbccaleb 10. Dez 2010 14:40

AW: DirectShow IMediaSeeking MP3
 
Hy,
kontrollierst du vor dem auslesen der Länge mit dem Befehl:

Delphi-Quellcode:
HRESULT GetCapabilities(
  [out] DWORD *pCapabilities
);
ob das überhaupt möglich ist?

Möglich währen da folgende Werte:

Delphi-Quellcode:
AM_SEEKING_CanGetCurrentPos

    The stream can report its current position. See Remarks.
AM_SEEKING_CanGetStopPos

    The stream can report its stop position.
AM_SEEKING_CanGetDuration

    The stream can report its duration.
Delphi-Quellcode:
var
  dwCaps: DWORD;
  MediaSeeking.GetCapabilities(dwCaps);

  if (dwCaps and AM_SEEKING_CanGetDuration) then
    begin;
      //The stream can report its duration.
    end;
Und wenn das dort schon Fehl schlägt...
...Mhhh dann müsste ich mir auch erstmal was einfallen lassen oO

Edit:

Zitat:

Zitat von Gausi (Beitrag 1067674)
...Eine vergleichbare Technik müsste es bei DirectShow doch auch geben, oder nicht?

Also mir ist im Moment keine "vergleichbare Technik" bekannt! Damüsste ich auch erstmal Nachforschen...

Edit2:
Also zur not gibt es noch eine andere Möglichkeit, an die Länge der MP3 zu kommen, mit dem Umweg über das Interface "IMediaDet" (MediaDetails)
Delphi-Quellcode:
function GetMultimediaFileDuration(const Filename: AnsiString): Double;
var
  MediaDet: IMediaDet;
begin
  Result := 0;
  if CoCreateInstance(CLSID_MediaDet, nil, CLSCTX_INPROC_SERVER,
    IID_IMediaDet, MediaDet) = S_OK then
    if MediaDet.put_Filename(Filename) = S_OK then
      if MediaDet.put_CurrentStream(0) = S_OK then
        if MediaDet.get_StreamLength(Result) <> S_OK then
          Result := 0;
  MediaDet := nil;
end;
Gibt dir die Länge der MP3 in Sekunden an!

Linor 10. Dez 2010 16:51

AW: DirectShow IMediaSeeking MP3
 
Hallo lbccaleb,
Zitat:

Also zur not gibt es noch eine andere Möglichkeit, an die Länge der MP3 zu kommen,
also irgendwie reden wir aneinander vorbei, es geht nicht darum an einen Wert zu kommen, es geht darum an einen korrekten Wert zu kommen. Wie ich oben schon schrieb und auch Gausi bemerkte, ist das die VBR in den MP3's... CBR geht leicht: Anzahl Frames * Framelänge und gut ist, VBR aber nicht...

Mein anliegen geht dahin nicht WIE kriege ich eine Länge, sondern wie die KORREKTE Länge :P

Wenn man sich Bass oder zlibplay anschaut liegen die bis auf 1-2 Sekunden, ohne Scan, ziemlich nahe an dem was Gausi's TMPEG-Info liefert, DirectShow liegt da, je nach VBR, voll daneben. Kommt wohl, wie ich gelesen habe, auf den ersten Frame an, der wird einfach Multipliziert....

Ein Lösung ist dieser Filter: http://www.free-codecs.com/download/...how_Filter.htm
Nur was nützt es mir wenn ich eine TrackBar auf den korrekten Wert einstellen kann, diese auch sauber bis zum Ende läuft, aber Seek-Befehle im hinteren Teil gehen nicht da der DS-Player ja nicht weiss wie lang er ist und zu hohe Werte einfach ignoriert, bzw. gar nicht in der Lage wäre per VBR diese Werte sauber anzuspringen.

Eine positive Neuerung gibt es für mich heute: bass.dll hat ja bekanntermaßenen eine MP3-Free Version. Das 2.4er Release vom 30.11.2010 kann aber trotzdem MP3's per DS abspielen, ohne das man merkt das er das tut :thumb: Und als Schmankerl: Die kommen mit VBR auch dann zurecht :stupid:

lbccaleb 14. Dez 2010 16:10

AW: DirectShow IMediaSeeking MP3
 
Zitat:

Zitat von Linor (Beitrag 1067737)
also irgendwie reden wir aneinander vorbei, es geht nicht darum an einen Wert zu kommen, es geht darum an einen korrekten Wert zu kommen

Nee, reden wir nicht! Ich hab das schon verstanden ;)
Das Problem ist, ich selber habe keine solche MP3 die Probleme macht, kann es selber also auch nicht testen!
Und die Funktion die ich gepostet hab, holt sich die länge der MP3 anders als IMediaSeeking!

Deswegen hatte ich gedacht/für dich gehofft dass diese Funktion dir die richtige Länge verrät!


Wenn dass der Fall ist, kannst du die Trackbar auf diese Länge setzen, und mit IMediaSeeking dann die Position bestimmen. Da das ja ohne Probleme läuft.

Sicher nicht die sauberste Lösung, aber wenn es ohne Probleme läuft, ist doch alles gut ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:27 Uhr.
Seite 1 von 2  1 2      

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