2011-11-29 13 views
2

私はAdobe Airアプリケーションを作成しています。ユーザーはビデオをアプリケーションに読み込むことができますが、アプリケーションの特定の部分のメモリを節約するために、これらのビデオを最初にサムネイル.jpgに変換し、サムネイルのみをタイルリストに表示する必要があります。したがって、これらのサムネイルは実行時に動的に生成する必要があります。だから私の質問は、どのようにサムネイルにビデオを変換することができますです。これまでのところ、2つの方法を試しました。 ImageSnapshotクラスを使用しましたが、これはオプションではない最初に表示リストにビデオを追加した場合のみです。そこで、私はBitmapDataクラスを使ってビットマップデータを描画しようとしましたが、同じ問題が発生しました。最初に表示リストにビデオを追加した場合にのみ動作します。誰もが最初に画面にビデオを追加せずにビデオのフレームからビットマップデータを取得する方法を知っていますか?ここで私が今使っているコードは、最終的な.jpgをtest.jpgとしてデスクトップに書き、.mp4ビデオでのみ動作します。あなたはthis.AddElementは(VD)という行を取り出した場合、それはもはや機能しません:Flex/Actionscriptでビデオサムネイルを取得

<?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枚のスナップショットを取ることができます。これはあなたにビデオの一連のスナップショットを与えるでしょう。また、コンポーネントをタイムラインとして実装し、ロールオーバーで関連するスナップショットを表示することもできます。あなたはビデオのウェブサイトでこれを見たかもしれません。

関連する問題