8

私は NetStream.appendBytes() を使用して、Adobe AIRでローカルビデオ (サーバーは関係ありません) を再生しています。を使用BitmapData.draw()してビデオ出力の写真を撮りたいのですが、次のエラーが発生します。

エラー #2123: セキュリティ サンドボックス違反: BitmapData.draw: null にアクセスできません。アクセス権が付与されたポリシー ファイルはありません。

サンプルコードは次のとおりです。

package
{
    import flash.display.Sprite;
    import flash.filesystem.File;
    import flash.filesystem.FileMode;
    import flash.filesystem.FileStream;
    import flash.media.Video;
    import flash.net.NetConnection;
    import flash.net.NetStream;
    import flash.net.NetStreamAppendBytesAction;
    import flash.utils.ByteArray;
    import flash.display.BitmapData;

    class ByteArrayPlayer extends Sprite
    {
        private var _ns:NetStream;
        private var _nc:NetConnection;
        private var _video:Video;

        public function playVideo(path:String):void
        {
            _nc = new NetConnection();
            _nc.connect(null);
            _ns = new NetStream(_nc);

            _video = new Video();
            addChild(_video);
            _video.attachNetStream(_ns);

            _ns.play(null);
            _ns.appendBytesAction(NetStreamAppendBytesAction.RESET_BEGIN);

            var file:File = new File(path);
            var fileStream:FileStream = new FileStream();
            fileStream.open(file, FileMode.READ);

            var bytes:ByteArray = new ByteArray();

            fileStream.readBytes(bytes);

            _ns.appendBytes(bytes);
        }


        public function getImage(video:Video):BitmapData
        {
            var bit:BitmapData = new BitmapData(_video.width, _video.height);
            bit.draw(_video);            //This will cause the error
            return bit;
        }
    }
}

これは、説明のためのサンプル コードの使用のみです。ビデオの再生中に getImage メソッドを呼び出すと、エラーが発生します。このエラーは、ポリシー ファイルが見つからないことを示しています。ファイルはローカルにロードされるため、実際にはポリシー ファイルを配置する場所がありません。設定する必要があるポリシー設定がどこかにありますか、または をBitmapData.draw使用しているときに機能が利用できないだけappendBytesですか?

4

7 に答える 7

1

_ns.play(path)別の解決策は、を使用し、使用しないことだと思います_ns.appendBytes()

于 2011-08-11T02:18:40.857 に答える
0

ビデオオブジェクトをMovieClipに配置して、ビデオオブジェクトのbit.draw(_movieclipInstanceName);代わりに使用してみてください。私はそれがうまくいくことを願っています。

于 2012-03-13T16:21:37.957 に答える
0

NetStream.checkPolicyFile = true関数を呼び出す前にset を試してくださいplay()

このような:

_ns.checkPolicyFile = true;
_ns.play(null);

フラグが行うことは、checkPolicyFileロードされた swf のサーバーからポリシー ファイルをロードするようホスト swf に指示することです。ロード時にそのフラグを指定しなかったSecurityError場合、ロードされたストリームから を介してピクセル データを取得しようとすると、 が返されますBitmapData.draw()

Adobe リソースへのリンク: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/NetStream.html#checkPolicyFile

于 2011-04-09T18:52:08.287 に答える
0

私はこの質問が本当に古いことを知っています...しかし、それは私が直面したばかりの問題であり、他の人も同様であることを知っています.それを機能させるための回避策。

重複スタック質問のバグの回避策

于 2015-03-26T16:33:53.557 に答える
0

コンテンツを描画しようとしたときにサンドボックス エラーを取り除く解決策がありnetstream.appendByte()ます。

SWF は、指定されたアドレスでクロスドメイン ファイルを探しているため、サンドボックスを取得します:netstream.play(null)。彼は存在しないものを探しています。

解決策は、本物のクロスドメイン ファイルを含む「<code>netstream.play(http://myserv.com/video.flv)」のような偽のビデオ URL を再生することです。 appendBytes 関数のおかげで、必要なビデオをロードします。

SWFはだまされています!

奇妙に聞こえるかもしれませんが、私にとってはうまくいきます:-)

于 2011-06-01T14:07:41.923 に答える
0

StreamVideoSampleAccess または StreamAudioSampleAccess と呼ばれるサーバー側の設定が true に設定されているか、この StreamVideoSampleAccess/StramVideoSampleAccess のように設定されていない限り、rtmp ストリームからビデオまたはオーディオのスナップショットを取得することはできません。FMS サーバー側にアクセスせずにこれを行う方法を発見していません。

于 2011-08-05T18:33:55.467 に答える
-1

ロードされていないビデオで、またはNetStreamオブジェクトがnullのときに、BitmapData.draw()メソッドを呼び出そうとしているようです。

考えられる修正:draw()を呼び出す前に、NetStream.Buffer.FullNetStatusがディスパッチされるまで待機します。

于 2012-05-23T21:30:35.627 に答える