如何在Flash中流式传输shoutcast广播(Shoutcast Flash 播放器)

4

多年来,我一直在寻找解决此问题的方法,但没有任何明确的文档。有许多Shoutcast Flash播放器(例如radio.de),所以我知道这是可能的。然而,我的大部分研究都指向了这个:

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

这在FireFox中可以正常工作,但在IE中却不行。我不想购买组件,我想知道这些组件是如何做到的,以便我可以构建自己的定制播放器。


jPlayer 支持 SHOUTcast:https://dev59.com/questions/01_Va4cB1Zd3GeqPPhHC - trvbr
5个回答

8

你已经快成功了。完整的口诀是:

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

请注意斜杠和分号的后缀。Shoutcast服务器(DNAS)检查请求的useragent以检测在响应中发送什么。如果是浏览器,则提供HTML页面。如果不是浏览器UA,则发送流。尾随分号(由于某些未记录的原因)使DNAS忽略UA并始终发送流。
目前没有令人满意的播放AAC流的解决方案,虽然Flash有设备可以做到这一点,但由于API完全不同,无法播放AAC Shoutcast。
这里的NetStream解决方案不太可能提供解决方案。
欲了解更多信息,请参见我的博客:

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


3
在Flash中制作流媒体播放器的主要问题是内存消耗。Flash Player会在内存中不断记录流,浪费所有计算机资源直到它冻结,这会使用户非常生气。 :)
// 周期性地使用setTimeout或setInterval检查sound.bytesLoaded,将sound变量置空。
MEM_MAX = 10 * 1024 * 1024
if(sound.bytesLoaded > MEM_MAX)
  { reloadSound(); flash.system.System.gc(); }

有趣...这会对复制品产生任何跳跃/故障吗? - gyo

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

你能否提供进一步的指导,以便将此代码实现到Flash SWF中? - Jourdan

1

由于跨域问题,您将无法直接读取 Flash 中的元数据。由于 Flash 播放器认为音频流属于“内容”,因此您可以播放该音频流,但是您将无法读取元数据,因为 Flash 播放器认为它是“数据”,受到跨域策略的限制。

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

乔治·加德纳 http://www.commonmode.co.uk


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接