AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MP3-Stream speichern?

Ein Thema von wicht · begonnen am 16. Mär 2006 · letzter Beitrag vom 16. Mär 2006
Antwort Antwort
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, 16: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
Benutzerbild von wicht
wicht

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

Re: MP3-Stream speichern?

  Alt 16. Mär 2006, 19:59
Kleiner Fehler:

Die Länge eines Frames erhalte ich mit folgender Funktion.

Delphi-Quellcode:
function GetFrameLength(const Frame: FrameData): Word;
var
  Coefficient, BitRate, SampleRate, Padding: Word;
begin
  { Calculate MPEG frame length }
  Coefficient := GetCoefficient(Frame);
  BitRate := GetBitRate(Frame);
  SampleRate := GetSampleRate(Frame);
  Padding := GetPadding(Frame);
  Result := Trunc(Coefficient * BitRate * 1000 / SampleRate) + Padding;
end;
http://streamwriter.org

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


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz