AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Bass.dll Internet Radio - wie die letzten 5 Minuten bekommen, ohne Aufnahme stoppen ?

Bass.dll Internet Radio - wie die letzten 5 Minuten bekommen, ohne Aufnahme stoppen ?

Ein Thema von Julian M. · begonnen am 12. Jan 2016 · letzter Beitrag vom 15. Jan 2016
Antwort Antwort
Julian M.

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

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

  Alt 13. Jan 2016, 19:57
Kannst du mir nochmals helfen ? Ich wollte nun "einfach" die letzten 10 Minuten immer in einem MemoryStream festhalten und diesen bei Bedarf abspeichern. Leider ist die erstellte Datei 0 KB groß, d.h. er schreibt nichts in den Memorystream.


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<=14745600 then //angabe in bit, entsprechend 10 Minuten bei 192kbit/s Stream
    ms.Write(buffer^, len) //schreibe memorystream voll
    else // wenn memorystream 10min beinhaltet, dann lösche den anfang und füge den buffer ans ende.
    begin
      ms.Position:=len;//anfangsposition um die größe des buffers nach hinten setzen
      ms.CopyFrom(ms,(ms.Size-1)-len); //den "verschobenen" teil des streams neu abspeichern
      ms.Write(buffer^, len); //den buffer wieder ans ende schreiben
    end;
    ms.Position := ms.Size - 1;
  end;
end;



procedure TForm1.Button4Click(Sender: TObject);
begin
  ms.SaveToFile('memorystream.mp3');
end;
Danke und Gruß, Julian

Geändert von Julian M. (13. Jan 2016 um 22:13 Uhr)
  Mit Zitat antworten Zitat
Julian M.

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

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

  Alt 13. Jan 2016, 22:03
Könnte es sein, dass ein Ringbuffer genau das ist, was ich suche ?
himitsu hat hier http://www.delphipraxis.net/861255-post7.html eine Tmemoryringbuffer geschrieben, mein code sähe dann so aus ? Beim Abspeichern passiert leider wieder nichts.


Delphi-Quellcode:
procedure StatusProc(buffer: Pointer; len, user: DWORD); stdcall;
begin
  if (rb = nil) then rb:=TMemoryringbuffer.create(14745600); // create the stream
  if (buffer = nil) then rb.Free // finished downloading
  else
  begin // Ab hier geänderter Code
    rb.Write(buffer^, len) //füge den buffer ans ende
  end;
end;



procedure TForm1.Button4Click(Sender: TObject);
begin
  rb.SaveToFile('memorystream.mp3');
end;

Geändert von Julian M. (13. Jan 2016 um 22:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.590 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 14. Jan 2016, 12:46
SaveToFile funktioniert da zufällig nicht. (das schreibt nur den gesamten Ring-Speicher in die Datei, so wie er im RAM liegt ... ist wohl ein kleiner Bug)
Du könntest einen FileStream erstellen und dort über FileStream.CopyFrom oder CopyTo die entsprechenden Bytes (RingStream.DataSize) reinkopieren.

Aber bei einer MP3 kannst du das eh alles vergessen, da du so oder so nur einen Teil der MP3-Datei bekommst, die absolut nicht funktionsfähig ist.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Julian M.

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

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

  Alt 14. Jan 2016, 13:06
Danke für deine Antwort, Erfahrungen nach interessiert es die meisten Player nicht, ob die MP3 ein wenig abgehackt ist.
Ich ging allerdings davon aus, dass der von Bass.dll gelieferte Buffer immer ein Frame inkl. Header ist.

Aber: mein Hauptproblem ist, dass ich mit Streams immer noch nicht klar komme.

Also sagen wir Stream_A enthält:ABCDEFG
wie kopiere ich nun korrekt 'BCDEFG' in Stream B ?


Gruß Julian
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.590 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 14. Jan 2016, 13:21
Grade nochmal nachgesehn:

SaveToFile sollte funktionieren.
In den Ringpuffer wird alles reingeschrieben und wenn X Bytes ausgelesen wurde, dann liegt der Anfang dieses Puffers nun auf Position X+1 und ab dieser Stelle würd auch SaveToFile speichern.

Statt Read und Write solltest du immer ReadBuffer und WriteBuffer verwenden, außer du wertest das Result aus.

Wenn per Write/WriteBuffer A bis G rein geschrieben und über Read/ReadBuffer/Seek das A ausgelesen wurde, dann sind noch B bis G drin.

Dieser RingPuffer muß auch manuell geleert werden, denn wenn er voll ist, passt nix mehr rein, da nichts automatisch gelöscht wird.



Und bezüglich Vererbung sollte ich mich für diese Klasse steinigen lassen.
Ein Therapeut entspricht 1024 Gigapeut.
  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
 
#6

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

  Alt 14. Jan 2016, 14:50
Funktioniert es denn mittlerweile, überhaupt irgendwie Daten auf die Festplatte zu speichern mit dem SaveToFile()? Die ganze Sache sieht ausserdem gefährlich aus, weil StatusProc() glaube ich nicht im Hauptthread läuft, der SaveToFile()-Aufruf aber schon. Du müsstest den Zugriff dann synchronisieren (siehe TCriticalSection).

Zitat:
Also sagen wir Stream_A enthält:ABCDEFG
wie kopiere ich nun korrekt 'BCDEFG' in Stream B ?
Code:
procedure Kopieren(Stream_A, Stream_B: TMemoryStream);
begin
  Stream_A.Position := 1;
  Stream_B.CopyFrom(Stream_A, 6);
end;
Ist so aus dem Kopf niedergeschrieben, sollte aber passen..
http://streamwriter.org

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

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.590 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 14. Jan 2016, 15:08
Du müsstest den Zugriff dann synchronisieren (siehe TCriticalSection).
Die Klasse war damals schon für MultiThread vorgesehen und hat bereits eine CS integriert.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 04:07 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