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?