Seite 1 von 1

Bits, Bytes, Longs, Memory, ... und ich dreh durch

Verfasst: 11.07.2006 03:30
von Delle
So langsam verzweifel ich...

http://www.hib-wien.at/leute/wurban/inf ... ormat.html

Die MP3-Header sind also 4 Byte lang (=32 Bits), also sowas wie etwa: 11111111|111.....|........|........

Wieso werden dann da unten 28 Bytes reserviert und nicht 4 (mit 4 schmiert es ab!)???

Code: Alles auswählen

#BE_CONFIG_MP3 = 0 
#BE_MP3_MODE_MONO = 3 

*mem=AllocateMemory(28) 
PokeL(*mem+0,#BE_CONFIG_MP3) 
PokeL(*mem+4,44100) 
PokeB(*mem+8,#BE_MP3_MODE_MONO) 
PokeW(*mem+9,128) 
PokeL(*mem+13,0) 
Desweiteren warum wird die SampleRate von 44100 bei *mem+4 reingeschrieben? Bei Bitposition 21 müßte die doch laut obiger MP3-Doc hin...

Und laut Doc kommt auch die Bitrate 128 VOR der Sample-Rate, wieso hat die aber Wert +9???

Hat es irgendwas mit den verschiedenen Poke's zu tun?

Verfasst: 11.07.2006 04:02
von ts-soft
Du kannst nur ganze Bytes poken, mußt also mehrere Werte auf einmal
Poken, wenn diese kleiner als ein Byte sind (fast alle lt. Beschreibung)
Wenn Du die Samplerate Poken willst, geht das nur zusammen mit diesen
Angaben:
Bitrate Index
Sampling Rate Index
Padding bit
Private bit
Die bilden das dritte Byte :mrgreen:
Diese Procedure sollte dir helfen:

Code: Alles auswählen

Procedure.l SetBit(nValue.l, nBitNumber.l, nBoolean.l)
  nBitNumber = 1 << nBitNumber
  If nBoolean
    ProcedureReturn nValue | nBitNumber
  Else
    ProcedureReturn (nValue | nBitNumber) & ~nBitNumber
  EndIf
EndProcedure
Alle Bits richtig setzen, und dann das fertige Byte poken

Verfasst: 11.07.2006 10:10
von Konne

Code: Alles auswählen


Procedure SetBit(Long.l, Bit.l,Value.l) 
  Bit = 1 << Bit 
  If Value
    ProcedureReturn Long | Bit     
  Else
    ProcedureReturn (Long | Bit) & ~Bit 
  EndIf  
EndProcedure 

Procedure SetMultiBits(Long.l,Bit.l,Value.l,Digits)
  Bin.s=Bin(Value)
  Len.l=MemoryStringLength(@Bin)  
  Digits-1
  
  For t = Len To Len-Digits Step -1
    If t>0
      Long=SetBit(Long.l, Bit.l,Val(Mid(Bin,t,1)))
    Else
      Long=SetBit(Long.l, Bit.l,0)
    EndIf  
    
    Bit+1
  Next  
  
  ProcedureReturn Long
EndProcedure

Procedure WriteMP3Header(AudioVersion.b,Layer.b,Protection.b,BitrateIndex.b,SamplingRateIndex.b,Paddingbit.b,Channelmode.b,Copyright.b,Originalhome.b)
  Protected Out.l
  
  Out=%11111111111

  Out=SetMultiBits(Out,11,AudioVersion,2)
  Out=SetMultiBits(Out,13,Layer,2)
  Out=SetBit(Out,15,Protection)
  
  Out=SetMultiBits(Out,16,BitrateIndex,4)
  Out=SetMultiBits(Out,20,SamplingRateIndex,2)
  Out=SetBit(Out,22,Paddingbit)
  
  Out=SetMultiBits(Out,24,Channelmode,2)

  Out=SetBit(Out,27,Copyright)
  Out=SetBit(Out,28,Originalhome)
	
	Debug Bin(out)
  
  
  ProcedureReturn Out
EndProcedure

WriteMP3Header(1,1,1,1,1,1,1,1,1)
Versuche dass mal kann aber nicht garantieren dass es geht da ich mich kaum mit Bit Operationen auskenne!

Verfasst: 11.07.2006 11:46
von Delle
Okay, also das 3. Byte setzt sich demzufolge so zusammen:

0100 = Bitrate 128
00 = 44100 Hz
1 = Padding
0 = Private

---> 01000010, richtig? Und das könnte man dann mit z.B. PokeB*mem+2,%01000010) poken oder?

Was ich aber auch nicht verstehe:

http://www.mp3-tech.org/programmer/frame_header.html

Wieso fängt der Frame Sync am Anfang an (AAA...), wird aber
als Position 31-21 betitelt, sprich am Schluss der 4 Bytes?

Verfasst: 11.07.2006 11:50
von Slut-Hunter
Könnte(bin mir nicht sicher) was damit zu tun haben, daß viele Progs beim mp3 erstellen die Bitrate anders verteilen als sie im Header angegeben ist.

Im Header steht oft ein kbit/s weniger als die tatsächliche Bitrate pro Sekunde beträgt.

Die Einzigen Tools, die das immer ganz eaxt machen, die Sound Editoren wie Wavelab, Audacity usw.

Das kommt bei raus, wenn man etwas mit nem schnellen kleinen Tool codiert hat.

http://www.image-basket.com/uploads/b114e4fe14.png

Verfasst: 11.07.2006 11:54
von Kaeru Gaman
+2

aber ob das jetzt 0100-00-1-0 ist, oder 0-1-00-0100, bin ich mir nicht sicher.. :|

Verfasst: 11.07.2006 12:08
von Slut-Hunter
Würde dir ja gerne weiterhelfen, hilfst mir ja auch immer, aber im Gegensatz zu dir bin ichn Noob.

Hab kein Plan von Bit Operationen.

Verfasst: 11.07.2006 17:12
von ts-soft
Bit Bits gehen von 31- 0, also 32 Bit.
31 ist wohl das höchste Bit %1111111111100000000000000000000

Das wäre dann der FrameSync. Wenn Du schlauer Weise gleich alles
schreibst, also als Long kannste Dir da ne Konstante draus machen

Code: Alles auswählen

#Sync = FFE00000

Header.l
Header | #Sync
usw., zum Schluß haste ein Long mit dem Header
:wink:

Verfasst: 11.07.2006 20:49
von mk-soft
ACHTUNG!!!
Intel Arbeitet mit Low/High Byte Notation

Code: Alles auswählen

; Byte Array unbekannter grösse
Structure byteArray
  b.b[0]
EndStructure

*mem.byteArray = @Value

Value.l = 255
Debug "Value.l = 255"
Debug Hex(*mem\b[0] & $FF)
Debug Hex(*mem\b[1] & $FF)
Debug Hex(*mem\b[2] & $FF)
Debug Hex(*mem\b[3] & $FF)
Value.l = 256
Debug "Value.l = 256"
Debug Hex(*mem\b[0] & $FF)
Debug Hex(*mem\b[1] & $FF)
Debug Hex(*mem\b[2] & $FF)
Debug Hex(*mem\b[3] & $FF)
Also kommt das niederwertige Byte zuerst

FF :wink: