amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > MP3 VBR Laufzeit berechnen [ - Suche - Neue Beiträge - Registrieren - Login - ]

1 2 -3- 4 5 6 7 [ - Beitrag schreiben - ]

05.08.2005, 20:42 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von Holger:
Na so vereinfacht, wird das wohl kaum etwas. Hier mal der vereinfachte code aus einem funktionierendem Beispiel:
Zitat:
IF Layer=1 THEN
  framesize = 4 * (12 * bitrate / frequency + padding_bit)
ELSE IF Layer=2 THEN
  framesize = 144 * bitrate / frequency + padding_bit
ELSE IF Layer=3 THEN
  IF version = MPEGVERSION_2_5
    framesize = 144 * bitrate / frequency + padding_bit
  ELSE
    framesize = 72000 * bitrate / frequency + padding_bit
  ENDIF
ENDIF

Bitte die wahrscheinlich nicht ganz basic-konforme syntax zu entschuldigen. Mein letztes Basic-Programm liegt jahrhunderte zurück.

Doch, sieht schon sehr gut aus. Das eigentlich Problem is aber das ich vermutlich einen falschen Header bekommen, bzw. falsche Infos und daraus kann ich halt nur falsche Infos bekommen.
z.b. ändert sich laufend die ID im gleichen Streams! Das kann ja wohl nicht sein. :)

Hm, sehr seltsam.
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

05.08.2005, 20:55 Uhr

David
Posts: 65
Nutzer
@Ralf27:

bei einem Frame sind nur die ersten 11 Bits zur Kennung gesetzt.
Quelle: http://www.dv.co.yu/mpgscript/mpeghdr.htm


in deinem Code
code:
IF PEEK(buf&+i&)=255 THEN
   a=PEEK(buf&+i&+1)
   IF(a AND 240)=240 THEN

müssen die ersten 12 Bits gesetzt sein


es müsste so geprüft werden, wenn ich jetzt nicht total
falsch liege.

code:
IF PEEK(buf&+i&)=255 THEN
   a=PEEK(buf&+i&+1)
   IF(a AND 224)=224 THEN







--
mfg
David
http://www.david-mevius.de

[ - Antworten - Zitieren - Direktlink - ]

05.08.2005, 20:59 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Ralf27:
Ich vermute mal das es ganz so wäre wie in C. Ich vermute du sprichst auf HOOKs an? Ich hab damit wirklich noch nie was gemacht und für mich sind das eher Schreckgespenster. :)

Nein, mit hooks hat das nichts zu tun.
Unter AmigaOS sind Dateisystem, Gerätetreiber und Anwendungsprogramm unterschiedliche Tasks, die per Messages kommunizieren. Für die einfache Programmierung übernimmt die dos.library das Verschicken der Messages vom Anwendungsprogramm an das Dateisystem (sog. dos-packets) und das Warten auf die Anwort. Nachteil: dos-Funktionen warten immer auf die Antwort, bevor sie zurückkehren.
Wenn man die Messages selber verschickt (oder sich einer hilfs-lib ala asynchio.library bedient), kann man lese-Anforderungen verschicken, ohne auf die Antwort warten zu müssen.
Das heißt man kann einen Puffer-Speicher scannen, während die Festplatte parallel dazu schon den nächsten mit Daten füllt.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

05.08.2005, 21:14 Uhr

Holger
Posts: 8116
Nutzer
@David:
Ganz richtig.
Da sieht man mal, wie praktisch die hexadezimale Eingabemöglichkeit ist. Da merkt man so etwas sofort...

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

05.08.2005, 21:48 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von David:
...müssen die ersten 12 Bits gesetzt sein...


Das ist absicht, denn ich Prüfe nur auf MPEG1 und MPEG2, das MPEG2.5 lass ich weg. MPEG2.5 ist ein nicht amtliches Format.

Aber es ist ja eigentlich auch vollkommend Egal, weil ich ja ein Frameproblem habe. Ich bezweifle das ich ein MPEG2.5-Stream hier habe. :) Wenn es so wäre, dann hätte mein Programm ja nichts finden dürfen, was aber ja auch nicht der Fall ist.

Aber danke für den Hinweis.
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

05.08.2005, 21:50 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von Holger:
@David:
Ganz richtig.
Da sieht man mal, wie praktisch die hexadezimale Eingabemöglichkeit ist. Da merkt man so etwas sofort...


Hm, Hexdezimal kann ich es auch mit Basic machen. Aber das mit dem ausklammern von MPEG2.5 war Absicht.

Vermutlich kann man die ganzen Bitoperationen mit Basic auch eleganter lösen, aber es sollte doch eigentlich auch so laufen, was es ja leider nicht macht.

Langsam bin ich auch etwas ratlos... Help me, please! :lach: :D
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

05.08.2005, 21:52 Uhr

David
Posts: 65
Nutzer
@Holger:

ein 0xFF und 0xE0 hat schon was für sich.


irgendwie bin jetzt auf dem Geschmak gekommen.

wir haben unsere Frame
AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM

wobei (bX unsere Bytes sind)
b1 = AAAAAAAA
b2 = AAABBCCD
b3 = EEEEFFGH
b4 = IIJJKLMM

für einen gültigen Frame muss folgendes stimmen:
IF (b1 AND 255) = 255 AND (b1 AND 224) = 224 THEN

'Version (Bits BB)
IF (b2 AND 24) = 0 THEN
'MPEG 2.5
ELSEIF (b2 AND 24) = 16 THEN
'MPEG 2.0
ELSEIF (b2 AND 24) = 24 THEN
'MPEG 1.0
ELSE
'nicht definiert
END IF

' Layer (Bits CC)
IF (b2 AND 6) = 6 THEN
' Layer 1
IF (b2 AND 6) = 4 THEN
' Layer 2
IF (b2 AND 6) = 2 THEN
' Layer 3
ELSE
' nicht definiert
END IF

' Protection bit CRC (Bit D)
IF (b2 AND 1) = 1 THEN
' kein CRC
ELSE
' CRC
END ID



Die anderen 2 Bytes werden folgen.


--
mfg
David
http://www.david-mevius.de

[ - Antworten - Zitieren - Direktlink - ]

05.08.2005, 21:58 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von David:
für einen gültigen Frame muss folgendes stimmen:
IF (b1 AND 255) = 255 AND (b1 AND 224) = 224 THEN

Da ist ein kleiner Fehler:
IF (b1 AND 255) = 255 AND (b2 AND 224) = 224 THEN

Bzw. kann man weiter unten auch einige Parameter direkt auslesen, wie z.b. Layer, Freq. Insofern sollte das ja in meinem Prog da weiter oben stimmen. Aber alle hab ich nicht ausgelesen, was ja eigentlich weniger Sinn macht wenn man nur die Zeit wissen möchte.

Aber wie ist das eigentlich bei z.b. Stereo, muß ich dann die Ausgegebene Zeit durch zwei Teilen, oder was ist gar mit Mehrkanalton? Wenn ich das irgendwo richtig gelesen habe geht sogar 5.1 ?!?
--
http://www.alternativercomputerclub.de.vu

[ Dieser Beitrag wurde von Ralf27 am 05.08.2005 um 21:58 Uhr editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

05.08.2005, 22:35 Uhr

David
Posts: 65
Nutzer
Zitat:
Original von Ralf27:
Zitat:
Original von David:
für einen gültigen Frame muss folgendes stimmen:
IF (b1 AND 255) = 255 AND (b1 AND 224) = 224 THEN

Da ist ein kleiner Fehler:
IF (b1 AND 255) = 255 AND (b2 AND 224) = 224 THEN


son Mist aber auch, glatt übersehen.

Zitat:
Bzw. kann man weiter unten auch einige Parameter direkt auslesen, wie z.b. Layer, Freq. Insofern sollte das ja in meinem Prog da weiter oben stimmen. Aber alle hab ich nicht ausgelesen, was ja eigentlich weniger Sinn macht wenn man nur die Zeit wissen möchte.

Nur für die Zeit macht es keien Sinn, wie gesagt war nur auf dem Geschmack gekommen.

Zitat:
Aber wie ist das eigentlich bei z.b. Stereo, muß ich dann die Ausgegebene Zeit durch zwei Teilen, oder was ist gar mit Mehrkanalton? Wenn ich das irgendwo richtig gelesen habe geht sogar 5.1 ?!?

ob es einen Unterschied für die Berechnung der Zeit ist
ob es Mono oder Stereo müsste ich mal prüfen.
Die Zeit berechne ich folgender maßen (es reicht dafür der erste Frame eigentlich aus):
ZeitSec=(filesize-id3tagsize)*8/bitrate

Aber wie es jetzt mit 5.1 aussieht ist eine gute Frage, da müsste
es andere Header geben.

Wollte damals (ca. 2000) eigentlich nur ein Programm schreiben womit
ich den ID3v2 Tag editieren konnte, weil ich dafür kein Progamm gefunden habe, so ist eigentlich die id3tag.library und id3tagLibGUI entstanden.



--
mfg
David
http://www.david-mevius.de

[ - Antworten - Zitieren - Direktlink - ]

05.08.2005, 23:03 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Ralf27:
Aber wie ist das eigentlich bei z.b. Stereo, muß ich dann die Ausgegebene Zeit durch zwei Teilen, oder was ist gar mit Mehrkanalton? Wenn ich das irgendwo richtig gelesen habe geht sogar 5.1 ?!?

Hä?
Du hast Frames mit einer Definition ala Mpeg xx, Layer yy := 1152 Samples/Frame. Das ist doch gleichbedeutend mit "1 Frame == ?? ms". Ist doch vollkommen egal, wieviele Kanäle das sind.
Oder andersherum rechnest Du mit der effektiven Bitrate in n bits/s. Wenn Du die Dateilänge durch die Rate teilst, kommt somit die Zeit heraus, vollkommen egal wieviele Kanäle. Wahrscheinlich brauchen mehr Kanäle tendenziell mehr Bits pro Sekunde, aber das ist für die Rechnung doch egal.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

05.08.2005, 23:20 Uhr

MaikG
Posts: 5172
Nutzer
>Nun, da kann ich dir widersprechen. Ich benutze ja keine
>Strings um eine Zahl darzustellen. Kleines Beispiel:

Ich habe es mittels Print ausgeben lassen, einmal
meine Methode mit Strings und einmal deine Methode.

Die Werte sind unterschiedlich. Daher ist die Gesamtbitrate
falsch und daher die Zeit.
Aber ich probier gleich nochmal das komplette PRG
von dir.

[ - Antworten - Zitieren - Direktlink - ]

05.08.2005, 23:28 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von MaikG:
>Nun, da kann ich dir widersprechen. Ich benutze ja keine
>Strings um eine Zahl darzustellen. Kleines Beispiel:

Ich habe es mittels Print ausgeben lassen, einmal
meine Methode mit Strings und einmal deine Methode.

Die Werte sind unterschiedlich. Daher ist die Gesamtbitrate
falsch und daher die Zeit.
Aber ich probier gleich nochmal das komplette PRG
von dir.


Das kann ich mir kaum vorstellen das das nicht geht mit den Binäroperationen, über die wir hier die ganze Zeit hier tippen.

Geb doch einfach mal ein Beispiel (Code).

Das Programm von mir läuft nicht, wie es hier steht.

Außerdem vermute ich mal das die Sache mit Xing nur mit MP3s laufen die mit Xing komprimiert worden sind. Denn bei MP3s gibt es doch eigentlich nicht diesen FLAG, FRAME oder sonst was.

Ich versuche das die ganze Zeit mit denn MP3s die ich hier habe.

Ich dachte auch die ganze Zeit das Xing einfach nur sowas wie Lame ist die zwar MP3s kodieren, aber die Dateien vom Aufbau her gleich sind, damit es halt die unterschiedlichen Player lesen können. Oder steh ich jetzt ganz auf dem Schlauch? Unterschiede können ja drin sein wie z.b. erweitere Tags oder so was.
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

05.08.2005, 23:29 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von Holger:
Hä?
Du hast Frames mit einer Definition ala Mpeg xx, Layer yy := 1152 Samples/Frame. Das ist doch gleichbedeutend mit "1 Frame == ?? ms". Ist doch vollkommen egal, wieviele Kanäle das sind.
Oder andersherum rechnest Du mit der effektiven Bitrate in n bits/s. Wenn Du die Dateilänge durch die Rate teilst, kommt somit die Zeit heraus, vollkommen egal wieviele Kanäle. Wahrscheinlich brauchen mehr Kanäle tendenziell mehr Bits pro Sekunde, aber das ist für die Rechnung doch egal.


Da hast du natürlich recht. Aber zur Zeit zweifle ich sehr stark an mir. Ich versteh es ehrlichgetippt gerade nicht. Siehe auch Poste von mir eins weiter oben.
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

05.08.2005, 23:33 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von MaikG:
Aber ich probier gleich nochmal das komplette PRG
von dir.


Das Prog von mir ist eine komplette Neuimplementierung nach den Dokus die ich hier habe. Es zielt auf MP3s ab.

Denn Xing-Tag hab ich nicht in meinen MP3s getestet, bzw. finde ich nicht in den normalen MP3-Dokus. Ich bin da wohl gerade in einem Bahnhof...

Ich könnte mir nochmal deinen Code nehmen und wirklich 1 zu 1 optimieren so das er genau so läuft wie er gerade bei dir ist und fertig. Allerdings kann ich ihn dann auch nicht testen.

Oder schick mir einfach die Testdatei zu die du benutzt. Ich will der Sache endlich mal auf den Grund gehn! 8) :lach: :D
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

05.08.2005, 23:43 Uhr

David
Posts: 65
Nutzer
Soweit mir bekannt ist, wurde VBR durch Xing bei mp3 eingeführt
worden. Ist somit auch nicht offiziell, soll halt die Qualität bei kleinerer Dateigröße erhöhen.

Deshalb gibt den den Xing-Header in dem die durchschnittliche Bitrate steht, würde es diesen nicht geben müsste man tatsächlich von jeden Frame die Bitrate ermitteln, was natürlich zeitaufwendig ist.


--
mfg
David
http://www.david-mevius.de

[ Dieser Beitrag wurde von David am 05.08.2005 um 23:45 Uhr editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

05.08.2005, 23:47 Uhr

Ralf27
Posts: 2779
Nutzer
Ok, jetzt machen wir Nägel mit Köpfen:

Maik, ich brauche nochmal deine aktuelles Programm PLUS eine TestMP3-Datei. Ich will es jetzt wissen! :)
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

05.08.2005, 23:49 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von David:
Soweit mir bekannt ist, wurde VBR durch Xing bei mp3 eingeführt
worden. Ist somit auch nicht offiziell, soll halt die Qualität bei kleinerer Dateigröße erhöhen.

Deshalb gibt den den Xing-Header in dem die durchschnittliche Bitrate steht, würde es diesen nicht geben müsste man tatsächlich von jeden Frame die Bitrate ermitteln, was natürlich zeitaufwendig ist.


Ich schätze mal 1 Sek pro MB oder weniger. Ich benutze jetzt das Prog von MeikG und optimere es. Wenn ich eine XING-Datei habe, dann teste ich es.

Aber was mich gerade auch total irritiert:
Mein Progamm sollte so eigentlich auch jedes Frame testen, was es aber nicht hinbekommt.
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

06.08.2005, 00:02 Uhr

MaikG
Posts: 5172
Nutzer
>Das Programm von mir läuft nicht, wie es hier steht.

Ich weiss gibt immer 0 sekunden aus, egal ob mit oder
ohne VBR.

Meins ist bei 28 Sekunden, trotzdem kann man dein
Bitraten-Teil nicht einsetzen da es falsche werte
liefert.

>Außerdem vermute ich mal das die Sache mit Xing nur mit
>MP3s laufen die mit Xing komprimiert worden sind.

richtig, alternativ gibts "Info" sonst gibt es keine
die normalerweise gross verwendet werden.

>Ich dachte auch die ganze Zeit das Xing einfach nur sowas
>wie Lame ist die zwar MP3s kodieren, aber die Dateien vom
>Aufbau her gleich sind, damit es halt die unterschiedlichen
>Player lesen können.

Lame macht Xing, andere Encoder machen auch Info.


Denn Xing-Tag hab ich nicht in meinen MP3s getestet, bzw.
finde ich nicht in den normalen MP3-Dokus. Ich bin da wohl
gerade in einem Bahnhof...

>Ich könnte mir nochmal deinen Code nehmen und wirklich 1 zu 1
>optimieren so das er genau so läuft wie er gerade bei dir
>ist und fertig. Allerdings kann ich ihn dann auch nicht
>testen.


Das währe am besten als von neu anzufangen...



>Maik, ich brauche nochmal deine aktuelles Programm PLUS eine
>TestMP3-Datei. Ich will es jetzt wissen! :)

Ich schick dir das aktuelle gleich rüber, mp3 geht heute aber
nicht mehr ich muss langsam ins Bett(Analog Modem).

[ - Antworten - Zitieren - Direktlink - ]

06.08.2005, 00:07 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von MaikG:
>Das Programm von mir läuft nicht, wie es hier steht.

Ich weiss gibt immer 0 sekunden aus, egal ob mit oder
ohne VBR.

Klar, ich hab es jetzt ohne Sekundenberechnung gemacht (REM vor den jeweiligen Zeilen), weil es einfach Schwierigkeiten gibt mit den Headern.
Zitat:
Meins ist bei 28 Sekunden, trotzdem kann man dein
Bitraten-Teil nicht einsetzen da es falsche werte
liefert.

>Außerdem vermute ich mal das die Sache mit Xing nur mit
>MP3s laufen die mit Xing komprimiert worden sind.

richtig, alternativ gibts "Info" sonst gibt es keine
die normalerweise gross verwendet werden.

>Ich dachte auch die ganze Zeit das Xing einfach nur sowas
>wie Lame ist die zwar MP3s kodieren, aber die Dateien vom
>Aufbau her gleich sind, damit es halt die unterschiedlichen
>Player lesen können.

Lame macht Xing, andere Encoder machen auch Info.


Denn Xing-Tag hab ich nicht in meinen MP3s getestet, bzw.
finde ich nicht in den normalen MP3-Dokus. Ich bin da wohl
gerade in einem Bahnhof...

>Ich könnte mir nochmal deinen Code nehmen und wirklich 1 zu 1
>optimieren so das er genau so läuft wie er gerade bei dir
>ist und fertig. Allerdings kann ich ihn dann auch nicht
>testen.


Das währe am besten als von neu anzufangen...



>Maik, ich brauche nochmal deine aktuelles Programm PLUS eine
>TestMP3-Datei. Ich will es jetzt wissen! :)

Ich schick dir das aktuelle gleich rüber, mp3 geht heute aber
nicht mehr ich muss langsam ins Bett(Analog Modem).


Schade. Ich brauch wohl für den Code ca. 10-15Min. Man sieht ja da oben beim Code von mir wie es dann ca. aussieht. Nur hab ich halt die Xing-Story oben rausgelassen.

Vermutlich mach ich das dann aber auch erst morgen, weil ich ja morgen wieder auf die Arbeit mach (ja, auch Samstags).
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

06.08.2005, 00:12 Uhr

David
Posts: 65
Nutzer
@Ralf27:

Die Framelänge, meine ich, ist inklusiv Header.

--
mfg
David
http://www.david-mevius.de

[ - Antworten - Zitieren - Direktlink - ]

06.08.2005, 03:44 Uhr

Holger
Posts: 8116
Nutzer
Ich ergreife jetzt mal die Initiative und poste ein Programm, daß zumindest mit den typischen Mpeg 1, Layer 3 Dateien zurechtkommt. Hat zumindest bei mir funktioniert.
Leider in ace-Basic, weil ich kein MBasic habe. D.h. der Anfang mit den libraries und dem Einladen muß vorher angepaßt werden.
code:
DEFINT a-z

LIBRARY "exec.library"
DECLARE FUNCTION AllocVec&(size&,flags&) LIBRARY
DECLARE FUNCTION FreeVec(mem&) LIBRARY
LIBRARY "dos.library"
DECLARE FUNCTION _Read(handle&,buffer&,size&) LIBRARY
REM LIBRARY OPEN "dos.library"
REM LIBRARY OPEN "exec.library"

DIM tbl&(2,4,15):REM MPEG,Layer,Bitrate
FOR z=0 TO 1
 FOR y=1 TO 3
  FOR x=1 TO 14
   READ a&
   tbl&(z,y,x)=a&*1000:REM kHz, also mal 1000
  NEXT
 NEXT
NEXT
REM MPEG1
DATA 32,64,96,128,160,192,224,256,288,320,352,384,416,448
DATA 32,48,56,64,80,96,112,128,160,192,224,256,320,384
DATA 32,40,48,56,64,80,96,112,128,160,192,224,256,320
REM MPEG2
DATA 32,48,56,64,80,96,112,128,144,160,176,192,224,256
DATA 8,16,24,32,40,48,56,64,80,96,112,128,144,160
DATA 8,16,24,32,40,48,56,64,80,96,112,128,144,160

DIM Freq&(2,3):REM MPEG,Wert
FOR z=0 TO 1
 FOR x=0 TO 2
  READ Freq&(z,x)
 NEXT
NEXT

DATA 44100,48000,32000
DATA 22050,24000,16000

filename$="mp3:copied/Thievery Corporation - The Cosmic Game/"
filename$=filename$+"02 - Warning Shots (Featuring Sleepy Wonder And Gunjan).mp3"

 PRINT "Lese "filename$
REM OPEN filename$ FOR INPUT AS 1
OPEN "R",#1,filename$
Dateilaenge&=LOF(1)
IF Dateilaenge&=0 THEN END
buf&=AllocVec(Dateilaenge&,1)
IF buf&=0 THEN END
rd&=_Read&(HANDLE(1),buf&,Dateilaenge&)
CLOSE #1

 PRINT rd&" von "Dateilaenge&" gelesen, puffer 0x"+HEX$(buf&)
Dateilaenge&=rd&

 PRINT"Durchsuche"
 FIRST=-1
 i&=0
 frames&=0
 rates&=0
 WHILE i& < Dateilaenge& AND PEEK(buf&+i&)<>255
   i&=i&+1
 WEND
 WHILE i& < Dateilaenge&
  IF FIRST THEN
    if(i&>0) THEN
      IF(i&>1) THEN PRINT PEEK (buf&+i&-2);CHR$(9);
      PRINT PEEK(buf&+i&-1);CHR$(9);
    END IF
    PRINT "> ";PEEK(buf&+i&);CHR$(9);
    PRINT PEEK(buf&+i&+1);CHR$(9); PEEK(buf&+i&+2)
  END IF
  IF(PEEK(buf&+i&)<> 255 OR (PEEK(buf&+i&+1) AND 224)<>224) GOTO Ende
  IF i& >= Dateilaenge& GOTO Ende
  b=PEEK(buf&+i&)
  a=PEEK(buf&+i&+1)
  IF b=255 AND (a AND 240)=240 THEN
    REM Frame gefunden
    REM PRINT "Frame at "i&
    frames&=frames&+1
    ID=1- (a AND 8)8 :REM bit gesetzt == MPEG 1
    Layer=4-(a AND 6)2
    IF FIRST THEN PRINT "Layer "Layer", ID "ID;
REM    Check=(a AND 1)
    a=PEEK(buf&+i&+2)
    IF FIRST THEN PRINT ", RateIx ";((a AND 240)16);
    Bitrate&=tbl&(ID,Layer,(a AND 240)16)
    IF FIRST THEN PRINT ", C Bitrate "Bitrate&;
    rates&=rates&+Bitrate&1000
    Frequenz&=Freq&(ID,(a AND 12)4)
    IF FIRST THEN PRINT ", Frequenz "Frequenz&;
    Padding=(a AND 2)2
    IF FIRST THEN PRINT ", Padding "Padding
    IF Bitrate&<=0 THEN GOTO Ende
REM    i&=i&+4
REM    IF Check THEN i&=i&+2
    IF Layer=1 THEN
      REM 384 Samples bei Layer1
      frameLength&=(12*Bitrate&Frequenz&+Padding)*4
    ELSE IF Layer=2 OR ID=0 THEN
        REM 1152 Samples Layer2 oder L3+MPEG1
        frameLength&=144*Bitrate&Frequenz&+Padding
      ELSE
        REM 576 Samples Layer3, MPEG 2 oder MPEG2.5
        frameLength&=72*Bitrate&Frequenz&+Padding
      END IF
    END IF
    IF frameLength&=0 GOTO Ende
    i&=i&+frameLength&;
  END IF
  FIRST=0
  IF i&>Dateilaenge& THEN END
 WEND

Ende:
FreeVec (buf&)

 PRINT"Scanned "frames&" frames"
 IF Layer=1 THEN
   sec%=384*frames&/Frequenz& :REM 384 Samples bei Layer1
 ELSE IF Layer=2 OR ID=0 THEN
     sec%=1152*frames&/Frequenz& :REM 1152 Samples Layer2 oder L3+MPEG1
   ELSE
     sec%=576*frames&/Frequenz& :REM 576 Samples Layer3, MPEG 2 oder MPEG2.5
   END IF
 END IF

 min%=sec%60
 sec%=sec%-min%*60
 IF sec%<10 THEN pad$=":0" ELSE pad$=":"
 PRINT"Dauer:"str$(min%)+pad$+right$(str$(sec%) , 3-LEN(pad$))

 PRINT"Avg Bitrate:"rates&/frames&"kBit/s"

--
Nachtrag: ich hab das Programm inplace aktualisiert, um das Forum nicht übermäßig zu füllen. Jetzt beherrscht es auch mpeg2, layer 3.
Zumindest hat es mit ein paar Testfiles funktioniert.
Ausführlichere Tests wollte ich erstmal um diese Uhrzeit nicht...

äh, Uhrzeit :nuke:
ja muß verrückt sein

:sleep:

[ Dieser Beitrag wurde von Holger am 06.08.2005 um 05:34 Uhr editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

06.08.2005, 04:06 Uhr

Holger
Posts: 8116
Nutzer
Mein kurzer Praxis-Test heute hat ergeben, daß von 3500 mp3's mit vbr gerade mal 200 kein Xing tag hatten.
Es lohnt sich also, eine entsprechende Unterstützung einzubauen, zumindest, wenn man viele Dateien scannen will. Hab mir auch noch mal eine Dokumentation dazu angesehen, aber im Prinzip ist es genau so, wie ich schon weiter oben beschrieben hatte.
Jetzt muß ich aber doch a bissel schlafen...

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ Dieser Beitrag wurde von Holger am 06.08.2005 um 05:41 Uhr editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

06.08.2005, 04:10 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Ralf27:
Da hast du natürlich recht. Aber zur Zeit zweifle ich sehr stark an mir. Ich versteh es ehrlichgetippt gerade nicht. Siehe auch Poste von mir eins weiter oben.

Da waren gleich mehrere Probleme. Und die verursachen dann neue. Du kannst z.B. nicht, wenn Du die frame-größe nicht ermitteln kannst, einfach durch die Datei laufen und nach headern suchen, da innerhalb der Daten öfters mal ein paar bytes daherkommen, die wie ein header aussehen können, aber im Endeffekt unsinnige Werte liefern.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

06.08.2005, 04:28 Uhr

whose
Posts: 2156
Nutzer
Ist zwar etwas off-topic, aber trotzdem:

Ich verfolge den Thread hier schon eine Weile, obwohl ich von dem Thema nicht allzu viel weiß und es wohl auch so schnell nicht brauchen werde. Mir ist aber eine Sache enorm positiv aufgefallen:

Die sonst üblichen Streitereien in der Richtung "Mach das doch in C, BASIC nimmt eh keiner mehr" oder "BASIC ist evil, weil nicht portabel" fehlen hier. Ich find das Klasse! :)

Macht weiter so, der Thread hier ist echt lehrreich und interessant zu lesen. Man bekommt endlich mal die Möglichkeit, etwas über den "AmigaOS ist nur in C vernünftig programmierbar"-Tellerrand hinauszuschauen :)

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

06.08.2005, 05:38 Uhr

Holger
Posts: 8116
Nutzer
@whose:
Tja, so mancher hat mal mit Basic angefangen :)
Und wenn alle konstruktiv sind, macht's auch Spaß und man ist erst recht motiviert, noch mehr beizusteuern.
Und ja, man braucht nicht unbedingt C, um schnelle Programme zu schreiben I-)

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

06.08.2005, 11:28 Uhr

MaikG
Posts: 5172
Nutzer
@Holger dein Basic programm geht nicht.

Du kannst Basic Dateifunktionen nicht mit
welche von librarys kombinieren.
Hab ich geädert, trotzdem ist was mit den Berechnungen
falsch MB brincht mit einem Fehler ab.

[ - Antworten - Zitieren - Direktlink - ]

06.08.2005, 12:37 Uhr

whose
Posts: 2156
Nutzer
@MaikG:

Naja, er schrieb ja, daß sein Code unter ACE entstand. Das ist größtenteils AmigaBASIC-Syntax, da gibts sicher ein paar Punkte, die sich mit MaxonBASIC beißen.

Schreib doch mal, welchen Fehler MB da meldet und wo das passiert.

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

06.08.2005, 14:46 Uhr

Holger
Posts: 8116
Nutzer
Yep, wie ich schon sagte, der library-Teil und der Datei-Einleseteil müssen angepaßt werden. Aber das sollte ja unproblematisch sein, da das Einlesen des kompletten files auch schon in den anderen Beispiel-Programmen in MBasic-Syntax enthalten ist.
Für weitere Fehler-Analysen brauche ich natürlich genauere Fehlerbeschreibungen.
Ich habe gerade das Überspringen von ID3v2 Headern eingebaut und bau jetzt Xing-Unterstützung ein und wenn's dann dergestalt optimiert ist, lasse ich es mal testweise über meine komplette mp3-Sammlung laufen, um mögliche Problemfälle zu finden :)

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

06.08.2005, 15:35 Uhr

MaikG
Posts: 5172
Nutzer
Fehler in Modul DOUBLES.
Das heisst soviel wie das irgend eine berechnungsoperation
falsch läuft oder Verschiedene Sorten von Variablen
auf die falsche weise kombiniert wurden.

[ - Antworten - Zitieren - Direktlink - ]

06.08.2005, 18:07 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von MaikG:
Fehler in Modul DOUBLES.
Das heisst soviel wie das irgend eine berechnungsoperation
falsch läuft oder Verschiedene Sorten von Variablen
auf die falsche weise kombiniert wurden.


So, bin endlich von der Arbeit. Ich schau mir das ganze jetzt mal an. Wir bekommen das schon hin. :)
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]


1 2 -3- 4 5 6 7 [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > MP3 VBR Laufzeit berechnen [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.