Einzelnen Beitrag anzeigen

Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#1

MP3-Stream speichern?

  Alt 16. Mär 2006, 17:21
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!
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat