2009-08-13 147 views
4

我一直在尋找這種解決方案多年,但沒有任何結論性的文檔。有很多Shoutcast Flash播放器(例如radio.de),所以我知道這是可能的。然而,大多數我的研究導致了這一點:如何在Flash中播放Shoutcast無線電廣播(Shoutcast Flash Player)

s = new Sound(); 
s.loadSound ("url.of.shoutcaststream:8003",true); 

這在FireFox但不是在IE中對我的作品。我不想購買組件,我想知道這些組件是如何實現的,以便我可以構建自己的自定義播放器。

+0

jPlayer支持Shoutcast一樣: http://stackoverflow.com/questions/8786563/jplayer-and-shoutcast-configuration – trvbr 2012-09-06 00:05:24

回答

1

如果它是一個流,它可能通過NetStreamNetConnection類播放。例如:

package { 
    import flash.display.Sprite; 
    import flash.events.NetStatusEvent; 
    import flash.events.SecurityErrorEvent; 
    import flash.media.Video; 
    import flash.net.NetConnection; 
    import flash.net.NetStream; 
    import flash.events.Event; 

    public class NetConnectionExample extends Sprite { 
     private var streamURL:String = "url.of.shoutcaststream:8003"; 
     private var connection:NetConnection; 
     private var stream:NetStream; 

     public function NetConnectionExample() { 
      connection = new NetConnection(); 
      connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); 
      connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); 
      connection.connect(null); 
     } 

     private function netStatusHandler(event:NetStatusEvent):void { 
      switch (event.info.code) { 
       case "NetConnection.Connect.Success": 
        connectStream(); 
        break; 
       case "NetStream.Play.StreamNotFound": 
        trace("Stream not found: " + streamURL); 
        break; 
      } 
     } 

     private function securityErrorHandler(event:SecurityErrorEvent):void { 
      trace("securityErrorHandler: " + event); 
     } 

     private function connectStream():void { 
      stream = new NetStream(connection); 
      stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); 
      stream.client = new CustomClient(); 
      stream.play(streamURL); 
     } 
    } 
} 

class CustomClient { 
    public function onMetaData(info:Object):void { 
     trace("metadata: duration=" + info.duration + " width=" + info.width + " height=" + info.height + " framerate=" + info.framerate); 
    } 
    public function onCuePoint(info:Object):void { 
     trace("cuepoint: time=" + info.time + " name=" + info.name + " type=" + info.type); 
    } 
} 
+0

你可以提供關於這段代碼的進一步指示,以實現它到Flash SWF中嗎? – Jourdan 2010-08-14 23:09:28

8

你快到了。完整的口頭禪是:

s = new Sound(); 
s.loadSound ("http://url.of.shoutcaststream:8003/;",true); 

請注意尾部的斜線和分號。 Shoutcast服務器(DNAS)會查看請求的useragent以檢測響應中要發回的內容。如果它是一個瀏覽器,那麼它會提供一頁HTML。如果它不是瀏覽器UA,它會發送流。尾隨分號(出於某些未記載的原因)導致DNAS忽略UA並始終發送流。

沒有令人滿意的方法來播放AAC流,儘管Flash有設備可以這樣做,但由於某些原因,AAC的API完全不同,無法播放AAC Shoutcast。

NetStream解決方案不太可能提供解決方案。

請參見我的博客更多的信息:從wavestreaming.com

http://www.flexiblefactory.co.uk/flexible/?p=51

3

在Flash中做一個流播放器的主要問題是內存的消耗。

Flash Player一直在記錄內存中的流,浪費了所有的計算機資源,直到它凍結,使用戶非常生氣。 :)

// 定期檢查sound.bytesLoaded用的setTimeout或setInterval的,空的聲音變

MEM_MAX = 10 * 1024 * 1024 
if(sound.bytesLoaded > MEM_MAX) 
    { reloadSound(); flash.system.System.gc(); } 
+0

有趣的......這是否增加了任何跳躍/故障的複製? – gyo 2012-06-12 08:41:32

1

您將無法讀取Flash中的元數據,直接由於跨域的問題。您可以播放音頻流,因爲Flash播放器認爲它是'內容',但您將無法閱讀元數據,因爲Flash播放器認爲該數據是受跨域策略影響的'數據'。

你可以一個跨域策略文件添加到SHOUTcast服務器,但是這將是困難的大多數用戶(您需要在您的SHOUTcast服務器上安裝一個Web服務器)

喬治·加德納 http://www.commonmode.co.uk