Linuchs: Laufzeit mp3 ermitteln

Moin,

wie kann ich die Laufzeit einer mp3 Datei ermitteln ohne die Datei zu laden?

Irgendwas mit header?

Unter Suchbegriff "mp3 laufzeit auslesen" finde ich keine Antworten.

Hintergrund: In einer Tabelle werden Hörproben verwaltet, die im Web erreichbar sind. Sie werden als audio-Element mit der Eigenschaft preload=none angeboten.

Bei Neueingabe / Änderung wird die Erreichbarkeit geprüft, es soll auch die Laufzeit gespeichert werden.

  1. Let me google that for you

    The answer is no. The mp3 file format doesn't have any information regarding the duration of the file. To compute the duration you would need to divide the length of the file by the bit rate. That would also explain the behavior of your library. As a workaround, if you have control of the files on the server you should be able to embed the duration in an id3 tag.

    Hättste auch selbst machen können.

    GLG Michael aus Florida

    1. Hallo Michael,

      The answer is no. The mp3 file format doesn't have any information regarding the duration of the file. To compute the duration you would need to divide the length of the file by the bit rate. That would also explain the behavior of your library. As a workaround, if you have control of the files on the server you should be able to embed the duration in an id3 tag.

      Und auch das ist schwierig bei MP3s mit VBR. Da hilft nur File parsen, über die Frames loopen und deren Duration summieren.

      Freundliche Grüße,
      Christian Kruse

      1. Hallo Christian,

        … Da hilft nur File parsen, über die Frames loopen und deren Duration summieren.

        oder anhören. Ich würde keine MP3s veröffentlichen, die ich nicht schon mal gehört habe.

        Gruß
        Jürgen

        1. oder anhören.

          KLar höre ich mir die vorher an. Als bekennende „faule Sau“ hätte ich gern vermieden, die Laufzeit abzulesen, zu merken und ins Formular wieder einzutragen.

          Sowas nennt man „EDV zu Fuß“.

          Wie macht der FF das denn? Kurz nachdem ich das Audio (preload=none) starte, zeigt der die Laufzeit an, obwohl der Fortschritts-Ladebalken kaum 10% erreicht hat?

          Könnte Javascript die Laufzeit auslesen und per Ajax nach Hause telefonieren?

          Auf einigen Webseiten zeige ich die audio currentTime an (Abfrage im Sekundentakt), falls es sowas gibt wie gesamtTime, wie heißt das auf englisch?

          1. Hallo,

            Wie macht der FF das denn? Kurz nachdem ich das Audio (preload=none) starte, zeigt der die Laufzeit an, obwohl der Fortschritts-Ladebalken kaum 10% erreicht hat?

            da vermute ich mal, dass der Firefox aus den ersten paar Sekunden versucht, auf die Gesamt-Spieldauer zu schließen - ähnlich wie bei frühen Hochrechnungen bei Wahlen. Bei mp3-Dateien mit konstanter Bitrate geht das, bei VBR kann das geschätzte Ergebnis weit danebenliegen.

            Auf einigen Webseiten zeige ich die audio currentTime an (Abfrage im Sekundentakt), falls es sowas gibt wie gesamtTime, wie heißt das auf englisch?

            Vielleicht Total Playing Time?

            Einen schönen Tag noch
             Martin

            --
            Deutschland: Das Land der Dichter und Denker, Richter und Henker.
          2. Hallo Linuchs,

            schau mal hier rein: https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Client-side_web_APIs/Video_and_audio_APIs. Hier wird u.A. die Eigenschaft .duration erwähnt, Link: HTMLMediaElement.duration.

            Gruß
            Jürgen

            1. Hallo Jürgen,

              danke für den Link.

              Wenn ich .duration ca. 1 sec nach Start abfrage, gibt es die Angabe, die im Audiobalken steht.

              Gruß, Linuchs

              1. Moin Linuchs,

                Wenn ich .duration ca. 1 sec nach Start abfrage, gibt es die Angabe, die im Audiobalken steht.

                1. Ist die Audiodatei dann schon komplett geladen?
                2. Funktioniert das auch bei Audiodateien mit variabler Bitrate?

                Viele Grüße
                Robert

              2. Wenn ich .duration ca. 1 sec nach Start abfrage,

                Wenn hierbei variable Bitraten beachtet werden (sollen) muss das gesamte mp3 geladen sein. Und das Laden kann dauern. Das solltest Du also mehrfach abfragen.

                Also:

                1. Moin,

                  Wenn ich .duration ca. 1 sec nach Start abfrage,

                  Wenn hierbei variable Bitraten beachtet werden (sollen) muss das gesamte mp3 geladen sein. Und das Laden kann dauern. Das solltest Du also mehrfach abfragen.

                  „Da gibt es doch 'was von …“ … der WHATWG, z.B. das loadedmetadata-Event.

                  Viele Grüße
                  Robert

                  1. Moin,

                    Wenn ich .duration ca. 1 sec nach Start abfrage,

                    Wenn hierbei variable Bitraten beachtet werden (sollen) muss das gesamte mp3 geladen sein. Und das Laden kann dauern. Das solltest Du also mehrfach abfragen.

                    „Da gibt es doch 'was von …“ … der WHATWG, z.B. das loadedmetadata-Event.

                    Ja. Passt. Da kann er sich das Theater mit dem setInterval sparen und ermittelt die Dauer wenn das loadedmetadata feuert: „Enough of the resource has been obtained that the duration of the resource is available.“

    2. Hallo Michael,

      To compute the duration you would need to divide the length of the file by the bit rate.

      Weeeell - that might be a tad difficult if your MP3 uses a VBR format.

      Rolf

      --
      sumpsi - posui - obstruxi
  2. Erreichbarkeit: Wieso ergibt das Folgende den Wert false?

    $arr_headers = get_headers( "https://www.konzertchor-darmstadt.de/wp-content/uploads/2022/02/erlaube_mir.mp3", 1 );
    var_dump( $arr_headers );
    

    Das Lied ist abspielbar

    1. Hallo Linuchs,

      das ist ein Problem auf deiner Seite. Wenn ich das mache, bekomme ich die Header (PHP 8.1.4/64 bit auf Win10)

      Hast Du die Fehleranzeigen aktiviert? Was besagen die?

      Bei einem Kreuztest mit PHP 7 ist mir gerade aufgefallen, dass ich vom PHP 7 die Fehlermeldung bekam, dass es den https Protocol Wrapper nicht gefunden hätte. Das war eine halbe Lüge, in meinem 7er PHP war die openssl Extension nicht aktiviert. Eingeschaltet, läuft.

      Rolf

      --
      sumpsi - posui - obstruxi
      1. Hallo Rolf,

        habe die PHP-Version 5.6 und E_ALL eingeschaltet und bekomme u.a.

        Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in /home/osmer/domains/remso.de/public_html/500/p532.php on line 9 Warning: get_headers(): Failed to enable crypto in /home/osmer/domains/remso.de/public_html/500/p532.php on line 9 Warning: get_headers(https://www.konzertchor-darmstadt.de/wp-content/uploads/2022/02/erlaube_mir.mp3): failed to open stream: operation failed in /home/osmer/domains/remso.de/public_html/500/p532.php on line 9 bool(false)

        Was muss ich wo schrauben?

        Liegt das (auch) an der mp3-Datei? Diese hier

        http://www.die-landratten.de/04%20La%20Paloma.mp3

        gibt den Header HTTP/1.1 200 OK

        1. Hallo Linuchs,

          nein, das liegt am Protokoll. http funktioniert, https nicht. Er sagt auch warum:

          SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in /home/osmer/domains/remso.de/public_html/500/p532.php

          Warum er das Zertifikat bei Dir nicht validieren kann, weiß ich nicht. Das ist dein System und deine Betriebsführung.

          Es gibt aber eine Menge Leidensgenossen: google

          Vielleicht eine veraltete OpenSSL Version im mumifizierten PHP 5.6? Meins läuft auf dem neu installierten System nicht mehr; mir fehlt eine MSVC Runtime dafür die ich erstmal raussuchen müsste. Aber nicht dafür.

          Rolf

          --
          sumpsi - posui - obstruxi
          1. Nachtrag

            Hab's doch getan - funktioniert. Liegt also nicht an der openssl-Extension im PHP 5.6 an sich. Kann ein Linux- oder Linuchs-Problem sein.

            Ggf. sind deine Stammzertifikate nicht aktüll. Das geht von Let's Encrypt (2015-2035) über R3 (2020-2025) nach konzertchor-darmstadt (9. Mai bis 7. August 2022)

            Das kannst Du nur prüfen.

            Rolf

            --
            sumpsi - posui - obstruxi
            1. Kann ein Linux- oder Linuchs-Problem sein.

              Ich würde ja meinen, man sollte seine Systeme wenigstens ein wenig Up-To-Date halten. Wenn es denn immer noch PHP 5.6 ist, dann würde ich auch einen Aktualitätsmangel an anderen Stellen vermuten - und siehe da:

              https://stackoverflow.com/questions/69397218/sudden-openssl-error-messages-error14090086-using-file-get-contents:

              Zitat:

              My solution is:

              • sudo yum update ca-certificates
              • grep DST_Root_CA_x3 /etc/ssl/certs/ca-bundle.crt
              • remove DST_Root_CA_x3 cert if exists
              • restart your service

              Das würde dann auch erklären, warum der Spaß bei Dir geht und bei Linuchs nicht...

  3. Hallo,

    wie kann ich die Laufzeit einer mp3 Datei ermitteln ohne die Datei zu laden?

    gar nicht.

    Irgendwas mit header?

    Nein. Das mp3-Dateiformat hat keinen Header. Da folgt nur ein Datenblock auf den nächsten, optional zwischendrin (meist am Anfang oder am Ende) ein ID3-Tag.

    Was Michael gefunden hat, nämlich die Dateigröße durch die Bitrate zu dividieren, ist auch nicht so einfach, denn die Bitrate kann ja variabel sein, sich also von einem Block zum anderen jederzeit ändern.

    Unter Suchbegriff "mp3 laufzeit auslesen" finde ich keine Antworten.

    Kein Wunder.

    Einen schönen Tag noch
     Martin

    --
    Nein, Esel sind nicht störrisch. Sie wissen es einfach nur besser.
  4. duration=$(mpg123 -v -s --au /dev/null 'City - Am Fenster, 1978.mp3' 2>&1 | grep 'finished' | tr -d '[' | sed -e's/. .*$//');
    echo $duration;
    

    So klappt das in der Linux-Shell. ... Dauert aber ein wenig: 3,514s Sekunden auf einem Raspi400.

    1. Hallo,

      duration=$(mpg123 -v -s --au /dev/null 'City - Am Fenster, 1978.mp3' 2>&1 | grep 'finished' | tr -d '[' | sed -e's/. .*$//');
      echo $duration;
      

      So klappt das in der Linux-Shell. ... Dauert aber ein wenig

      kein Wunder - auch dieses Tool muss die mp3-Datei von Anfang bis Ende durchparsen.

      Einen schönen Tag noch
       Martin

      --
      Nein, Esel sind nicht störrisch. Sie wissen es einfach nur besser.
      1. Hallo,

        duration=$(mpg123 -v -s --au /dev/null 'City - Am Fenster, 1978.mp3' 2>&1 | grep 'finished' | tr -d '[' | sed -e's/. .*$//');
        echo $duration;
        

        So klappt das in der Linux-Shell. ... Dauert aber ein wenig

        kein Wunder

        Nein, ist es wirklich nicht: Ich kann wohl recht ordentlich mit Linux-Programmen im Terminal umgehen und hab ebenso wohl so abstruse wie funktionierende Ideen wie man da Missbrauch treiben kann…