Streaming *update* V1.0.7

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

StepTiger

Betreff: Streaming *update* V1.0.7

BeitragSo, Dez 17, 2006 17:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab nun lange Überlegungen in diesen Code investiert.

ENDLICH habe ich es geschafft. Ganz ohne zusätzliche DLLs ^^

Streaming via Internet, Netzwerk oder Ähnliches.

Ihr benötigt einen Ordner namens music, in den ihr die Wave Dateien ablegt. (Ja, leider nur wav!)

Hier der Server:
Code: [AUSKLAPPEN]
;Host
SeedRnd MilliSecs()
SetBuffer BackBuffer()

tdir$="music\"
hsize=44
scrollspeed#=30

Type musik
   
   Field pfad$
   Field title$
   
End Type

dir=ReadDir(tdir$)
If dir=0 Then RuntimeError "Es existiert kein Verzeichnis "+Chr$(34)+tdir$+Chr$(34)

mes$=" - brought to you by StepTiger.    - "
chspd=300
lch=MilliSecs()

count=0

Repeat
   
   d$=NextFile$(dir)
   If Instr(d$,".wav")
      
      a.musik=New musik
      a\pfad$=d$
      a\title$=Left$(d$,Len(d$)-4)
      count=count+1
      
   EndIf
   
Until d$=""

If count=0 Then RuntimeError "Keine wav-Dateien im Verzeichnis "+Chr$(34)+tdir$+Chr$(34)+"."

RandomizeTitles(count)

mus.musik=First musik
musik$=tdir$+mus\pfad$

stream=CreateTCPServer(8480)
If stream=0 Then RuntimeError "Couldn't create TCP Server!"
title$=mus\title$+mes$
mfile=ReadFile(musik$)

AppTitle "..."+title$

Const MAX_FPS=200

header=CreateBank(hsize)
ReadBytes(header,mfile,0,hsize)

SeekFile mfile,28
abps=ReadInt(mfile)

sendsize=96*1024
sendbank=CreateBank(sendsize)

overflow=64*1024

Print abps

Type listener
   
   Field Hndl
   Field ping
   
End Type

n=PlayMusic(musik$)
ChannelVolume n,0

starttimer#=MilliSecs()

opos=hsize

vol#=.75

While Not KeyHit(1)
   
   time=MilliSecs()-starttimer#
   pos=(time*Float#(abps/1000))+hsize
   
   If KeyDown(200) Then vol#=vol#+.01
   If KeyDown(208) Then vol#=vol#-.01
   If vol#>1 Then vol#=1
   If vol#<0 Then vol#=0
   If (vol# Mod .01)<.005 Then vol#=vol#-(vol# Mod 0.01)
   If (vol# Mod .01)>.005 Then vol#=vol#+(.01-(vol# Mod 0.01))
   
   If vol#<>ovol#
      
      For r.listener=Each listener
         
         WriteByte r\hndl,Asc("V")
         WriteFloat r\hndl,vol#
         
      Next
      
   EndIf
   
   ovol#=vol#
   
   Cls
   
   Text 1,1,"SERVER"
   
   For r.listener=Each listener
      
      While ReadAvail(r\hndl)
         
         ReadByte r\hndl
         r\ping=MilliSecs()
         
      Wend
      
      If MilliSecs()>r\ping+5000
         If MilliSecs()<msg1time+3000
            If msg2$ Then msg1$=msg2$
            msg2$="Connection "+r\hndl+" has left!"
            msg2time=MilliSecs()
         Else
            msg1$="Connection "+r\hndl+" has left!"
            msg1time=MilliSecs()
         EndIf
         CloseTCPStream r\hndl
         Delete r
      EndIf
      
   Next
   
   If MilliSecs()>lch+chspd And chspd>0
      title$=Right$(title$,Len(title$)-1)+Left$(title$,1)
      AppTitle "..."+title$
      lch=MilliSecs()
      For r.listener=Each listener
         WriteByte r\hndl,Asc("N")
         WriteLine r\hndl,title$
      Next
   EndIf
   
   newone=AcceptTCPStream(stream)
   If newone<>0
      
      r.listener=New listener
      r\hndl=newone
      WriteLine r\hndl,hsize
      WriteLine r\hndl,"HEADER"
      WriteBytes(header,r\hndl,0,hsize)
      WriteInt r\hndl,sendsize
      If MilliSecs()<msg1time+3000
         If msg2$ Then msg1$=msg2$
         msg2$="Connection "+r\hndl+" has joined!"
         msg2time=MilliSecs()
      Else
         msg1$="Connection "+r\hndl+" has joined!"
         msg1time=MilliSecs()
      EndIf
      WriteByte r\hndl,Asc("N")
      WriteLine r\hndl,title$
      WriteByte r\hndl,Asc("V")
      WriteFloat r\hndl,vol#
      r\ping=MilliSecs()
      
   EndIf
   
   While FPS_LAST>(MilliSecs()-(1000./MAX_FPS)):Delay FPS_LAST-(MilliSecs()-(1000./MAX_FPS))-1:Wend
   
   se=0
   
   If pos>(opos+sendsize-overflow)
      
      SeekFile mfile,opos
      ReadBytes(sendbank,mfile,0,sendsize)
      opos=opos+sendsize
      
      For r.listener=Each listener
         
         WriteByte r\hndl,Asc("D")
         WriteBytes(sendbank,r\hndl,0,sendsize)
         se=1
         
      Next
      
   EndIf
   ;Fps berechnen und anzeigen
   fps#=(19*fps#+(1000./(MilliSecs()-FPS_LAST)))/20.:FPS_LAST=MilliSecs()
   proz#=Float#(pos)/(FileSize(musik$)-hsize)*100.
   If se=1 Then m$="Transmitting..." Else m$="Waiting..."
   Text 1,15,"Transmitting:    "+m$
   Text 1,30,"FPS:             "+fps#
   Text 1,45,"File Position:   "+pos
   Text 1,60,"Secs Played:     "+time/1000.
   Text 1,75,"Percent Played:  "+Str$(proz#-(proz# Mod .1)+"%")
   Text 1,90,"Volume:          "+vol#
   Text 1,105,"Online:          "+Count()
   If MilliSecs()<msg1time+3000
      Text 1,135,"Message:         "+msg1$
   Else
      Text 1,135,"Message:         "
      msg1$=""
   EndIf
   If MilliSecs()<msg2time+3000   
      Text 1,150,"Message:         "+msg2$
   Else
      Text 1,150,"Message:         "
      msg2$=""
   EndIf
   
   If proz#>=100
      
      mus=After mus
      If mus=Null Then mus=First musik
      title$=mus\title$+mes$
      musik$=tdir$+mus\pfad$
      CloseFile mfile
      mfile=ReadFile(musik$)
      ReadBytes(header,mfile,0,hsize)
      SeekFile mfile,28
      abps=ReadInt(mfile)
      SeekFile mfile,hsize
      opos=hsize
      starttimer=MilliSecs()
      n=PlayMusic(musik$)
      ChannelVolume n,0
      
      For r.listener=Each listener
         
         WriteByte r\hndl,Asc("H")
         WriteBytes header,r\hndl,0,hsize
         WriteByte r\hndl,Asc("N")
         WriteLine r\hndl,title$
         
      Next
      
   EndIf
   
   cb=KeyHit(203)
   ca=KeyHit(205)
   If (cb Or ca) And cb<>ca
      
      If ca
         
         mus=After mus
         If mus=Null Then mus=First musik
         
      ElseIf cb
         
         mus=Before mus
         If mus=Null Then mus=Last musik
         
      EndIf
      title$=mus\title$+mes$
      musik$=tdir$+mus\pfad$
      CloseFile mfile
      mfile=ReadFile(musik$)
      ReadBytes(header,mfile,0,hsize)
      SeekFile mfile,28
      abps=ReadInt(mfile)
      SeekFile mfile,hsize
      opos=hsize
      starttimer=MilliSecs()
      n=PlayMusic(musik$)
      ChannelVolume n,0
      
      For r.listener=Each listener
         
         WriteByte r\hndl,Asc("H")
         WriteBytes header,r\hndl,0,hsize
         WriteByte r\hndl,Asc("N")
         WriteLine r\hndl,title$
         
      Next
      
   EndIf
      
   Flip 0
   
Wend

For r.listener=Each listener
   
   CloseTCPStream r\hndl
   Delete r
   
Next

CloseTCPServer stream
CloseFile mfile
End


Function RandomizeTitles(count)
   
   For f.musik=Each musik
      
      rn=Rand(count)
      
      n.musik=SelectTitle(rn)
      
      If n<>Null And f<>n
         
         Insert f Before n
         
      ElseIf n=Null
         
         Insert f Before First musik
         
      EndIf
      
      If KeyHit(57) Then RuntimeError ""
      
   Next
   
End Function

Function SelectTitle.musik(num)
   
   n=0
   f.musik=Null
   
   For x=0 To num
      
      If f<>Null
         
         f=After f
         
      Else
         
         f=First musik
         
      EndIf
      
   Next
   
   Return f
   
End Function

Function Count()
   
   n=0
   
   For f.listener=Each listener
      
      n=n+1
      
   Next
   
   Return n
   
End Function


hier der Client:
Code: [AUSKLAPPEN]
;Client

ip$="192.168.0.2"
fend$=".wav"

SetBuffer BackBuffer()
stream=OpenTCPStream(ip$,8480)

Const MAX_FPS=200

If stream=0 Then RuntimeError "Couldn't connect to server!"

hsize=ReadLine$(stream)
headerbank=CreateBank(hsize)
If ReadLine$(stream)="HEADER"
   
   ReadBytes(headerbank,stream,0,hsize)
   abps=ReadInt(stream)
   
Else
   
   RuntimeError "Couldn't read header!"
   
EndIf

num=0
readbank=CreateBank(abps)

pt=MilliSecs()+3000

vol#=1

While Not KeyHit(1)
   
   Cls
   
   While FPS_LAST>(MilliSecs()-(1000./MAX_FPS)):Delay FPS_LAST-(MilliSecs()-(1000./MAX_FPS))-1:Wend
   
   If MilliSecs()>pt Then WriteLine stream,"PING":pt=MilliSecs()+3000
   
   d$=""
   
   While ReadAvail(stream)
      
      d$=Chr$(ReadByte(stream))
      If d$="D"
         
         num=1-num
         fl=WriteFile("file"+num+fend$)
         ReadBytes(readbank,stream,0,abps)
         WriteBytes(headerbank,fl,0,hsize)
         WriteBytes(readbank,fl,0,abps)
         CloseFile fl
         n=PlayMusic("file"+num+".wav")
         ChannelVolume n,vol#
         
      EndIf
      
      If d$="H"
         
         ReadBytes(headerbank,stream,0,hsize)
         
      EndIf
      
      If d$="N"
         
         title$=ReadLine$(stream)
         AppTitle "..."+title$
         
      EndIf
      
      If d$="A"
         
         abps=ReadInt(stream)
         
      EndIf
      
      If d$="V"
         
         vol#=ReadFloat#(stream)
         ChannelVolume n,vol#
         
      EndIf
      
   Wend
   
   msg$=""
   
   Text 1,1,"CLIENT"
   If d$<>"" Then msg$="Receiving..." Else msg$="No Data!"
   Text 1,15,"Status:      "+msg$
   Text 1,30,"FPS:         "+fps#
   
   ;Fps berechnen und anzeigen
   fps#=(19*fps#+(1000./(MilliSecs()-FPS_LAST)))/20.:FPS_LAST=MilliSecs()
   
   Flip 0

Wend

CloseTCPStream stream

End



Die wichtigsten Variablen:
tdir$ ist das Verzeichnis, in dem sich die Musik befindet.
mes$ ist für eine Zusatznachricht an dem Titel.
MAX_FPS ist wichtig für die maximalen FPS. Zu hoch und der PC wird überlastet, zu niedrig und es stockt im Sound.
chspd ist die Geschwindigkeit, mit der der Text scrollt. Höher ist langsamer, 0 ist aus.
sendsize ist die Anzahl an byte, die für ein Soundsegment gesendet wird
overflow ist die Anzahl an byte, die gesendet werden, bevor sie abgespielt werden.
IP$ ist die IP des Server
hsize zum festlegen der Größe des Headers
vol# zum festlegen der Anfangslautstärke

Das dürfte es soweit gewesen sein.

Da es wave dateien sind, sind sie nur in minimaler Qualität für Internetübertragung geeignet (aber es geht, hab es schon getestet.)

*edit* Server und Client Update Smile

*edit* Nun version 1.3

*edit* Nun 1.0.6

*edit* 1.0.7
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.
  • Zuletzt bearbeitet von StepTiger am Mo, Dez 18, 2006 18:11, insgesamt 10-mal bearbeitet

Goodjee

BeitragSo, Dez 17, 2006 17:18
Antworten mit Zitat
Benutzer-Profile anzeigen
kann amn auch sowas machen, damit man dann mit winamp oder windows media player den stream hören kann??
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

StepTiger

BeitragSo, Dez 17, 2006 17:20
Antworten mit Zitat
Benutzer-Profile anzeigen
nein, weil es ein eigens von mir erstelltes Protokoll ist. Ich habe noch nicht herausgefunden, wie das Icecast Protokoll funktioniert.
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.
 

Coffee

BeitragSo, Dez 17, 2006 21:30
Antworten mit Zitat
Benutzer-Profile anzeigen
die idee is sehr geil mhh...
schade das nur wav aber egal ich werd moren mal im homenetzwerk testen.
*Mjam*

StepTiger

BeitragSo, Dez 17, 2006 22:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Changelog:

ALLGEMEIN
-Versionsnummer von 1.3 auf 1.4 auf 1.0.4 verändert

HOST
-Zufälliges Mischen der Titel
-Einige Fehler beseitigt

CLIENT
-Geschwindigkeit verbessert

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

ALLGEMEIN
-Versionsnummer auf 1.0.5

HOST
-Druck auf Leertaste zum Wechseln zum nächsten Titel

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

ALLGEMEIN
-Versionsnummer auf 1.0.6

HOST
-Sehr viel, unter Anderem:
-Titelwechsel nun mit Pfeil Links und Pfeil Rechts
-GUI verschönert

CLIENT
-Sehr viel, unter Anderem:
-GUI verschönert
-Besser anschaubar für Leute, die mit dem Quellcode nichts anzufangen wissen

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

ALLGEMEIN
-Versionsnummer 1.0.7
-Lautstärke veränderbar

HOST
-Kann Lautstärke festlegen (PFEIL OBEN und PFEIL UNTEN)
-Neue Anzeige: Volume
-Neue Variable: hsize zum festlegen der Größe des Headers
-Neue Variable: vol# zum festlegen der Anfangslautstärke


PLANUNG
HOST
-Scrolling während des Liedes

CLIENT
-Eigene Lautstärkeeinstellung
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.
  • Zuletzt bearbeitet von StepTiger am Mo, Dez 18, 2006 18:11, insgesamt 2-mal bearbeitet

Dante

BeitragSo, Dez 17, 2006 23:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Schonmal sehr gut Very Happy
Aber würd die print Befehle rausnehmen,
sind voll die Speed-Bremsen Confused

MfG

StepTiger

BeitragSo, Dez 17, 2006 23:15
Antworten mit Zitat
Benutzer-Profile anzeigen
die ersetze ich bald durch text ^^
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

BlitzChecker

BeitragDi, Dez 19, 2006 16:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Habs grad mal ausprobiert...
...und funzt Very Happy

Stockt nur n bisschen (Aber ist ja normal, da PlayMusic immer n bisschen Speed nimmt)...

mfg BlitzChecker
www.xairro.com

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group