2009-02-02 5 views
6

Я использую VideoDisplay для воспроизведения flv, mov и mp4, и все отлично работает. Все они загружаются с помощью прогрессивной загрузки и не передаются потоком. То, что я хотел бы сделать, - захватить один указанный фрейм (например, все, что отображается на метке 10 секунд), преобразовать его в растровое изображение и использовать это растровое изображение в качестве изображения предварительного просмотра для видео. Я бы хотел сделать это во время выполнения, поэтому мне не нужно создавать предварительный образ для каждого видео, которое будет показано.Flex: динамически создайте изображение для предварительного просмотра

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

ответ

2

Райан и Джеймс верны - верный путь, вероятно, для извлечения кадров при загрузке/перекодировке. Но если это не вариант, вы можете выбрать какой-либо образ по умолчанию/местозаполнитель вашего собственного (что-то общее или как-то подходящее для всех видео, большие пальцы которых еще не были захвачены) и просто использовать DisplayObject-версию 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)" /> 

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

+0

Я закончил тем, что делал что-то очень похожее на это (я, вероятно, должен был предусмотреть, что приложение должно работать автономно, поэтому я не имею простого доступа к серверу большую часть времени), но я закончил кодирование взлом, который включал загрузку видео и приостановку его в нужном мне кадре. Благодаря! – onekidney

+0

Удивительный, рад, что это помогло. –

1

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

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

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

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

-1

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

Смежные вопросы