Problem mit Aufnahme eines mp3 Streams
-
Hallo,
ich versuche ein Programm zu schreiben, welches mp3 Streams von Shoutcast-Sendern auf die Festplatte aufnehmen kann. Hierfür habe ich folgende Funktion entworfen:
void GetData (int socket, int length // Länge eines Datenblocks) { std::ofstream out ("test.mp3", std::ofstream::binary); int recieved_bytes = 0; int meta_size; for (char c; recv (socket, &c, 1, 0) > 0; out << c) { ++ recieved_bytes; if (recieved_bytes == length + 1) { // fängt ein Metadatenblock an? meta_size = c * 16; recieved_bytes = 0; if (meta_size > 0) { // Wenn ja, hier einlesen std::stringstream meta_data; for (char d; recv (socket, &d, 1, 0) > 0; meta_data << d) { --meta_size; if (meta_size == 0) break; } std::cout << meta_data.str () << std::endl; } } } }Diese Funktion ließt die Metadaten des Shoutcast Streams fehlerfrei aus. Jedoch ist die Aufnahme (die als mp3 Datei vorliegt) mit lästigen Störgeräuschen durchzogen. Hier ein Beispiel. Ich habe keine Ahnung, woher dieses "Schmatzen" kommt und hoffe, jemand kann mir darüber Auskunft geben.
Danke
-
kann es sein dass du aus versehen noch das letzte c as eigentlich die metadatenlaenge angebe sollte mit abspeicherst?
basti33 schrieb:
void GetData (int socket, int length // Länge eines Datenblocks) { std::ofstream out ("test.mp3", std::ofstream::binary); int recieved_bytes = 0; int meta_size; for (char c; recv (socket, &c, 1, 0) > 0; out << c) { ++ recieved_bytes; if (recieved_bytes == length + 1) { // fängt ein Metadatenblock an? meta_size = c * 16; .. } } }(hab nur kurz geschaut und kenne das format nicht
)
-
Hallo,
danke für deine Antwort. Tatsächlich habe ich dieses char noch eingelesen. Ich habe die Funktion jetzt folgendermaßen geändert:
void GetData (int socket, int length) { std::ofstream out ("test.mp3", std::ofstream::binary); int recieved_bytes = 0; char meta_size; while (true) { for (char c; recv (socket, &c, 1, 0) > 0; out << c) { ++ recieved_bytes; if (recieved_bytes == length) { recieved_bytes = 0; break; } } char r; recv (socket, &r, 1, 0); meta_size = r * 16; if (meta_size > 0) { std::stringstream meta_data; for (char d; recv (socket, &d, 1, 0) > 0; meta_data << d) { --meta_size; if (meta_size == 0) break; } std::cout << meta_data.str () << std::endl; } } }Leider ändert dies nichts an dem Fehlverhalten. Das Störgeräusch bleibt nach wie vor! Wahrscheinlich handelt es sich bei diesem Fehler um eine Kleinigkeit, aber leider finde ich ihn nicht.
Danke für weitere Hilfe
-
basti33 schrieb:
char meta_size; ... char r; recv (socket, &r, 1, 0); meta_size = r * 16; ...das koennte ein weiterer fehler sein, 255*16 > char.
-
rapso schrieb:
das koennte ein weiterer fehler sein, 255*16 > char.
Was bedeutet das? Soll ich Integer nehmen oder casten? Die ändern leider nichts an dem Verhalten, d.h. wenn ich meta_size und r als Integer deklariere nimmt er gar nichts mehr auf, deklariere ich nur einen als Integer bleibt das Verhalten wie gehabt.
Danke für die Antworten
-
basti33 schrieb:
rapso schrieb:
das koennte ein weiterer fehler sein, 255*16 > char.
Was bedeutet das?
dass 255*16, also 4080 nicht in meta_size reinpasst.
Soll ich Integer nehmen oder casten? Die ändern leider nichts an dem Verhalten, d.h. wenn ich meta_size und r als Integer deklariere nimmt er gar nichts mehr auf, deklariere ich nur einen als Integer bleibt das Verhalten wie gehabt.
meta_size sollte int sein. ansonsten kann es sein dass du schon beim ersten mal nicht genug metainformationen liest.
zur sicherheitchar r; int meta_size; meta_size = 16* (int)r;zudem hab ich ein wenig das gefuehl, dass der stream erst mit metaifnromationen anfaeng und dann die mp3 daten folgen, mit nem vertauschen der schleifen koennte es dann vielleicht gehen.
-
rapso schrieb:
meta_size sollte int sein. ansonsten kann es sein dass du schon beim ersten mal nicht genug metainformationen liest.
Danke, aber es funktioniert leider auch so nicht.
rapso schrieb:
zudem hab ich ein wenig das gefuehl, dass der stream erst mit metaifnromationen anfaeng und dann die mp3 daten folgen, mit nem vertauschen der schleifen koennte es dann vielleicht gehen.
Sollte er laut den Beschreibungen, die ich bislang gelesen habe, aber nicht. Siehe z.B. http://www.smackfu.com/stuff/programming/shoutcast.html.
Danke