Захват миниатюры видео в Flex / Actionscript - PullRequest
2 голосов
/ 29 ноября 2011

Я пишу приложение 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>

1 Ответ

0 голосов
/ 06 февраля 2012

Для этого вам может понадобиться утилита ffmpeg, и решение может быть принято на следующем уровнеНапример, вы загружаете 10-минутное видео.Вы можете сделать 10 снимков, начиная с 1-й минуты и с интервалом в 1 минуту.Это даст вам серию снимков видео.И вы можете реализовать компонент в виде временной шкалы и при наведении курсора показать соответствующий снимок.Возможно, вы видели это на видео сайтах.

...