0 Pluspunkte 0 Minuspunkte

Ich versuche die Länge einer MP3 Datei in C zu ermitteln.

#include <stdio.h>
#include <stdint.h>

#define FRAME_HEADER_SIZE 4

//Bitraten in kbps 
const int bitrates[16] = {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0};

//Sampleraten in Hz
const int samplerates[4] = {44100, 48000, 32000, 0};

int calculate_mp3_duration(const char *filename) {

    FILE *file = fopen(filename, "rb");
    if (!file) {
        perror("Datei konnte nicht geöffnet werden");
        return -1;
    }

    uint8_t header[FRAME_HEADER_SIZE];

    if (fread(header, 1, FRAME_HEADER_SIZE, file) != FRAME_HEADER_SIZE) {
        perror("Header konnte nicht gelesen werden");
        fclose(file);
        return -1;
    }

    //Synchronisation (11 Bits)
    if ((header[0] != 0xFF) || ((header[1] & 0xE0) != 0xE0)) {
        printf("Kein gültiger MP3-Header gefunden.\n");
        fclose(file);
        return -1;
    }

    // Extrahiere Bitrate und Samplerate
    int bitrate_index = (header[2] >> 4) & 0x0F;
    int samplerate_index = (header[2] >> 2) & 0x03;

    if (bitrate_index == 0 || bitrate_index == 15 || samplerate_index == 3) {
        printf("Ungültige Bitrate oder Samplerate.\n");
        fclose(file);
        return -1;
    }

    int bitrate = bitrates[bitrate_index] * 1000; // Bitrate in bps
    int samplerate = samplerates[samplerate_index]; // Samplerate in Hz

    // Dateigröße ermitteln
    fseek(file, 0, SEEK_END);
    long filesize = ftell(file);
    fclose(file);

    if (filesize <= 0 || bitrate == 0) {
        printf("Ungültige Dateigröße oder Bitrate.\n");
        return -1;
    }

    // Dauer berechnen (in Sekunden)
    int duration = (filesize * 8) / bitrate; // Sekunden
    return duration;
}

int main(int argc, char *argv[]) {

    if (argc != 2) {
        printf("Verwendung: %s <mp3-datei>\n", argv[0]);
        return 1;
    }

    int duration = calculate_mp3_duration(argv[1]);

    if (duration >= 0) {
        printf("Die Dauer der MP3-Datei beträgt %d Sekunden.\n", duration);
    }

    return 0;

}

Die MP3 funktioniert ganz sicher, ich habe sie in VLC abspielen können. Trotzdem bekomme ich den Fehler.

Kein gültiger MP3-Header gefunden.

Wie kann ich die Länge auslesen?

von  

1 Antwort

0 Pluspunkte 0 Minuspunkte

Du kannst die ID3-Tags überspringen bevor der erste Frame gelesen wird.

#define ID3_HEADER_SIZE 10

// Funktion zum Überspringen von ID3-Tags
int skip_id3_tags(FILE *file) {
    uint8_t id3_header[ID3_HEADER_SIZE];
    // Lese die ersten 10 Bytes
    if (fread(id3_header, 1, ID3_HEADER_SIZE, file) != ID3_HEADER_SIZE) {
        return 0; // Kein gültiger ID3-Header
    }
    // Prüfe auf "ID3" am Anfang
    if (memcmp(id3_header, "ID3", 3) == 0) {
        // ID3-Tags gefunden, Größe berechnen
        int tag_size = ((id3_header[6] & 0x7F) << 21) |
                       ((id3_header[7] & 0x7F) << 14) |
                       ((id3_header[8] & 0x7F) << 7) |
                       (id3_header[9] & 0x7F);
        // Überspringe die ID3-Tags
        fseek(file, tag_size, SEEK_CUR);
        return 1;
    }
    // Kein ID3-Tag, Datei-Zeiger zurücksetzen
    fseek(file, 0, SEEK_SET);
    return 0;
}

In der Funktion calculate_mp3_duration überspringst du die ID3-Tags bevor du den Header ausliest.

skip_id3_tags(file);
von (884 Punkte)