Page 1 of 2 1 2 LastLast
Results 1 to 15 of 25

Thread: MediaPlayer problemen in XE10.3

  1. #1

    MediaPlayer problemen in XE10.3

    MPlayer problemen in XE10.3
    Ik had een MP3 player gemaakt in XE10.1, deze werkten perfect, maar nu ik deze omzet naar XE10.3 kom ik iets vreemds tegen.

    De tijd van de Track uitlezen:

    Code:
    var
      CurrentMin, CurrentSec, DurationMin, DurationSec: integer;
    begin
      if (MediaPlayer1.State = TMediaState.Playing) then
      begin
        TrackBar1.Tag := 1;
        TrackBar1.Value := MediaPlayer1.CurrentTime;
        TrackBar1.Tag := 0;
    
        CurrentMin := MediaPlayer1.CurrentTime div 1000 div 60;
        CurrentSec := MediaPlayer1.CurrentTime div 1000 mod 60;
        DurationMin := MediaPlayer1.Duration div 1000 div 60;
        DurationSec := MediaPlayer1.Duration div 1000 mod 60;
        Label3.Text := Format('%2.2d:%2.2d', [CurrentMin, CurrentSec]) + ' / ' + Format('%2.2d:%2.2d', [DurationMin, DurationSec]);
      end;
    Dit gaf netjes de actuele play tijd en de lengte van de track in tijd.

    Maar nu onder XE10.3 krijg ik hele vreemde waardes, deze zijn zelfs regelmatig negatief.
    Ook als ik met een int64 of uint64 werk krijg ik regelmatig negatieve waardes, of heel erg grote waardes.

    Dit heb ik ook getest:

    var TEST: int64;

    TEST := MediaPlayer1.CurrentTime;
    Label7.Text := IntToStr( TEST ); //Geeft ook negatieve waardes
    Label7.Text := VarToStr( TEST ); //Geeft ook negatieve waardes


    TEST := MediaPlayer1.Duration;
    Label7.Text := IntToStr( TEST ); //Geeft 112039 / 1543409 / 277591 / 1496348 /maar ook -1882409 (Afhankelijk van de gekozen track)

    Label7.Text := MediaPlayer1.Duration.ToString; //Geeft 00:00:00
    Label7.Text := MediaPlayer1.CurrentTime.ToString; //Geeft 00:00:00

    Label7.Text := DateTimeToStr( MediaPlayer1.Duration.ToDateTime ); //Geeft 30-12-99 00:00:00
    Label7.Text := TimeToStr( MediaPlayer1.Duration.ToDateTime ); //Geeft 00:00:00

    Label7.Text := DateTimeToStr( MediaPlayer1.CurrentTime.ToDateTime ); //Geeft 30-12-99 00:00:00
    Label7.Text := TimeToStr( MediaPlayer1.CurrentTime.ToDateTime ); //Geeft 00:00:00

    Heel vreemd wat het werkte gewoon in XE10.1, en nu ineens niet meer.

  2. #2
    Had je de documentatie al eens doorgelezen?

    http://docwiki.embarcadero.com/Libra...er.CurrentTime

    Daar staat dat CurrentTime in 100ns is en dat je het moet delen door MediaTimeScale om s te krijgen.

    CurrentTime is measured in 100ns. To obtain s, divide CurrentTime by MediaTimeScale.
    Delphi Code:
    1. MediaTimeScale: Integer = $989680; // = 10.000.000
    div 1000 is dus echt te weinig.

    Dus
    Delphi Code:
    1. Test := MediaPlayer1.CurrentTime div MediaTimeScale;
    2. Label7.Text := IntToStr( Test );
    Krijg je dan ook rare waarden?

    Idem voor Duration.

  3. #3
    Dit geeft voor zowel "CurrentTime" en ook "Duration" altijd de waarde 0.
    Het maakt niet uit welke Track ik afspeel.

    Ook even gekeken welke waarde MediaTimeScale heeft, dat is: 10000000

  4. #4
    Ik vind het wat gek.
    Zelf even wat dingetjes gedaan en bij mij werkt het (een soort van)

    Nu heb ik een audio fragment uit de samples ergens gehaald, dit fragment duurt 1:46, als ik deze in de mediaplayer laad en dan mediaplayer.duration op vraag krijg ik 2:40 terug.

    De current time lijkt wel goed te lopen. Maar wanneer het fragment klaar is springt de currenttime opeens naar 2:40.

    Ik zou je sowieso aanraden om niet onnodig de currenttime te gaan berekenen maar gewoon Mediaplayer.CurrentTime.ToString te gebruiken.
    Die geeft netjes een string terug met de timestamp geformat.

    En betreft de rare waardes die je krijgt, en soms een negatieve waarde.
    Is de mp3 wel ingeladen?
    Mediaplayer.Filename is niet leeg?

    De waardes die je krijgt (vooral die negatieve waarde) doet me sterk denken aan een variabele die niet geinitialiseerd is.

  5. #5
    Je zou in 10.3 even moeten kijken welk type Mediaplayer.CurrentTime is.
    In 10.2 was dit een TMediaTime. En TMediaTime was zelf weer een "type Int64".

    Ga dus op .CurrentTime staan en druk op Alt + Pijl up.
    Kijk welk type property CurrentTime is en ga daar weer op staan en druk weer Alt + Pijl up.
    Dan zie je of het nog steeds een Int64 is of dat het misschien een compleet nieuw samengesteld type is (want dan logisch tot gevolg heeft dat het toewijzen aan een int64 onzin oplevert).

    Je ziet dan onder die TMediaTime ook een helper functie (met die ToString).

  6. #6
    Dat is in 10.3 ook nog steeds een TMediaTime, en dat is nog steeds een int64

  7. #7
    Dan is het raar dat die van die getallen teruggeeft.
    Label7.Text := IntToStr( TEST ); //Geeft 112039 / 1543409 / 277591 / 1496348 /maar ook -1882409 (Afhankelijk van de gekozen track)
    Want 112.039/10.000.000 is toch een hele lage waarde voor seconden.
    En negatief zou al helemaal raar zijn.

    Ik ben blij dat ik geen Delphi for Android gebruik

  8. #8
    De Track wordt op dat moment afgespeeld en hoor die dan ook.

    Nu heb ik een audio fragment uit de samples ergens gehaald, dit fragment duurt 1:46, als ik deze in de mediaplayer laad en dan mediaplayer.duration op vraag krijg ik 2:40 terug.
    Zou je een paar andere Tracks willen testen, de 1 geeft vreemdere waardes dan een andere.

    Is de mp3 wel ingeladen?
    Mediaplayer.Filename is niet leeg?
    Daar staat netjes het path en de naam van de track in.

    Ik zou je sowieso aanraden om niet onnodig de currenttime te gaan berekenen maar gewoon Mediaplayer.CurrentTime.ToString te gebruiken.
    Dat had ik al geprobeerd, deze geeft: 00:00:00

    De waardes die je krijgt (vooral die negatieve waarde) doet me sterk denken aan een variabele die niet geinitialiseerd is.
    Het initaliseren gaat bij die deze toch automatische ?
    Last edited by MMSoft; 12-Sep-19 at 14:14.

  9. #9
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Een MPEG bestand bestaat (in tegenstelling tot bijvoorbeeld een bestand in PCM formaat) uit losse "Op zichzelf staande"
    frames (dit is niet helemaal waar, maar voor het gemak even zo gesteld).
    Wanneer een MPEG bestand met VBR ("Variable BitRate") gecodeerd is, dan hebben niet alle frames dezelfde lengte (in
    bytes), ondanks dat iedere frame wel even lang duurt (in tijd).

    Bij het bepalen van de lengte en vaak ook positie (in tijd) van een bestand kijkt een speler vaak alleen naar de eerste paar
    frames en bepaald aan de hand van de grootte/tijd verhouding hoe lang (in tijd) het complete bestand is, door deze twee
    waarden (bestandsgrootte en frame-grootte) op elkaar te delen.

    Omdat het begin van liedje vaak stil of rustig is, en dus de complexiteit laag, zijn de frames van deze eerste seconden vaak
    vrij klein (in bytes).
    Wanneer een speler vervolgens de grootte (in bytes) van deze eerste frames op de totale grootte van het bestand deelt, kan
    hier een grotere lengte (in tijd) uitkomen, dan het bestand daadwerkelijk is.

    Als je een bestand zou openen dat met CBR ("Constant BitRate") gecodeerd is, dan zouden de tijden wel ongeveer moeten
    kloppen.

    Aan de andere kant gebruikt TMediaPlayer ook decoders die op het toestel geïnstalleerd zijn en als deze de informatie niet
    correct teruggeven, dan kan de fout natuurlijk ook daarin zitten: probeer het eens met een ongecomprimeerd PCM bestand,
    die zou wel altijd correcte waarden moeten geven.
    TMemoryLeak.Create(Nil);

  10. #10
    Heb je een deelbaar project waar we (of ik teminste) even naar kan kijken?
    En gaat het hier om een windows applicatie of draai je de boel op een Android of iOS apparaat?

  11. #11
    Het vreemde is dat deze MP3 speler, gecompileerd met XE10.1, perfect werkt. Nu gecompileerd met XE10.3 heb ik dit probleem. De MP3 bestanden zijn nog dezelfde bestanden.

    Het is een Android App.
    Wil je, je email adres sturen?, dan stuur ik je het project.

  12. #12
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Wanneer je in de sources van TMediaPlayer in zowel XE10.1 als XE10.3 kijkt, hebben deze dan beiden dezelfde GUID (wordt dezelfde mediaplayer aangemaakt)?
    TMemoryLeak.Create(Nil);

  13. #13
    Hoe kan ik dat precies zien ?

    Crownie: je hebt een pb, met het project.

  14. #14
    Ja ik had je een pb terug gestuurd. Ik kan het project niet deployen.
    Welke SDK versie gebruik jij? Mogelijk ligt het daar aan?

  15. #15
    RAD Studio 10.3 Version 26.0.34749.6593
    Architect, een 30 dagen versie die nog maar 7 dagen werkt.

    SDK: Android SDK 25.2.5 32 bit

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •