AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Internet/Radio-Stream wiedergeben

Internet/Radio-Stream wiedergeben

Ein Thema von Tommy1988 · begonnen am 23. Apr 2007 · letzter Beitrag vom 8. Nov 2009
Antwort Antwort
Tommy1988
(Gast)

n/a Beiträge
 
#1

Internet/Radio-Stream wiedergeben

  Alt 23. Apr 2007, 12:50
Hallo, wie kann ich, wenn ich eine URL habe, einen Stream den ich zuvor in ein Edit-Feld
eingegeben habe mit einer Delphi-Anwendung wiedergeben?

Wohl mit Bass und dem allen oder ?
Leider verstehe ich das nicht, kann mir wer ein Beispiel zeigen?

ist das hier vielleicht schon soetwas?

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;
  Mit Zitat antworten Zitat
Gehstock

Registriert seit: 28. Jan 2006
Ort: Görlitz / Sachsen
489 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Internet/Radio-Stream wiedergeben

  Alt 23. Apr 2007, 13:29
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Bass, ExtCtrls;

const
  WM_INFO_UPDATE = WM_USER + 101;

type
  
  TForm1 = class(TForm)
    Panel1: TPanel;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    Button10: TButton;
    GroupBox2: TGroupBox;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    GroupBox3: TGroupBox;
    Label6: TLabel;
    ed_ProxyServer: TEdit;
    cbDirectConnection: TCheckBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure cbDirectConnectionClick(Sender: TObject);
  private
    { Private declarations }

  public
    { Public declarations }
    procedure WndProc(var Msg: TMessage); override;


  end;

var
  Form1: TForm1;
  Proxy: array [0..99] of char; //proxy server

  cthread: DWORD = 0;
  chan: HSTREAM = 0;
  win: hwnd;
implementation

const
  urls: array[0..9] of string = (
    'http://64.236.126.41/stream/1048', 'http://205.188.215.226:8000',
    'http://64.236.98.50/stream/1006', 'http://206.98.167.99:8406',
    'http://64.236.98.50/stream/1013', 'http://212.23.5.99:8002',
    'http://205.188.215.226:8012', 'http://205.188.215.226:8008',
    'http://207.200.96.225:8010', 'http://64.202.98.91:8082'
    );

{$R *.dfm}

  { display error messages }

procedure Error(es: string);
begin
  MessageBox(win, PChar(es + #13#10 + '(error code: ' + IntToStr(BASS_ErrorGetCode) +
    ')'), nil, 0);
end;

{ update stream title from metadata }

procedure DoMeta(meta: PChar);
var
  p: Integer;
begin
  if (meta <> nil) then
  begin
    p := Pos('StreamTitle=', meta);
    if (p = 0) then
      Exit;
    p := p + 13;
    SendMessage(win, WM_INFO_UPDATE, 7, DWORD(PChar(Copy(meta, p, Pos(';', meta) - p - 1))));
  end;
end;

procedure MetaSync(handle: HSYNC; channel, data, user: DWORD); stdcall;
begin
  DoMeta(PChar(data));
end;

procedure StatusProc(buffer: Pointer; len, user: DWORD); stdcall;
begin
  if (buffer <> nil) and (len = 0) then
    SendMessage(win, WM_INFO_UPDATE, 8, DWORD(PChar(buffer)));
end;

function OpenURL(url: PChar): Integer;
var
  icy: PChar;
  Len, Progress: DWORD;
begin
  Result := 0;
  BASS_StreamFree(chan); // close old stream
  progress := 0;
  SendMessage(win, WM_INFO_UPDATE, 0, 0); // reset the Labels and trying connecting

  chan := BASS_StreamCreateURL(url, 0, BASS_STREAM_STATUS, @StatusProc, 0);
  if (chan = 0) then
  begin

    SendMessage(win, WM_INFO_UPDATE, 1, 0); // Oops Error
  end
  else
  begin
    // Progress
    repeat
      len := BASS_StreamGetFilePosition(chan, BASS_FILEPOS_END);
      if (len = DW_Error) then
        break; // something's gone wrong! (eg. BASS_Free called)
      progress := (BASS_StreamGetFilePosition(chan, BASS_FILEPOS_DOWNLOAD) -
        BASS_StreamGetFilePosition(chan, BASS_FILEPOS_CURRENT)) * 100 div len;
      // percentage of buffer filled
      SendMessage(win, WM_INFO_UPDATE, 2, progress); // show the Progess value in the label

    until
      progress > 75;

    // get the broadcast name and bitrate
    icy := BASS_ChannelGetTags(chan, BASS_TAG_ICY);
    if (icy = nil) then
      icy := BASS_ChannelGetTags(chan, BASS_TAG_HTTP); // no ICY tags, try HTTP
    if (icy <> nil) then
      while (icy^ <> #0) do
      begin
        if (Copy(icy, 1, 9) = 'icy-name:') then
          SendMessage(win, WM_INFO_UPDATE, 3, DWORD(PChar(Copy(icy, 10, MaxInt))))

        else if (Copy(icy, 1, 7) = 'icy-br:') then

          SendMessage(win, WM_INFO_UPDATE, 4, DWORD(PChar('bitrate: ' + Copy(icy, 8, MaxInt))));
        icy := icy + Length(icy) + 1;
      end;
    // get the stream title and set sync for subsequent titles
    DoMeta(BASS_ChannelGetTags(chan, BASS_TAG_META));
    BASS_ChannelSetSync(chan, BASS_SYNC_META, 0, @MetaSync, 0);
    // play it!
    BASS_ChannelPlay(chan, FALSE);
  end;
  cthread := 0;
end;

                      
procedure TForm1.WndProc(var Msg: TMessage);
// to be threadsave we are passing all Canvas Stuff(e.g. Labels) to this messages
begin
  inherited;
  if Msg.Msg = WM_INFO_UPDATE then
    case msg.WParam of
      0:
        begin
          Label4.Caption := 'connecting...';
          Label3.Caption := '';
          Label5.Caption := '';
        end;
      1:
        begin
          Label4.Caption := 'not playing';
          Error('Can''t play the stream');
        end;
      2: Label4.Caption := Format('buffering... %d%%', [msg.LParam]);
      3: Label4.Caption := PChar(msg.LParam);
      4: Label5.Caption := PChar(msg.LParam);
      5: Label5.Caption := PChar(msg.LParam);
      6: Label3.Caption := PChar(msg.LParam);
      7: Label3.Caption := PChar(msg.LParam);
      8: Label5.Caption := PChar(msg.LParam);
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // check the correct BASS was loaded
  win := handle;
  if (HIWORD(BASS_GetVersion) <> BASSVERSION) then
  begin
    MessageBox(0, 'An incorrect version of BASS.DLL was loaded', nil, MB_ICONERROR);
    Halt;
  end;
  if (not BASS_Init(-1, 44100, 0, Handle, nil)) then
  begin
    Error('Can''t initialize device');
    Halt;
  end;
  BASS_SetConfig(BASS_CONFIG_NET_PREBUF, 0);
  // minimize automatic pre-buffering, so we can do it (and display it) instead
  BASS_SetConfig(BASS_CONFIG_NET_PROXY,
   DWORD(StrPCopy(proxy,ed_ProxyServer.Text))); // setup proxy server location

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  BASS_Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ThreadId: Cardinal;
begin
  StrPCopy(proxy,ed_ProxyServer.Text); // copy the Servertext to the Proxy array
  if (cthread <> 0) then
    MessageBeep(0)
  else
    cthread := BeginThread(nil, 0, @OpenURL, PChar(urls[TButton(Sender).Tag]), 0, ThreadId);
end;

procedure TForm1.cbDirectConnectionClick(Sender: TObject);
begin
  if not TCheckbox(Sender).Checked then
    BASS_SetConfig(BASS_CONFIG_NET_PROXY, (DWORD(StrPCopy(proxy,ed_ProxyServer.Text)))) // enable proxy
  else
    BASS_SetConfig(BASS_CONFIG_NET_PROXY, 0); // disable proxy
end;

end.
source gibts zum download bei http://www.un4seen.com/
Marcel
  Mit Zitat antworten Zitat
Tommy1988
(Gast)

n/a Beiträge
 
#3

Re: Internet/Radio-Stream wiedergeben

  Alt 23. Apr 2007, 13:33
wo denn da ? ich blicke auf der webseite überhaupt nicht durch

Edit: ok habs gefunden.

aber wie mach ich das denn jetzt so, dass ich ein URL in ein Edit eintragen kann, dass dieser sttream dann gespielt wird.. habs schon hin und her probiert, nur da verlässt mich die fantasie
  Mit Zitat antworten Zitat
Gehstock

Registriert seit: 28. Jan 2006
Ort: Görlitz / Sachsen
489 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Internet/Radio-Stream wiedergeben

  Alt 23. Apr 2007, 14:06
Delphi-Quellcode:
procedure TForm1.Button12Click(Sender: TObject);
var
  ThreadId: Cardinal;
begin
  StrPCopy(proxy,ed_ProxyServer.Text);
  if (cthread <> 0) then
    MessageBeep(0)
  else
    cthread := BeginThread(nil, 0, @OpenURL, PChar(Edit1.text), 0, ThreadId);//oder sonst ein editfeld
end;
Marcel
  Mit Zitat antworten Zitat
MasterTobi

Registriert seit: 29. Apr 2007
212 Beiträge
 
#5

Re: Internet/Radio-Stream wiedergeben

  Alt 8. Nov 2009, 15:26
is zwar uralt das thema aber mich würde intressieren wie ich einen stream mit portangabe laufen lassen kann ?

bsp.:

IP:8000\listen.pls

vll bekomm ich ja noch eine antwort

edit:

habe mich etwas umgeschaut, in der listen.pls steht ja die ip + port

also funktioniert das ja auch
dann hab ich doch nochma geschaut un in der bass.dll steht als fehlercode 41 das dass dateiformat falsch sei

im beispiel steht ja :
http://somafm.com/secretagent24.pls

in dieser datei dies :

[playlist]
numberofentries=1
File1=http://voxsc1.somafm.com:8082
Title1=SomaFM: Secret Agent (#1 24k mp3): The soundtrack for your stylish, mysterious, dangerous life. For Spies and PIs too!
Length1=-1
Version=2

öffne ich nun die zustreamende datei steht folgendes :
[playlist]
numberofentries=1
File1=http://95.208.31.166:8000

nur immer wieder sagt er mir fehlercode 41

kann doch nicht sein oder ?
MFG
Tobi
  Mit Zitat antworten Zitat
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 20:18 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