Streaming 如何在Flash中播放shoutcast广播(shoutcast Flash Player)

Streaming 如何在Flash中播放shoutcast广播(shoutcast Flash Player),streaming,flash,shoutcast,Streaming,Flash,Shoutcast,多年来,我一直在寻找解决方案,但没有确凿的证据。有很多Shoutcast Flash播放器(例如radio.de),所以我知道这是可能的。然而,我的大部分研究都得出了以下结论: s = new Sound(); s.loadSound ("url.of.shoutcaststream:8003",true); 这在FireFox中适用,但在IE中不适用。我不想购买组件,我想知道这些组件是如何实现的,这样我就可以构建自己的自定义播放器。如果是流,它可能通过和类进行播放。例如: package {

多年来,我一直在寻找解决方案,但没有确凿的证据。有很多Shoutcast Flash播放器(例如radio.de),所以我知道这是可能的。然而,我的大部分研究都得出了以下结论:

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

这在FireFox中适用,但在IE中不适用。我不想购买组件,我想知道这些组件是如何实现的,这样我就可以构建自己的自定义播放器。

如果是流,它可能通过和类进行播放。例如:

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);
    }
}

你快到了。完整的咒语是:

s = new Sound();
s.loadSound ("http://url.of.shoutcaststream:8003/;",true);
注意后面的斜杠和分号。Shoutcast服务器(dna)查看请求的useragent,以检测响应中要发送的内容。如果是broswer,那么它提供一页HTML。如果不是浏览器UA,则发送流。尾随分号(出于某些未记录的原因)会导致DNA忽略UA并始终发送流

播放AAC流没有令人满意的解决方案,尽管Flash有这样做的设备,但由于某些原因,AAC的API完全不同,无法播放AAC Shoutcast

这里的NetStream解决方案不太可能提供解决方案

有关更多信息,请参阅我的博客:


从wavestreaming.com查看播放器,它非常容易使用


在Flash中播放流媒体播放器的主要问题是内存消耗

Flash Player不断地在内存中记录流,浪费了所有的计算机资源,直到它冻结,这让用户非常生气。:)

// 定期检查sound.Bytes加载setTimeout或setInterval时,将sound变量设为null

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

由于跨域问题,您将无法在Flash中直接读取元数据。您可以播放音频流,因为Flash player将其视为“内容”,但您将无法读取元数据,因为Flash player将其视为受跨域策略约束的“数据”

您可以向ShoutCast服务器添加跨域策略文件,但这对大多数用户来说都很困难(您需要在ShoutCast服务器上安装Web服务器)

乔治·加德纳

您能否提供有关此代码的进一步说明,以将其实现到Flash SWF中?有趣的。。。这会给复制增加任何跳跃/故障吗?jPlayer支持SHOUTcast: