2011-04-09 5 views
8

Adobe AIR에 로컬 비디오 (관련 서버 없음)를 재생하기 위해 NetStream.appendBytes()를 사용하고 있습니다. 나는 비디오 출력의 사진을 찍을 BitmapData.draw()를 사용하려면,하지만 난이 오류가 무엇입니까 것 : 여기NetStream.appendBytes에서 BitmapData.draw를 어떻게 사용할 수 있습니까?

Error #2123: Security sandbox violation: BitmapData.draw: cannot access null. No policy files granted access.

하는 몇 가지 예제 코드입니다 :

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 기능을 사용할 수 없습니까?

+0

나는 정확히 같은 배입니다. urlstream 객체를 사용하여 데이터를 가져 와서 원하는 바일을 로컬, 헤더로 추가 ... 모든 성공했지만, 시도하기 전에. 본질적으로 발에 자신을 쐈다. 문제를 극복 할 수 있었습니까, 아니면 원격 서버로이를 수행하는 방법에 대한 생각이 있습니까? 현재 FMS 4.5를 풀어서 문제가 해결되는지 확인하고 있습니다. 문서는 또한 플래시 액세스의 방향으로 가리 킵니다. – stat

+0

아주 긴 밤 이후에, 나는 단순히 Http Dynamic Streaming (HDS)에서 appendBytes() 메서드를 사용하여 픽셀을 수행 할 수있는 방법이 없다는 것을 발견했습니다 디코딩 된 비디오에 대한 레벨 조작. 한 가지 가능성은 f4f 파일에 보조 바이트 스트림을 해킹하는 것입니다.하지만 실제로 수행되는 검사와 AVM이 appendBytes 스트리밍 모델의 모든 정책 플래그를 무시하는 경우에 따라 달라집니다. – stat

+0

이? 나는 같은 문제에 직면 해있다. – WesleyJohnson

답변

0

play() 기능을 호출하기 전에 NetStream.checkPolicyFile = true을 사용해보십시오. 이처럼

:

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

무엇 checkPolicyFile 플래그가하는 일은이로드 된 SWF의 서버에서 정책 파일을로드 할 호스트 SWF를 알 수 있다는 것입니다. 로딩 할 때 해당 플래그를 지정하지 않은 경우로드 된 스트림에서 픽셀 데이터를 BitmapData.draw()을 통해 가져 오려고하면 SecurityError가 표시됩니다. 어도비 자원에

링크하십시오 netstream.appendByte() 내용을 그릴하려고 할 때 http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/NetStream.html#checkPolicyFile

+0

이것은 도움이되지 않습니다. 문제는 서버가 없어서 정책 파일을로드 할 곳이 없다는 것입니다. 파일이 로컬로로드되고 있습니다 (컴퓨터가 오프라인 일 수도 있습니다). – Aaron

+0

좋아, 내 잘못이야. RTMFP를 통해 비디오를 스트리밍하고 있습니까? 이 경우 나는 당신이 흥미를 가질만한 스레드를 발견했다. http://forums.adobe.com/thread/16862 – Tjofras

+0

링크를 제공해 주셔서 감사합니다. 그러나 NetStream.appendBytes 메서드는 flv 형식에서만 작동합니다. 기본적으로 디스크에서 FileStream을 사용하여 flv 파일을 읽은 다음 appendBytes()를 사용하여 바이트를 NetStream으로 전송합니다. – Aaron

0

나는 해결책을했습니다는 샌드 박스 오류를 제거합니다.

SWF는 :netstream.play(null)으로 지정된 주소에서 크로스 도메인 파일을 찾고 있기 때문에 샌드 박스를 검색합니다. 그는 존재하지 않는 것을 찾고 있습니다.

음, 십자가 파일에 "netstream.play(http://myserv.com/video.flv)"과 같은 가짜 비디오 URL을 재생 한 다음 appendBytes 함수를 사용하여 원하는 비디오를로드하면됩니다.

SWF가 속임입니다. StreamVideoSampleAccess 또는 StreamAudioSampleAccess라는 서버 측 설정이 true 또는로 설정되어 있지 않으면 소리가 나는만큼 이상한

, 당신은 RTMP 스트림에서 비디오 또는 오디오의 스냅 샷을 할 수

+0

감사합니다. 그러나 오프라인으로 작동하는 솔루션이 필요합니다. 이 방법을 제대로 작동 시키려면 일종의 로컬 서버가 필요할 것입니다. – Aaron

+1

이것은 작동하지 않습니다. 설명서에는 null로 ns.play()를 호출 할 때만 appendBytes()를 호출 할 수 있음이 명확히 명시되어 있습니다. 그렇지 않으면 오류 메시지가 나타납니다. –

0

:-) 나를 위해 작동 이 StreamVideoSampleAccess/StramVideoSampleAccess와 같이 설정하십시오. 나는 FMS 서버 측에 대한 액세스 권한없이이 작업을 수행 할 수있는 방법을 발견하지 못했습니다.

+0

여기에 대한 adobe 설명서 링크 http://help.adobe.com/en_US/FlashMediaServer/3.5_SS_ASD/WS5b3ccc516d4fbf351e63e3d11a11afc95e-7ec3.html#WS5b3ccc516d4fbf351e63e3d11a11afc95e-7fcb – bolnad

+1

이것은 서버의 램프 스트림이 아닙니다. 이 데이터는 사용자 시스템의 로컬 파일에서 가져옵니다. – Aaron

1

또 다른 해결책은 _ns.play(path)을 사용하고 _ns.appendBytes()을 사용하지 않는 것입니다.

+0

사실이지만 내 경우에는 더 이상 바이트에 액세스 할 수 없습니다. – Aaron

+0

이 방법으로도 iOS에서 로컬 비디오를 재생하고 있습니다. 불행히도 나는 여전히 오류가 발생합니다. – Drahcir

0

동영상 개체를 MovieClip에 넣고 비디오 개체 대신 bit.draw(_movieclipInstanceName);을 사용하십시오. 나는 그것이 효과가 있기를 바란다.

-1

로드되지 않은 비디오 나 NetStream 객체가 null 인 경우 BitmapData.draw() 메서드를 호출하는 것처럼 보입니다.

가능한 수정 사항 : NetStream.Buffer가 될 때까지 기다리십시오.

0

나는이 질문이 정말로 오래되었다는 것을 안다. 그러나 나는 아직도 직면 한 문제이며, 다른 사람들도 역시 알고 있다고 생각한다. 그래서 나는 링크를 게시하고 싶다. 다른 Stack 질문에서 Adobe에서 버그를 게시하고 해결 방법을 사용하여 문제를 해결할 수 있습니다. 당신이 파일을 원격 위치에서 오는 있지만했다으로

Workaround for bug on a duplicate Stack Question

관련 문제