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

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
usw., zum Schluß haste ein Long mit dem Header

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
