4

我正在尝试在 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);

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

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

谢谢!

4

3 回答 3

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

指出:

播放()方法

...

...

当您在没有 Flash Media Server 的情况下使用此方法时,需要考虑安全性。local-trusted 或 local-with-networking 沙箱中的文件可以从远程沙箱加载和播放视频文件,但如果没有跨域策略文件形式的明确许可,则无法访问远程文件的数据。此外,您可以通过设置对象的 allowNetworking 参数并在包含 SWF 内容的 HTML 页面中嵌入标签来阻止在 Flash Player 中运行的 SWF 文件使用此方法。

……

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

所以这可能是一个安全沙盒问题。

于 2010-02-02T21:38:21.787 回答
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 语言参考。

于 2012-04-14T14:49:09.633 回答
0

Oliver 所说的很有可能是真的,因为您没有从与 NetStream 关​​联的任何事件侦听器那里得到任何反馈,并且您得到的是 StreamNotFound 响应。

未连接到 FMS 时的 StreamNotFound 意味着您的路径错误或由于安全问题而没有看到它。

于 2011-10-13T17:58:03.727 回答