Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Stream mit bass.dll (https://www.delphipraxis.net/184653-stream-mit-bass-dll.html)

Philipp1977 12. Apr 2015 10:40

Stream mit bass.dll
 
Hallo,

ich möchte mit der bass.dll gerne einen Stream emfangen, den Stream mit anderer Bitrate neue encodieren und an einen anderen Shoutcast-Server streamen. Der Computer hat keine Soundkarte deshalb verwende ich den decoding channel. Hier ist der Code:

Setup and create mixer:

Code:
BASS_FX_GetVersion();
BASS_Init(0, 44100, BASS_DEVICE_FREQ, 0, nil);
BASS_SetConfig(BASS_CONFIG_NET_PLAYLIST, 1);
BASS_SetConfig(BASS_CONFIG_FLOATDSP, 1);
mix:= BASS_Mixer_StreamCreate(44100, 2, BASS_STREAM_DECODE );

Create Player:

Code:
chan := BASS_StreamCreateURL('http://.....:8000/', 0 ,BASS_STREAM_DECODE,nil, nil);
s1 := BASS_Mixer_StreamAddChannel(mix, chan, BASS_STREAM_DECODE);
p := @chan;
Thread := BeginThread(nil,0 , @DataThread, p, 0, ThreadID); // Thread to receive data from channel

Thread to receive data from channel:
Code:
repeat
try
nread := BASS_ChannelGetData(chan, @buf, sizeof(buf));
except
 err := Bass_errorgetcode();
end;
until (nread <= 0);

Mixer to Encoder:

Code:
Encoder := BASS_Encode_Start(mix, 'lame.exe -r -s 44100 -b 128 -', BASS_ENCODE_FP_16BIT, nil, nil);
s3 := BASS_Encode_CastInit(encoder, 'http://....:2680', 'PASSWORD', BASS_ENCODE_TYPE_MP3, 'TITLE','http://www.......','Pop', nil, nil, 128, TRUE);
p := @mix;
Thread := BeginThread(nil,0 , @DataThread, p, 0, ThreadID); // Thread to receive data from mixer

Thread to receive data from mixer:
Code:
repeat
try
nread := BASS_ChannelGetData(mix, @buf, sizeof(buf));
except
 err := Bass_errorgetcode();
end;
until (nread <= 0);

Ich habe nun das Problem das der stream immer nach gut 5 Sekunden abbricht und nicht mehr gestreamed wird. Hat jemand eine Idee?

EWeiss 12. Apr 2015 15:00

AW: Stream mit bass.dll
 
Ich denke mal das es daran liegt das du hier mit repeat arbeitest
es wäre besser wenn du die dafür vorgesehene Callback verwendest.

Warum einen eigenen Thread?

Siehe!
Delphi-Quellcode:
  RECORDPROC = function(handle: HRECORD; buffer: Pointer; length: DWORD; user: Pointer): BOOL; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF};
  {
    Recording callback function.
    handle : The recording handle
    buffer : Buffer containing the recorded sample data
    length : Number of bytes
    user  : The 'user' parameter value given when calling BASS_RecordStart
    RETURN : TRUE = continue recording, FALSE = stop
  }
und oder
Delphi-Quellcode:
  DOWNLOADPROC = procedure(buffer: Pointer; length: DWORD; user: Pointer); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF};
  {
    Internet stream download callback function.
    buffer : Buffer containing the downloaded data... NULL=end of download
    length : Number of bytes in the buffer
    user  : The 'user' parameter value given when calling BASS_StreamCreateURL
  }
Delphi-Quellcode:
  // callback function types
  STREAMPROC = function(handle: HSTREAM; buffer: Pointer; length: DWORD; user: Pointer): DWORD; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF};
  {
    User stream callback function. NOTE: A stream function should obviously be as
    quick as possible, other streams (and MOD musics) can't be mixed until
    it's finished.
    handle : The stream that needs writing
    buffer : Buffer to write the samples in
    length : Number of bytes to write
    user  : The 'user' parameter value given when calling BASS_StreamCreate
    RETURN : Number of bytes written. Set the BASS_STREAMPROC_END flag to end
             the stream.
  }
Diese Funktionen sind extra dafür angelegt.

gruss

Philipp1977 20. Apr 2015 18:30

AW: Stream mit bass.dll
 
Danke für die Antwort! Die DOWNLOADPROC für den Channel war zunächst schon einmal die Lösung für das erste Problem. Es ist aber noch ein weiteres Problem aufgetreten. Der Channel wird dann ja einem (Decoding-)Mixer zugewiesen von dem ich mir ja auch die Daten holen muss. Wie mache ich das denn? Wenn ich nun mit Bass_Channelgetdata von Mixer die Daten hole kommt nichts an...

EWeiss 20. Apr 2015 20:50

AW: Stream mit bass.dll
 
Zitat:

Zitat von Philipp1977 (Beitrag 1298595)
Danke für die Antwort! Die DOWNLOADPROC für den Channel war zunächst schon einmal die Lösung für das erste Problem. Es ist aber noch ein weiteres Problem aufgetreten. Der Channel wird dann ja einem (Decoding-)Mixer zugewiesen von dem ich mir ja auch die Daten holen muss. Wie mache ich das denn? Wenn ich nun mit Bass_Channelgetdata von Mixer die Daten hole kommt nichts an...

Verwendest du nur die Bass.dll oder auch die Bassmix.dll ?
Denn ohne wird es nicht gehen.

Versuchs doch mal mit BASS_Mixer_ChannelGetData ;)

gruss


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