AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Wirkliche Position eines mp3headers...nicht mal jedi kanns!

Wirkliche Position eines mp3headers...nicht mal jedi kanns!

Ein Thema von dadu · begonnen am 30. Aug 2005 · letzter Beitrag vom 30. Aug 2005
Antwort Antwort
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Re: Wirkliche Position eines mp3headers...nicht mal jedi kan

  Alt 30. Aug 2005, 20:34
Also ich habe das in einem Framescanner mal so gemacht (C-Code)
Code:
//======================================================================
//
// Aufbau des MPEG Audio Synchronisationswort
//
// ========0======== ========1======== ========2======== ========3======== Byte
//  7 6 5 4 3 2 1 0   7 6 5 4 3 2 1 0   7 6 5 4 3 2 1 0   7 6 5 4 3 2 1 0  Bit
//
//  1 1 1 1 1 1 1 1   1 1 1 1  ~0-0    ~1-1-1-1 1-1~                       Valid
//                            X x x    x x x x X X      1-1              Compatible
//
// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
// |1 1 1 1 1 1 1 1| |1 1 1 1| |   | | |       |   | | | |   |   | | |   |
// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
//                            |  |  |      |     |  | |    |   |  | |  |
//                            |  |  |      |     |  | |    |   |  | |  +-- emphasis
//                            |  |  |      |     |  | |    |   |  | +----- original
//                            |  |  |      |     |  | |    |   |  +------- copyright
//                            |  |  |      |     |  | |    |   +---------- mode extension
//                            |  |  |      |     |  | |    +-------------- mode
//                            |  |  |      |     |  | +------------------- extension
//                            |  |  |      |     |  +--------------------- padding
//                            |  |  |      |     +------------------------ frequency (0,1,2)
//                            |  |  |      +------------------------------ bitrate (1-14)
//                            |  |  +------------------------------------- no crc check
//                            |  +---------------------------------------- layer (1,2,3)
//                            +------------------------------------------- version (0,1)
//
//======================================================================

union l3f_syncword {
  unsigned char sw_b[4];
  unsigned long sw_l;
};

#define L3F_SYNC_VALID(sw) \
  (    (sw).sw_b[0]        == 0xff \
   && ((sw).sw_b[1] & 0xf0) == 0xf0 \
   && ((sw).sw_b[1] & 0x06) != 0x00 \
   && ((sw).sw_b[2] & 0xf0) != 0xf0 \
   && ((sw).sw_b[2] & 0x0c) != 0x0c)

#define L3F_SYNC_COMPATIBLE(s1, s2) \
  (    ((s1).sw_b[1] & 0x0e) == ((s2).sw_b[1] & 0x0e) \
   && ((s1).sw_b[2] & 0xfc) == ((s2).sw_b[2] & 0xfc) \
   && (((s1).sw_b[3] & 0xc0) == 0xc0) == (((s2).sw_b[3] & 0xc0) == 0xc0))
Ich teste also auf (1111 1111 1111 .aa. bbbb cc..).
aa muss ungleich "00" sein
bbbb muss ungleich "1111" sein
cc muss ungleich "11" sein
(binär)

Damit habe ich noch nie einen falschen Frame erwischt.

[Nachtrag]

Also in Pascal (falls Syncword ein Cardinal ist)

Delphi-Quellcode:
ok := ((syncword and $0000f0ff) = $0000f0ff) and
      ((syncword and $00000600) <> $00000000) and
      ((syncword and $00f00000) <> $00f00000) and
      ((syncword and $000c0000) <> $000c0000);
Ein bisschen aufwendiger ist der Test doch noch gewesen (hab gerade noch mal durch die Sourcen geschaut):

Nachdem ich ein gültiges Syncword gefunden habe prüfe ich dann außerdem noch ob an den erwarteten Stellen (anhand der Framegröße berechnet) noch mindestens 7 weitere gültige Syncwords folgen und mit dem Makro L3F_SYNC_COMPATIBLE zusätzlich noch, ob diese zum ersten gefundenen kompatibel sind.

Ich hab' die C++-Datei mal angehängt falls du was damit anfangen kannst (die drei Header-Dateien braucht man nicht).
Angehängte Dateien
Dateityp: cpp layer3_912.cpp (17,5 KB, 13x aufgerufen)
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz