 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Andy19312
Anmeldungsdatum: 22.10.2005 Beiträge: 428
|
Verfasst am: 03.05.2009, 21:24 Titel: mp3 Frame Header |
|
|
Das Thema war schon mal gewesen.
Hier ein Link:
http://www.mp3-tech.org/programmer/frame_header.html
Code: |
dim a as uinteger
dim aa as ULONGINT
dim i as ULONGINT
dim b as uinteger
dim array (1 to 10000) as string
DIM FixedLenBuffer AS STRING * 1
Dim text as string
dim asci as uinteger
dim binaer as string
dim frame(1 to 10000) as string
dim frame1 as string
dim texta as string
dim textb as string
dim texta1 as string
dim texta2 as string
dim asci1 as uinteger
dim binaer1 as string
Open "c:\a.mp3" For Binary As #1
do
aa = aa + 1
Get #1, aa , FixedLenBuffer
text = text + FixedLenBuffer
loop until eof (1)
Close #1
print aa
for i = 1 to aa
texta = mid (text,i,1)
asci = asc(texta)
binaer = bin (asci, 8)
if binaer = "11111111" then
texta1 = mid (text,i+1,1)
asci1 = asc(texta1)
binaer1 = bin (asci1, 8)
texta2 = mid (binaer1,1,3)
if texta2 = "111" then
b = b + 1
frame1 = mid (text,i,4)
frame(b) = frame1
end if
end if
next
OPEN "c:\mp3.txt" FOR APPEND AS #1
for i = 1 to b
PRINT #1, frame(i)
next
CLOSE #1
sleep
|
Was ist an dem Code falsch, also irgendwie stimmt es mit dem Frame-Header nicht.
Zur Synchronisation: Es muss die Bitfolge 11 * die 1 sein.
Wenn man das hat, kann man alles einlesen, natürlich nur 4 Byte.
Die Verwurschtelung der Daten muss dann aber erst noch folgen. |
|
Nach oben |
|
 |
max06

Anmeldungsdatum: 05.12.2004 Beiträge: 390 Wohnort: Augsburg
|
Verfasst am: 03.05.2009, 22:48 Titel: |
|
|
Ich würde mal behaupten, dass Code: | IF binaer = "11111111" THEN | nicht dem entspricht, was du vergleichen willst.
Da du binaer als string definiert hast, steht da garantiert was anderes als 0b11111111 drin.
Vorschlag: Definier binaer als Integer (oder ähnliches) und fülle die Variable mit 0xFF (was einem 0b11111111) komplett entspricht. Jetzt musst du nur noch die entsprechende Stelle aus der Datei suchen und mit binaer vergleichen.
Ist nur eine Anregung, für kompletten Code fehlt mir leider momentan die Zeit.
Gruß,
max06 |
|
Nach oben |
|
 |
Andy19312
Anmeldungsdatum: 22.10.2005 Beiträge: 428
|
Verfasst am: 03.05.2009, 23:40 Titel: |
|
|
will nicht klappen ;(
wenn mir jemand helfen könnte, wäre ich echt dankbar |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 04.05.2009, 15:01 Titel: |
|
|
Da ich mich in letzter Zeit sehr viel mit Audiodateiformaten beschäftigt habe und ein Programm zum Auslesen von ID3v1 / ID3v2 / OGG / ASF / APE / Lyrics3 / usw. geschrieben habe, hab ich jetzt schnell ein Programm zum Auslesen eines Frames geschrieben. Mein Programm sucht nach 8+3 hintereinander folgenden gesetzten Bits in der gesamten Datei. Das Verfahren funktioniert zwar, aber das Ergebnis erscheint mir doch etwas seltsam. Ich habe mir außerdem das von dir verlinkte Dokument nur schnell überflogen und die einfacheren Sachen implementiert.
Vielleicht hilft es dir ja etwas:
Code: | open "demo.mp3" for binary as #1
dim Daten as string
dim Frame as string * 4
dim q as integer
Daten = space(lof(1))
get #1,,Daten
for q = 1 to lof(1)-1
if ((asc(mid(Daten, q, 1)) AND &HFF) = &HFF) AND ((asc(mid(Daten, q+1, 1)) AND &B11100000) = &B11100000) then
Frame = mid(Daten, q, 4)
print "Frame gefunden (Byte";q;")"
print " + ";bin(asc(mid(Frame, 1)),8);" (";hex(asc(mid(Frame, 1)));")"
print " + ";bin(asc(mid(Frame, 2)),8);" (";hex(asc(mid(Frame, 2)));")"
print " + ";bin(asc(mid(Frame, 3)),8);" (";hex(asc(mid(Frame, 3)));")"
print " + ";bin(asc(mid(Frame, 4)),8);" (";hex(asc(mid(Frame, 4)));")"
if ((asc(mid(Frame,2,1)) AND &B00011000) SHR 3) = 0 then print " - MPEG 2.5 (oder spaeter)"
if ((asc(mid(Frame,2,1)) AND &B00011000) SHR 3) = 2 then print " - MPEG 2"
if ((asc(mid(Frame,2,1)) AND &B00011000) SHR 3) = 3 then print " - MPEG 1"
if ((asc(mid(Frame,2,1)) AND &B00000110) SHR 1) = 1 then print " - Layer III"
if ((asc(mid(Frame,2,1)) AND &B00000110) SHR 1) = 2 then print " - Layer II"
if ((asc(mid(Frame,2,1)) AND &B00000110) SHR 1) = 3 then print " - Layer I"
if (asc(mid(Frame,2,1)) AND &B00000001) then print " - CRC vorhanden" else print " - CRC nicht vorhanden"
if ((asc(mid(Frame,4,1)) AND &B11000000) SHR 6) = 0 then print " - Stereo"
if ((asc(mid(Frame,4,1)) AND &B11000000) SHR 6) = 1 then print " - Joint stereo"
if ((asc(mid(Frame,4,1)) AND &B11000000) SHR 6) = 2 then print " - Dual channel"
if ((asc(mid(Frame,4,1)) AND &B11000000) SHR 6) = 3 then print " - Mono"
if (asc(mid(Frame,4,1)) AND &B00001000) then print " - Copyright vorhanden" else print " - Copyright nicht vorhanden"
if (asc(mid(Frame,4,1)) AND &B00000100) then print " - Original" else print " - Kein Original"
print
sleep
end if
next
close
print " ============================== "
print " D A T E I E N D E"
print " ============================== "
sleep
|
_________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 05.05.2009, 12:21 Titel: |
|
|
Hi,
ich habe mal etwas gesucht und einen Codeschnipsel von mir zum "mp3 frame header" gefunden.
http://www.freebasic-portal.de/index.php?s=fbporticula&mode=show&id=851
@Andy19312, du solltest die Datei UByte für UByte und nicht als 32Bit-Uinteger einlesen, da
FF FB 30 CC so stehen die Byts in der mp3 Datei
&hCC30FBFF so wird es als UINTEGER aus der Datei gelesen
@St_W, dabei muss man aber nicht mit CHR, STRING usw. arbeiten.  _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|