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 を使用すると、そのオーディオは問題なく再生されます。

次のリスナーと trace(evt.info.code) を netStatusHandler に追加すると、FLV でトレースされたコード (NetStream.Play.Start など) のみが表示されます。AAC または MP4 ではコードはトレースされません。stream_ns.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);

引数をトレースする onMetaData メソッドを持つオブジェクトとして定義された metaDataListener を使用して、このリスナーを追加する場合も同様です (つまり、onMetaData 引数は FLV でのみトレースされ、他のファイル タイプではトレースされません)。
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 にあります。

次のように述べています。

play() メソッド

...

...

Flash Media Server なしでこの方法を使用する場合、セキュリティに関する考慮事項があります。local-trusted または local-with-networking サンドボックス内のファイルは、リモート サンドボックスからビデオ ファイルを読み込んで再生できますが、クロスドメイン ポリシー ファイルの形式で明示的な許可なしにリモート ファイルのデータにアクセスすることはできません。また、オブジェクトの allowNetworking パラメーターを設定し、SWF コンテンツを含む HTML ページに埋め込みタグを設定することで、Flash Player で実行されている SWF ファイルがこのメソッドを使用しないようにすることもできます。

... ... ...

パラメータ ... 引数 — URLRequest オブジェクトまたは文字列として、再生するビデオ ファイルの場所。アプリケーションセキュリティサンドボックス外の Flash Player および AIR コンテンツでは、SWF ファイルと同じディレクトリまたはサブディレクトリに保存されているローカルビデオファイルを再生できます。ただし、上位のディレクトリに移動することはできません。

したがって、おそらくセキュリティ サンドボックスの問題です。

于 2010-02-02T21:38:21.787 に答える
1

ActionScript 3.0 のすべてがイベント ベースです (コールバックが使用されるランダムな例外はほとんどありません)。

NetStream.play() 関数の呼び出しを許可するには、info.code "NetConnection.Connect.Success" で NetStatusEvent をリッスンする必要があります。

これが機能するものです(私は今それを書き、あなたのためにテストしました):

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

NetStream に関連付けられたイベント リスナーからフィードバックが得られず、StreamNotFound 応答が返されるため、Oliver の言っていることは正しい可能性が高いです。

FMS に接続していないときの StreamNotFound は、セキュリティ上の問題により、パスが間違っているか、パスが表示されていないことを意味します。

于 2011-10-13T17:58:03.727 に答える