Я пишу приложение Adobe Air. Пользователи смогут импортировать видео в приложение, но чтобы сэкономить память для определенных частей приложения, мне необходимо сначала преобразовать эти видео в миниатюры .jpgs и отображать только миниатюры в списке листов. Поэтому эти эскизы должны генерироваться динамически во время выполнения. Итак, мой вопрос, как я могу конвертировать видео в миниатюру. До сих пор я пробовал два разных метода. Я использовал класс ImageSnapshot, который я получил, но ТОЛЬКО если я сначала добавил видео в список отображения, что невозможно. Затем я попытался нарисовать растровые данные с помощью класса BitmapData и столкнулся с той же проблемой. Это будет работать, только если я сначала добавлю видео в список отображения. Кто-нибудь знает, как я могу получить растровые данные из кадра видео без предварительного добавления видео на экран? Вот код, который я сейчас использую, он записывает окончательный файл .jpg на ваш рабочий стол как test.jpg и работает только с видео .mp4. Если вы удалите строку, которая говорит это. 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>