Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi BASS: Song als Stream abspielen (https://www.delphipraxis.net/43121-bass-song-als-stream-abspielen.html)

Nogge 29. Mär 2005 14:43


BASS: Song als Stream abspielen
 
Hallo Community,
ich arbeite gerade mit der BASS-Engine und möchte gern eine Datei bzw. URL als (File-)Stream abspielen. So möchte ich nämlich eine Aufnahme mit BASS_RecordStart() umgehen und andere Geräusche wie z.B. ICQ- oder Game-Sounds aus dem Stream extrahieren.
Plz help me^^

Nogge 11. Apr 2005 17:00

Re: BASS: Song als Stream abspielen
 
mmh, liegt es vllt daran, dass ich so wenige Antworten zu diesem Thema erhalte, weil es illegal ist? Fällt mir gerade so auf, da es dann ja keine analoge Kopie, sondern eine digitale Kopie wäre...

Gandalfus 11. Apr 2005 19:10

Re: BASS: Song als Stream abspielen
 
Zitat:

Zitat von Nogge
mmh, liegt es vllt daran, dass ich so wenige Antworten zu diesem Thema erhalte, weil es illegal ist? Fällt mir gerade so auf, da es dann ja keine analoge Kopie, sondern eine digitale Kopie wäre...

illegal ist das bestimmt nicht.
Das es so weinig Antworten gibt liegt eher daran das sich damit nicht viele auskennen.

Ich hab das schon mal programmiert den code dafür aber leider verloren. Kuck dir mal das aktuelle netradio Beispiel an. In der Callback Funktion gibts einen Buffer den kannst du dann einfach in einen Filestream speichern. Ansosnten in dem Forum auf der bass.dll Homepage suchen.

Wishmaster 11. Apr 2005 21:14

Re: BASS: Song als Stream abspielen
 
Delphi-Quellcode:
var  

    URL_SaveFile   : String;
    URL_FileStream :  TFileStream;


procedure DownloadProc(buffer: Pointer; length: DWORD; user: DWORD); stdcall;
begin
  with AudioPlayer do
   begin
  if (URL_SaveFile = '') then
    exit;

  if (URL_FileStream = nil) then
      URL_FileStream:= TFileStream.Create(URL_SaveFile, fmCreate); // create the file
  if (buffer = nil) then
      URL_FileStream.Free // finished downloading
   else
      URL_FileStream.Write(buffer^, length);
 end;
end;


function TAudioEngine.PlayURL(URL : String) : boolean;
var SngLen : Integer; Flags : DWORD;
begin
    Cur_FileName:= URL;
    BASS_MusicFree(Channel);
    BASS_StreamFree(Channel);
    URL_FileStream:= nil;

     Flags:= 0;
   if StrBlock then
      Flags:= BASS_STREAM_BLOCK;

    { (BASS_STREAM_BLOCK) Download and play the file in smaller chunks.
      Uses a lot less memory than otherwise,
      but it's not possible to seek or loop the stream - once it's ended,
      the file must be opened again to play it again.
      This flag will automatically be applied when the file length is unknown,
      for example with Shout/Icecast streams.
      This flag also has the effect of resticting the download rate.}

    Flags:= Flags or BASS_STREAM_META or BASS_STREAM_STATUS;

    Channel := THandle(BASS_StreamCreateURL(PChar(Cur_FileName), 0, Flags, @DOWNLOADPROC, 0));

    SngLen := 0;

   if (Channel = 0) then
       Result := False
    else
       Result := True;

   if not BASS_ChannelPlay(Channel, false) then
       Result := False;

   if (SngLen = 0) then
       SongLength := BASS_StreamGetLength(Channel);

    PlayerState := ENGINE_PLAY;
end;

Nogge 11. Apr 2005 21:24

Re: BASS: Song als Stream abspielen
 
jo, danke euch beiden. Habe die Lösung auch gerade im Forum der BASS-Engine gefunden:
Delphi-Quellcode:
procedure DOWNLOADPROC(buffer: Pointer; length, user: DWORD); stdcall;
begin
  if (DigitalStream = nil)
    then DigitalStream:=TFileStream.Create('DigitalStream.wav',fmCreate);
  if (buffer <> nil)
  then DigitalStream.Write(buffer^,length)
  else FreeandNil(DigitalStream);

  if (buffer <> nil) and (length = 0)
    then Form_InetStream.Label_Type.Caption:=PChar(buffer); // display connection status
end;
Kann mir jetzt noch jemand verraten, welcher Dateityp der gespeicherte Stream ist? Für ne Wav-Datei ist die Größe viel zu klein...

Andy 1. Mai 2005 11:01

Re: BASS: Song als Stream abspielen
 
Hallo,

ich habe hier im Forum schon eine Menge über die BASS.dll gelesen und befasse mich momentan gerade mit der Einbindung in mein Programm. Leider hab ich noch gar keine Erfahrung mit der BASS.dll und hänge deshalb meine Frage an diesen Thread an, weil hier ein paar Ansatzpunkte genannt wurden, die mir weiterhelfen könnten, aber mir noch nicht ganz klar sind.
Meine Frage: Ich öffne einen Radio Stream aus dem Internet und gebe ihn im Windows Mediaplayer wieder. Nun möchte ich in mein Prg einen Spectrum Analyser einbauen, wie er im Bass Demo 'sample_vis' gezeigt wird. Dazu brauche ich aber einen Stream und wie es in der Bass Doku heißt muss(?) dieser mit 'BASS_StreamCreate' erzeugt werden. Und damit komme ich nicht klar. Einen File Stream wiedergeben ist kein Problem, aber wie geht das mit dem Internet Stream?
Oder gibt es in BASS.dll eine andere Möglichkeit einen Internet Radio Stream zu öffenen und wiederzugeben (vielleicht ohne MediaPlayer)? Ich meine aber nicht Netradio.

Vielen Dank & schöne Grüße

Andy

Nogge 1. Mai 2005 11:25

Re: BASS: Song als Stream abspielen
 
Abgesehen davon, dass du für die Fragen nen neuen Thread hättest öffnen sollen, gibt es die Lösungen für deine Fragen in dem Bass-Ordner. Dort sind alle wichtigen Functions in mehreren Beispielen aufgeführt.

Andy 1. Mai 2005 11:54

Re: BASS: Song als Stream abspielen
 
Hallo Nogge,

danke für die schnelle Antwort.
Wo steht das mit dem neuen Thread bzw. wo ist genau definiert wann ein neuer gestartet werden muß? Ich bin der Ansicht, dass meine Fragen sehr wohl zu Deiner ursprünglichen Frage und den dazugehörigen Antworten passen. Ich garantiere Dir, hätte ich einen neuen Thread gestartet wäre irgendein anderer gekommen und hätte mich ermahnt, weil es doch bereits so viele Themen zur Bass.dll gibt an die man leicht anknüpfen hätte können. Wie man's macht ist es falsch, aber es schadet doch niemandem wenn man an Deine Fragen anzuknüpfen, oder?

Deine Antwort zu meiner eigentlichen Frage hilft einem Anfänger wie es bin gar nicht weiter. Ich will keine fertigen Lösungen, sondern einen konkreten Tip wie ich sowas anpacken kann. Ich sehe dieses Forum als Kommunikationsplattform für Profis und Anfänger, ein lapidarer Hinweis in den Handbüchern nachzulesen ist für mich aber keine brauchbare Basis. Trotzdem nochmal Danke für Deine Zeilen.

-------------------------------

Ich wende mich noch mal an die anderen Foren Leser mit der Bitte um Mithilfe zu meiner Frage bezüglich Bass.dll und 'BASS_StreamCreate'.

Schöne Grüße
Andy

Nogge 1. Mai 2005 13:21

Re: BASS: Song als Stream abspielen
 
Die Beispiele werden doch sehr gut erklärt. In fast jeder Zeile sind Kommentare über den Prozess, der gerade abläuft. Aber mir ist gerade aufgefallen, was du mit deiner Frage wirklich meintest. Ich bin auch noch dabei, den Buffer-Inhalt in einen MemoryStream oder Ähnlichen zu speichern anstelle eines FileStreams. Habe mal im Bass-Forum n Thread gepostet. Sage dir bescheid, wenn ich ne Antwort gefunden habe.

Zum Thread:
Delphi-Quellcode:
type
  TParameter = packed record
    Text: String[63]; // muss ein definierter String sein
  end;
  PParameter = ^TParameter;

function Thread(Ptr:Pointer): Integer;
var URL:String;
begin
  URL:=String(PParameter(Ptr)^.Text);
  // hier Code für den Thread einfügen
end;

procedure StartThread;
var ThreadId:Cardinal; Parameter:PParameter;
begin
  GetMem(Parameter,SizeOf(TParameter));    
  Parameter.Text:=Edit1.Text;             // Edit1.Text = (hier:) eine URL
  BeginThread(nil,0,@Thread,Parameter,0,ThreadId);
end;
Das ist jetzt nur ein Beispiel für nen String. Geht natürlich auch mit mehreren Parametern unterschiedlicher Typen. Dafür musste einfach den Record erweitern und im "Thread" z.B. Integer(PParameter(Ptr)^.Value) schreiben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12: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