[Ruby] threaded mp3-streamer geeft buffer problemen

Pagina: 1
Acties:

  • bras
  • Registratie: Oktober 2000
  • Laatst online: 06-03 11:46
Ik ben bezig met een threaded mp3 streamer, hierin zit een klasse streamer, die heeft als vars een IO object (voor de mp3-data) en een array van sockets om de data naar toe te sturen.

Die streamer klasse wordt gecreerd als iemand met winamp/mp3-player naar de ruby server (TCPServer op poort 9999) connect, de socket wordt toegevoegd aan de klasse, en de relevante mp3-file wordt gekoppeld aan de klasse. Andere mensen kunnen hiervan meegenieten door ook te connecten naar die server en dan wordt hun socket in die klasse erbij gehangen.

De klasse draait in een thread omdat er meerdere mensen mogelijk naar verschillende dingen willen luisteren, zodat meerder streamers vereist zijn:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Thread.start do
    while (!@streamSource.eof)
        data = @streamSource.read(PACKET_SIZE)

        @mutex.synchronize {
            @sockets.each { |x|
                begin
                    x.write data
                    x.flush
                rescue Errno::EPIPE
                    # remove socket from list
                    puts self.to_s + ' removes socket: ' + x.to_s
                    @sockets.delete(x)
                end
            }
    end
    @streamSource.close
    @sockets.each { |x| x.close }
 end


hierin zit dus een mutex om te voorkomen dat tegelijk sockets worden toegevoegd aan de socket array, en dat de array wordt uitgelezen om naar toe te schrijven, ook zit er een check in om te kijken of de write goed ging, anders wordt de socket verwijderd. PACKETSIZE = 4096, zodat er elke keer 4k mp3 data wordt gelezen

Na deze uitleg dan het probleem:
Tijdens testen blijkt dit best redelijk te werken, maar het komt ook regelmatig voor dat winamp tijdelijk stopt met spelen om z'n buffer opnieuw te vullen.
In PHP heb ik een zelfde principe alleen daar heeft elke stream een eigen connectie met een PHP file (waardoor het dus niet mogelijk is om met meerdere mensen naar dezelfde stream te luisteren, wat uiteindelijk de reden was om in ruby eens iets te proberen)
Zou het er aan kunnen liggen dat m'n ISP poorten beperkt in doorvoer? of moet ik het toch echt aan de server kant zoeken? (de load is bijna niets dus dat kan de oorzaak niet zijn denk ik)
Of hebben mensen een idee hoe ik kan achterhalen wat de bottleneck is?

"When you find yourself in the company of a halfling and an ill-tempered Dragon, remember, you do not have to outrun the Dragon...you just have to outrun the halfling."


Verwijderd

weet je het al ?

ik kon niet bedenken waar het nou aan lag, maar ben wel benieuwd naar de uitkomst :7

  • bras
  • Registratie: Oktober 2000
  • Laatst online: 06-03 11:46
Helaas nog steeds geen echte oplossing. Wel ontdekt dat andere mensen geen tot weinig last hebben van het buffer gebeuren.
En ik heb het idee dat ik er minder last van heb als ik 's ochtends tussen 7 en 8 aan het testen ben.
Ik krijg dus het idee dat het werkelijk aan de specifieke poorten ligt die geknepen worden door Chello, omdat daar ook al een aantal topics over zijn op GOT.
Nog een experiment was om lokaal met behulp van php een proxy te maken, winamp connect dan met het php script en vervolgens legt het php script een socket verbinding met de ruby server. Dit gaf vervolgens geen buffer problemen meer, maar de stream liep niet helemaal zuiver meer (alsof er verkeerde bits tussendoor kwamen)

Nou ja, hopelijk binnenko0rt testen op poort 80. De uitkomst post ik wel weer hier

"When you find yourself in the company of a halfling and an ill-tempered Dragon, remember, you do not have to outrun the Dragon...you just have to outrun the halfling."