首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Flash中流式播放shoutcast广播(Shoutcast Flash Player)

如何在Flash中流式播放shoutcast广播(Shoutcast Flash Player)
EN

Stack Overflow用户
提问于 2009-08-13 17:29:58
回答 5查看 28.5K关注 0票数 4

我多年来一直在寻找这个问题的解决方案,但没有明确的文档。市面上有很多Shoutcast Flash播放器(例如radio.de),所以我知道这是可能的。然而,我的大部分研究都得出了这样的结论:

代码语言:javascript
复制
s = new Sound();
s.loadSound ("url.of.shoutcaststream:8003",true);

它适用于我的FireFox,但不适用于IE。我不想买一个组件,我想知道这些组件是如何做到的,这样我就可以构建我自己的自定义播放器。

EN

回答 5

Stack Overflow用户

发布于 2009-11-19 06:27:21

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

代码语言:javascript
复制
s = new Sound();
s.loadSound ("http://url.of.shoutcaststream:8003/;",true);

注意尾部的斜杠和分号。Shoutcast服务器(DNAS)查看请求的用户代理,以检测在响应中发回的内容。如果它是一个浏览器,那么它提供一个HTML页面。如果它不是浏览器UA,它会发送流。尾随的分号(由于某些未记录的原因)会导致DNAS忽略UA并始终发送流。

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

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

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

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

票数 8
EN

Stack Overflow用户

发布于 2010-08-05 18:58:19

在Flash中实现Stream-Player的主要问题是内存消耗。

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

//定期用setTimeout或setInterval检查声音,sound.bytesLoaded变量为空

代码语言:javascript
复制
MEM_MAX = 10 * 1024 * 1024
if(sound.bytesLoaded > MEM_MAX)
  { reloadSound(); flash.system.System.gc(); }
票数 3
EN

Stack Overflow用户

发布于 2009-08-13 17:39:52

如果它是一个流,那么它可能是通过NetStreamNetConnection类播放的。例如:

代码语言:javascript
复制
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);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1273454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档