Hallo Board,
ich habe irgendwie das Gefühl, dass sich sehr wenig Leute mit dem Thema auskennen, weil einem bei Google wenig geholfen wird, aber ich Frage einfach mal.
Ich verbinde mich mit einem Socket zum SHOUTcast server, und schicke den Request, um den Stream zu empfangen. Kein Problem, Stream kommt an und es läuft einfach nur. Man möchte diesen Stream jetzt natürlich auch noch speichern, so dass man ihn sich später anhören kann, also als saubere MP3 speichern.
Ich gehe also die empfangenen Bytes durch, und prüfe, ob an der Stelle, an der meine Schleife gerade ist, ein MPEG-Frame beginnt.
Delphi-Quellcode:
function IsFrameHeader(const HeaderData: array of Byte): Boolean;
begin
{ Check for valid frame header }
if ((HeaderData[0] and $FF) <> $FF) or
((HeaderData[1] and $E0) <> $E0) or
(((HeaderData[1] shr 3) and 3) = 1) or
(((HeaderData[1] shr 1) and 3) = 0) or
((HeaderData[2] and $F0) = $F0) or
((HeaderData[2] and $F0) = 0) or
(((HeaderData[2] shr 2) and 3) = 3) or
((HeaderData[3] and 3) = 2) then
Result := false
else
Result := true;
end;
Wenn das der Fall ist, schreibe ich ab dieser Stelle den Frame in die Datei. Die Länge des Frames bekomme ich mit der folgenden Prozedur.
Delphi-Quellcode:
procedure DecodeHeader(const HeaderData: array of Byte; var Frame: FrameData);
begin
Move(HeaderData, Frame.Data, SizeOf(Frame.Data));
Frame.VersionID := (HeaderData[1] shr 3) and 3;
Frame.LayerID := (HeaderData[1] shr 1) and 3;
Frame.ProtectionBit := (HeaderData[1] and 1) <> 1;
Frame.BitRateID := HeaderData[2] shr 4;
Frame.SampleRateID := (HeaderData[2] shr 2) and 3;
Frame.PaddingBit := ((HeaderData[2] shr 1) and 1) = 1;
Frame.PrivateBit := (HeaderData[2] and 1) = 1;
Frame.ModeID := (HeaderData[3] shr 6) and 3;
Frame.ModeExtensionID := (HeaderData[3] shr 4) and 3;
Frame.CopyrightBit := ((HeaderData[3] shr 3) and 1) = 1;
Frame.OriginalBit := ((HeaderData[3] shr 2) and 1) = 1;
Frame.EmphasisID := HeaderData[3] and 3;
end;
Nach dem Schreiben in die Datei lösche ich die geschriebenen Bytes aus dem Speicher (und natürlich die Bytes, die vor dem ersten Frame waren) und lasse die Schleife wieder von vorne durchlaufen, so wird dann eine saubere MP3-Datei geschrieben. Irgendwo habe ich ein Programm namens "MP3Utility" gefunden, das sagt, dass die Frames alle in Ordnung sind.
Und so geht es dann immer weiter.
Das Dumme ist jetzt, dass es ab und zu zu solchen "Blubb" Geräuschen kommt.. Und die sind nicht gerade erwünscht.
Also, falls wer Ahnung davon hat oder jemand einfach weitere Infos braucht, weil er das selbe vorhat oder meint, er könne mir bei der Lösung des Problems helfen, einfach Fragen
Danke fürs Lesen!