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

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

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

Beitrag 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?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Konne
Beiträge: 764
Registriert: 30.03.2005 02:20
Kontaktdaten:

Beitrag 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!
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Beitrag 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?
Zuletzt geändert von Delle am 11.07.2006 11:54, insgesamt 1-mal geändert.
Slut-Hunter
Beiträge: 40
Registriert: 05.06.2006 12:38

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

+2

aber ob das jetzt 0100-00-1-0 ist, oder 0-1-00-0100, bin ich mir nicht sicher.. :|
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Slut-Hunter
Beiträge: 40
Registriert: 05.06.2006 12:38

Beitrag 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.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten