apache-flexflex4adobescreenshotvideodisplay

How to take screenshots of a Flex Spark VideoDisplay?


I want to build a component, where the user can play a video in a Flex Spark VideoDisplay. There will be a button and whenever the button is pressed, I want to save the current time of the VideoDisplay plus a screenshot. The screenshot needs to be someway saved, because I want to display all times and screenshots in a DataGrid (screenshots should appear when the user hovers a time in the DataGrid).

So, how can I take screenshots of the Spark VideoDisplay and save/display them?


Solution

  • You can take snapshots a few ways, this way just uses the ImageSnapshot class, but you could do it by manually drawing the bitmap of the video display if you'd like. Here's a sample:

    Renderer

    <?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>
    

    Sample App

    <?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>
    

    To accomplish exactly what you were describing (take snapshot and save snapshot), you could store those in an array in that takeSnapshot method, or you could loop through the list.dataProvider do get the bitmaps. Then you'd just need to pass them to a backend language (ruby, python, php...) to save.

    Hope that helps, Lance