![]() |
AW: Bass.dll Internet Radio - wie die letzten 5 Minuten bekommen, ohne Aufnahme stopp
Zitat:
|
AW: Bass.dll Internet Radio - wie die letzten 5 Minuten bekommen, ohne Aufnahme stopp
Also ich weiß nicht, ob der Ringbuffer das richtige ist. Konnte jetzt mit diesem Code testweise 1 Minute in einen 'normalen' memorystream ms aufnehmen, dann 20 sec mp3 ab der Mitte von ms in einen zweiten Memorystream ms2 kopieren und diesen auf die Platte schreiben. Ich werde weiter rumprobieren..
Delphi-Quellcode:
procedure StatusProc(buffer: Pointer; len, user: DWORD); stdcall; begin if (ms = nil) then ms:= TMemoryStream.Create; // create the stream if (buffer = nil) then ms.Free // finished downloading else begin // Ab hier geänderter Code if ms.Size<=1474560 then //angabe in byte, entsprechend 1 Minuten bei 192kbit/s Stream ms.Write(buffer^, len) //schreibe memorystream voll else // wenn memorystream 1min beinhaltet, dann kopiere einen teil davon in ms2 begin ms.Position:=round(ms.Size/2);//ab der hälfte von ms kopieren ms2:= TMemoryStream.Create; ms2.CopyFrom(ms,500000); //500000 Byte=20 sec ms2.Position:=0; ms2.savetofile('memorystream.mp3'); application.terminate; //nur damit es erst mal keine Fehlermeldungen gibt, wenn das Programm weiter läuft end; end; end; Gruß Julian :thumb: |
AW: Bass.dll Internet Radio - wie die letzten 5 Minuten bekommen, ohne Aufnahme stopp
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 :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz