我多年来一直在寻找解决方案,但没有最终确凿的文件记录。那里有许多Shoutcast Flash播放器(例如radio.de)所以我知道它是可能的。但是,我的大多数研究都是这样的:
s = new Sound();
s.loadSound ("url.of.shoutcaststream:8003",true);
哪个适用于FireFox,但不适用于IE。我不想购买组件,我想知道这些组件是如何做到的,以便我可以构建自己的自定义播放器。
答案 0 :(得分:8)
你快到了。完整的口头禅是:
s = new Sound();
s.loadSound ("http://url.of.shoutcaststream:8003/;",true);
注意尾部斜杠和分号。 Shoutcast服务器(DNAS)查看请求的使用情况,以检测响应中要发回的内容。如果它是一个broswer然后它提供一页HTML。如果它不是浏览器UA,则发送流。尾随分号(由于某些未记录的原因)导致DNAS忽略UA并始终发送流。
播放AAC流没有令人满意的解决方案,虽然Flash有这样的设备,但由于某种原因,AAC的API完全不同,无法播放AAC Shoutcast。
此处的NetStream解决方案不太可能提供解决方案。
有关详细信息,请参阅我的博客:
答案 1 :(得分:3)
在Flash中执行Stream-Player的主要问题是内存消耗。
Flash Player继续在内存中记录流,浪费所有计算机资源,直到它冻结,使用户非常生气。 :)
// 定期检查sound.bytesLoaded with setTimeout或setInterval,null声音变量
MEM_MAX = 10 * 1024 * 1024
if(sound.bytesLoaded > MEM_MAX)
{ reloadSound(); flash.system.System.gc(); }
答案 2 :(得分:1)
如果它是一个流,它可能通过NetStream和NetConnection类播放。例如:
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);
}
}
答案 3 :(得分:1)
由于跨网域问题,您将无法直接在Flash中读取元数据。您可以播放音频流,因为Flash播放器认为它是“内容”,但您将无法读取元数据,因为Flash播放器认为这是“数据”,受到跨域策略的约束。
您可以将一个跨域策略文件添加到ShoutCast服务器,但对于大多数用户来说这将是困难的(您需要在ShoutCast服务器上安装Web服务器)
答案 4 :(得分:0)
从wavestreaming.com查看播放器,它非常易于使用。
http://www.wavestreaming.com/servers/flash-streaming/shoutcast-player.php