Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

mp3 Frame Header

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Andy19312



Anmeldungsdatum: 22.10.2005
Beiträge: 428

BeitragVerfasst am: 03.05.2009, 21:24    Titel: mp3 Frame Header Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
max06



Anmeldungsdatum: 05.12.2004
Beiträge: 390
Wohnort: Augsburg

BeitragVerfasst am: 03.05.2009, 22:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Andy19312



Anmeldungsdatum: 22.10.2005
Beiträge: 428

BeitragVerfasst am: 03.05.2009, 23:40    Titel: Antworten mit Zitat

will nicht klappen ;(
wenn mir jemand helfen könnte, wäre ich echt dankbar
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 04.05.2009, 15:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 05.05.2009, 12:21    Titel: Antworten mit Zitat

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. zwinkern
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz