AAC / MP4无法在ActionScript 3的NetStream中运行

时间:2010-01-10 04:41:55

标签: actionscript-3 flash-cs3 mp4 netstream aac

我正在尝试在Flash CS3中的ActionScript 3中播放远程AAC文件,目前我正在使用此代码:

var url:String = "http://a1.phobos.apple.com/us/r1000/020/Music/d4/50/94/mzm.kjjofihr.aac.p.m4a";
var connect_nc:NetConnection = new NetConnection();
connect_nc.connect(null);
var stream_ns:NetStream = new NetStream(connect_nc);
stream_ns.play(url);

(这基于:http://www.adobe.com/devnet/flashplayer/articles/hd_video_flash_player_03.html

不会抛出任何错误,但不会播放声音。我使用本地AAC文件和本地MP4视频获得相同的行为。

如果我使用不是可流式文件的URL或文件路径,我会收到NetStream.Play.StreamNotFound错误,我猜这意味着在有效URL的情况下会找到该流。如果我使用本地FLV,它的音频播放得很好。

如果我在netStatusHandler中添加以下侦听器和跟踪(evt.info.code),我只会看到使用FLV跟踪的任何代码(例如NetStream.Play.Start)。 AAC或MP4无法跟踪代码。 stream_ns.addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler);

添加此侦听器也是如此(即onMetaData参数仅使用FLV跟踪,而不跟踪其他文件类型),metaDataListener定义为具有跟踪其参数的onMetaData方法的对象。
stream_ns.client = metaDataListener;

关于这里可能出现什么问题的想法,或者如何诊断它?

谢谢!

3 个答案:

答案 0 :(得分:1)

如前所述http://www.adobe.com/devnet/flashplayer/articles/hd_video_flash_player_03.html你所做的是正确的。

var connect_nc:NetConnection = new NetConnection();
connect_nc.connect(null);
var stream_ns:NetStream = new NetStream(connect_nc);
stream_ns.play("RE-Sample.m4a");

但是,这里有关于nestream的Actionscript语言参考: http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/flash/net/NetStream.html#play%28%29

声明:

play()方法

...

...

在没有Flash Media Server的情况下使用此方法时,需要考虑安全性。本地受信任或本地联网沙箱中的文件可以从远程沙箱加载和播放视频文件,但如果没有跨域策略文件形式的显式权限,则无法访问远程文件的数据。此外,您可以通过在包含SWF内容的HTML页面中设置object和embed标记的allowNetworking参数来阻止在Flash Player中运行的SWF文件使用此方法。

... ...

参数     ... arguments - 要播放的视频文件的位置,作为URLRequest对象或字符串。在Flash Player和应用程序安全沙箱之外的AIR内容中,您可以播放存储在与SWF文件相同的目录中或子目录中的本地视频文件;但是,您无法导航到更高级别的目录。

所以它可能是一个安全沙箱问题。

答案 1 :(得分:1)

ActionScript 3.0中的所有内容都是基于事件的(几乎没有使用回调的随机异常)。

您需要使用info.code“NetConnection.Connect.Success”监听NetStatusEvent,以便允许调用NetStream.play()函数。

这是有用的东西(我现在只是写它,并为你测试):

package
{
    import flash.display.Sprite;

    import flash.net.NetConnection;
    import flash.net.NetStream;

    import flash.events.NetStatusEvent;
    import flash.events.AsyncErrorEvent;
    import flash.events.Event;

    public class MainDocument extends Sprite
    {
        private var _connection:NetConnection=new NetConnection();
        private var _netStream:NetStream=null;

        private var _strM4AURL:String="http://a1.phobos.apple.com/us/r1000/020/Music/d4/50/94/mzm.kjjofihr.aac.p.m4a";

        //constructor
        public function MainDocument():void
        {
            this._connect();
        }

        private function _connect():void
        {
            this._connection.close();
            this._connection=new NetConnection();
            this._connection.addEventListener(NetStatusEvent.NET_STATUS, this._netStatusHandler);
            this._connection.addEventListener(AsyncErrorEvent.ASYNC_ERROR, this._asyncErrorHandler);

            this._connection.connect(null);
        }

        private function _netStatusHandler(event:NetStatusEvent):void
        {
            trace(event.info.code);
            switch (event.info.code)
            {
                case "NetConnection.Connect.Success":
                    this._requestAudio();
                    break;
            }
        }

        private function _requestAudio():void
        {
            if(this._netStream!==null)
                this._netStream.close();

            this._netStream=new NetStream(this._connection);

            this._netStream.addEventListener(NetStatusEvent.NET_STATUS, this._netStatusHandler);
            this._netStream.addEventListener(AsyncErrorEvent.ASYNC_ERROR, this._asyncErrorHandler);

            this._netStream.checkPolicyFile=false;

            this._netStream.play(this._strM4AURL);
        }

        private function _asyncErrorHandler(event:AsyncErrorEvent):void
        {
            trace(event);
        }
    }
}

有关详细信息,请参阅“ActionScript 3.0语言参考”。

答案 2 :(得分:0)

很有可能Oliver说的是真的,因为你没有从与NetStream相关的任何事件监听器获得任何反馈,并且你得到StreamNotFound响应。

当没有连接到FMS时,StreamNotFound意味着由于安全问题导致路径错误或者没有看到它。