Einzelnen Beitrag anzeigen

Julian M.

Registriert seit: 28. Dez 2010
41 Beiträge
 
#13

AW: Bass.dll Internet Radio - wie die letzten 5 Minuten bekommen, ohne Aufnahme stopp

  Alt 15. Jan 2016, 13:40
So, OSI Layer 8 Problem scheinbar behoben. So wie es aussieht benötigt es zwei Streams weil man nicht einen Stream versetzt in sich selbst kopieren kann.
Da ich auf keinen Fall vergessen möchte, meine derzeitige (sicher nicht optimale, aber scheinbar funktionierende) Lösung zu veröffentlichen, hier der Code:

Delphi-Quellcode:

procedure TForm1.FormCreate(Sender: TObject);
begin
  nextbufferisb:=true;
end;



procedure StatusProc(buffer: Pointer; len, user: DWORD); stdcall;
begin
  if (msa = nil) then begin msa:= TMemoryStream.Create; msb:= TMemoryStream.Create; end;// create the stream
  if (buffer = nil) then begin msa.Free; msb.Free; // finished downloading
  else
  begin // Ab hier geänderter Code
     if msa.Size< 14745600 then //wenn die Aufnahme noch <10 Minuten ist (bei 192kbit/s)
       msa.Write(buffer^, len) //Stream A vollschreiben bis er 10 Min beinhaltet
     else
     if nextbufferisb then // wenn Stream A voll ist, kopiere in Stream B
     begin
       msa.position:=len; //Schneidet den Anfang von A ab, denn der ist älter als 10 Minuten
       msb.position:=0; //Setzt die Einfügeposition von Stream B an den Anfang
       msb.copyfrom(msa,msa.size-len); //kopiert Stream A ohne den Anfang in Stream b
       msb.Write(buffer^, len); //Fügt den neuesten Teil des Internetstreams ans ende von Stream B
       nextbufferisb:=false //das nächste mal wird anders rum kopiert, von Stream B nach Stream A
     end
     else
     begin //Das gleiche nur umgekehrt
       msb.position:=len;
       msa.position:=0;
       msa.copyfrom(msb,msb.size-len);
       msa.Write(buffer^, len);
       nextbufferisb:=true;
     end;
  end;
end;


procedure TForm1.Button4Click(Sender: TObject);
begin
  msa.SaveToFile('msa.mp3'); //hier könnte man noch abfragen ob Stream A oder B der neueste ist, ist aber fast egal
end;

Das ganze frisst nun relativ viel Arbeitsspeicher, weil dauerhaft die letzten 10 Minuten Internetradio 2x im Ram gehalten werden. (Ich glaube ca. 50MB) aber wenn beide Streams erst mal voll sind, steigt die Größe nicht mehr weiter an, und das ist für mich das wichtige, damit ich dauerhaft aufnehmen kann. Nur wenn der Button geklickt wird, werden die letzen 10 Minuten dann auf die Platte geschrieben, sonst nichts.

Vielen Dank für eure Hilfe ! Für weitere Verbesserungsvorschläge bin ich natürlich nicht abgeneigt, aber an sich bin ich erst mal zufrieden dass es funktioniert

Geändert von Julian M. (15. Jan 2016 um 14:02 Uhr)
  Mit Zitat antworten Zitat