Flex: динамическое создание предварительного изображения для видео - PullRequest
6 голосов
/ 02 февраля 2009

Я использую VideoDisplay для воспроизведения FLV, MOV и MP4, и все работает отлично. Все они загружаются через прогрессивную загрузку и не транслируются. То, что я хотел бы сделать, это захватить один указанный кадр (например, все, что отображается на 10-секундной отметке), преобразовать его в растровое изображение и использовать этот растровый рисунок в качестве изображения предварительного просмотра для видео. Я хотел бы сделать это во время выполнения, поэтому мне не нужно создавать предварительное изображение для каждого видео, которое будет показано.

Есть идеи, как это сделать? Я бы предпочел не подделывать его, воспроизводя его - ища этот конкретный кадр, а затем приостанавливая его, но у меня может не быть другого выбора?

Ответы [ 3 ]

2 голосов
/ 03 февраля 2009

Райан и Джеймс правы - возможно, правильный путь - извлекать кадры во время загрузки / транскодирования. Но если это не вариант, вы можете выбрать свое собственное изображение по умолчанию / местозаполнителя (что-то общее или подходящее для всех видео, большие пальцы которых еще не были захвачены), и просто использовать DisplayObject-ness VideoDisplay, чтобы захватите, а затем загрузите фрейм на свой сервер, например:

<mx:Script>
    <![CDATA[

        var captured:Boolean;

        private function creationCompleteHandler(event:Event):void
        {
            videoDisplay.source = "http://yourserver/yourvideo.flv";
        }

        private function videoDisplay_playheadUpdate(event:VideoEvent):void
        {
            if (!captured && videoDisplay.playheadTime >= 10)
                capture();
        }

        private function capture():void
        {
            var bmpData:BitmapData = new BitmapData(videoDisplay.width, videoDisplay.height);
            bmpData.draw(videoDisplay);

            captured = true;

            // Now just upload the byte array to your server for the next user
            var loader:URLLoader = new URLLoader();
            loader.dataFormat = URLLoaderDataFormat.BINARY;

            // ... etc.
        }

    ]]>
</mx:Script>

<mx:VideoDisplay id="videoDisplay" playheadUpdate="videoDisplay_playheadUpdate(event)" />

Опять же, это, возможно, не самое элегантное решение, но оно, безусловно, работает. Таким образом, первый пользователь видит общее изображение, но каждый пользователь после этого получает сгенерированный эскиз. (Что, конечно, вы уже загрузили и правильно связали к тому времени.) Имеет смысл?

1 голос
/ 02 февраля 2009

Я почти уверен, что это невозможно. Это вполне может быть ... но так не думаю. Я думаю, что единственный способ загрузить видео - это использовать объекты NetStream и NetConnection, которые, как вы знаете, только начинают загрузку видео.

Если это видео, сгенерированное пользователем, я думаю, что лучше всего иметь какой-нибудь более серьезный сценарий, который генерирует изображение для предварительного просмотра. Не представляю, как это делается, но думаю, что так работает большинство клип-сайтов.

Если все видео находятся под вашим контролем, возможно, можно написать сценарий для одной из программ редактирования видео, чтобы автоматизировать создание изображения для определенного кадра из списка файлов. Я думаю, что это, вероятно, ваш лучший маршрут в качестве альтернативы, который вы могли бы быстро запустить и запустить.

Извините за расплывчатый ответ ... он может указать вам верное направление, если вам нужно быстрое решение.

0 голосов
/ 02 февраля 2009

Я согласен с Джеймсом, единственный способ действительно сделать это - сделать это с помощью серверного сценария и извлечь определенные кадры из видео. Даже если бы вы могли сделать это с помощью flex, вы бы на самом деле не хотели возлагать бремя на выполнение этого (которое, я думаю, потребовало бы много процессоров) на клиентском компьютере. Не говоря уже о том, что гораздо эффективнее создать изображение перед рукой, чем использовать flex, чтобы определить миниатюру, которая будет отображаться при каждой загрузке.

...