2011-11-29 5 views
2

나는 Adobe Air 애플리케이션을 작성 중입니다. 사용자는 비디오를 응용 프로그램으로 가져올 수 있지만 응용 프로그램의 특정 부분에 대한 메모리를 절약하기 위해 먼저 이러한 비디오를 .jpg로 축소판으로 변환하고 축소판을 타일 목록에 표시해야합니다. 따라서 이러한 축소판은 런타임 중에 동적으로 생성되어야합니다. 그래서 제 질문은 어떻게 비디오를 미리보기 이미지로 변환 할 수 있는가하는 것입니다. 지금까지 두 가지 방법을 시도했습니다. ImageSnapshot 클래스를 사용해 보았습니다. 그러나 옵션이 아닌 디스플레이 목록에 비디오를 추가 한 경우에만 사용할 수 있습니다. 그래서 BitmapData 클래스를 사용하여 비트 맵 데이터를 그려 보았고 같은 문제가 발생했습니다. 먼저 디스플레이 목록에 비디오를 추가 한 경우에만 작동합니다. 누구든지 화면에 비디오를 추가하지 않고도 비디오 프레임에서 비트 맵 데이터를 가져올 수있는 방법을 알고 있습니까? 현재 사용중인 코드는 다음과 같습니다. 최종 .jpg 파일을 test.jpg 파일로 데스크탑에 씁니다.이 파일은 .mp4 비디오에서만 작동합니다. 당신이 this.AddElement (VD)가, 더 이상 작동 말한다 줄을 가지고가는 경우 :플렉스/액션 스크립트로 비디오 미리보기 이미지 캡처

<?xml version="1.0" encoding="utf-8"?> 
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                xmlns:s="library://ns.adobe.com/flex/spark" 
                xmlns:mx="library://ns.adobe.com/flex/mx"> 

      <fx:Script> 
        <![CDATA[ 
           import mx.graphics.ImageSnapshot; 
           import mx.graphics.codec.JPEGEncoder; 

           import spark.components.VideoDisplay; 
           import spark.primitives.BitmapImage; 
           private const acceptableTypes:FileFilter = new FileFilter("Media", "*.mp4"); 
           private var vd:VideoDisplay; 

           protected function importVideo(event:MouseEvent):void 
           { 
             var file:File = File.userDirectory; 
             file.addEventListener(Event.SELECT, mediaSelectHandler); 
             file.browseForOpen("Select File To Import", [acceptableTypes]); 
           } 

           private function mediaSelectHandler(event:Event):void { 
             vd = new VideoDisplay(); 
             vd.autoPlay = false; 
             vd.horizontalCenter = 0; 
             vd.verticalCenter = 0; 
             vd.source = event.currentTarget.nativePath; 
             this.addElement(vd); 
           } 

           private function getSnapShot(event:MouseEvent):void{ 
             var bd:BitmapData = new BitmapData(vd.width, vd.height); 
             var matrix:Matrix = new Matrix(); 
             bd.draw(vd, matrix); 

             //save to hard drive 
             var file:File = File.desktopDirectory; 
             var imgfile:File = file.resolvePath("test.jpg"); 
             var jpegEncoder:JPEGEncoder = new JPEGEncoder(90); 
             var jpegStream:ByteArray = jpegEncoder.encode(bd); 
             var filestream:FileStream = new FileStream(); 
             filestream.open(imgfile, FileMode.WRITE); 
             filestream.writeBytes(jpegStream, 0, jpegStream.length); 
             filestream.close(); 
           } 
        ]]> 
      </fx:Script> 

      <fx:Declarations> 
        <!-- Place non-visual elements (e.g., services, value objects) here --> 
      </fx:Declarations> 
      <s:HGroup width="500" height="40" horizontalCenter="0" bottom="50"> 
        <s:Button width="100" height="28" label="IMPORT" click="importVideo(event)"/> 
        <s:Button width="100" height="28" label="SNAPSHOT" click="getSnapShot(event)"/> 
      </s:HGroup> 
</s:WindowedApplication> 
+0

질문 제목을 모두 대문자로 쓰지 마십시오. –

답변

0

당신은 그것을 위해는 FFmpeg 유틸리티를 사용해야 할 수도 있습니다 및 솔루션은 다음 단계로 이동 될 수 있습니다. 예 : 당신은 10 분 비디오를 업로드합니다. 1 분부터 1 분 간격으로 10 개의 스냅 샷을 찍을 수 있습니다. 이렇게하면 일련의 비디오 스냅 샷을 얻을 수 있습니다. 또한 구성 요소를 타임 라인으로 구현하고 롤오버에서 관련 스냅 샷을 표시 할 수 있습니다. 당신은 비디오 웹 사이트에서 이것을 보았을 것입니다.

관련 문제