1

ユーザーが Flex Spark VideoDisplay でビデオを再生できるコンポーネントを構築したいと考えています。ボタンがあり、ボタンが押されるたびに、VideoDisplay の現在の時刻とスクリーンショットを保存したいと考えています。すべての時間とスクリーンショットを DataGrid に表示したいので、スクリーンショットを何らかの方法で保存する必要があります (ユーザーが DataGrid で時間をホバーすると、スクリーンショットが表示されるはずです)。

では、Spark VideoDisplay のスクリーンショットを取得して保存/表示するにはどうすればよいですか?

4

2 に答える 2

3

スナップショットはいくつかの方法で取得できます。この方法では ImageSnapshot クラスを使用するだけですが、必要に応じてビデオ ディスプレイのビットマップを手動で描画することもできます。サンプルは次のとおりです。

レンダラー

<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer 
    xmlns:fx="http://ns.adobe.com/mxml/2009"
    xmlns:s="library://ns.adobe.com/flex/spark"
    xmlns:mx="library://ns.adobe.com/flex/mx"
    width="100" height="100" creationComplete="trace(data)">

    <mx:Image source="{this.data}" width="100%" height="100%"/>

</s:ItemRenderer>

サンプルアプリ

<?xml version="1.0" encoding="utf-8"?>
<s:Application 
    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;

            public function takeSnapshot():void
            {
                var snapshot:BitmapData = ImageSnapshot.captureBitmapData(videoDisplay);
                var bitmap:Bitmap = new Bitmap(snapshot);
                list.dataProvider.addItem(bitmap);
            }
        ]]>
    </fx:Script>

    <s:layout>
        <s:VerticalLayout horizontalAlign="center"/>
    </s:layout>

    <s:VideoDisplay id="videoDisplay"
        source="video.mov"
        width="400" height="300"/>

    <s:Button id="button" click="takeSnapshot()"/>

    <s:List id="list" horizontalCenter="0" width="100%" itemRenderer="SnapshotRenderer">
        <s:dataProvider>
            <mx:ArrayList/>
        </s:dataProvider>
        <s:layout>
            <s:TileLayout/>
        </s:layout>
    </s:List>
</s:Application>

説明したことを正確に達成するには (スナップショットを取得してスナップショットを保存する)、それらをそのtakeSnapshotメソッドの配列に格納するか、ループしてlist.dataProviderビットマップを取得することができます。次に、それらをバックエンド言語 (ruby、python、php...) に渡して保存するだけです。

お役に立てば幸いです、ランス

于 2010-03-02T10:12:40.860 に答える
1

flex で JPEGEncoder を使用してバイト配列に変換し、次のように b64encoder を使用してバイト配列をエンコードします。

var jpg:JPEGEncoder = new JPEGEncoder();
var ba:ByteArray = jpg.encode(bitmapData);        

var b64encoder:Base64Encoder = new Base64Encoder();
b64encoder.encodeBytes(ba);
var b64String:String = b64encoder.flush();

これで、HTTP post メソッドを介して b64String をサーバーに渡すことができます:)

于 2010-10-20T03:17:46.187 に答える