2011-12-21 8 views
3

Если вы загрузите компонент FLVPlayback в Flash, или VideoDisplay в Flex и пытаться искать в определенное место или установить playheadTime в определенное место, фильм всегда округляет вверх или вниз по очень большим количествамИщите точку воспроизведения в определенном месте в Flash Video?

В вспышке, скребковые компонент FLVPlayback для каскадирования и установки источника на http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/controls/examples/assets/phone.flv Затем попробуйте использовать video.seek (6) или video.playheadTime = 6;

Это просто Гото 10. Точно так же, если вы используете их построили в скруббере только интервалы 0, 5 или 10. Таким образом, в большинстве скребущего кадра вы видите 3

Вот пример прогибается с тот же результат.

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:media="com.synapsegroup.media.*"> 

    <mx:Script> 
     <![CDATA[ 
      import mx.events.MetadataEvent; 
      import mx.events.SliderEvent; 
      import mx.events.VideoEvent; 

      protected function scrubber_changeHandler(event:SliderEvent):void 
      {    
       trace(event.value); 
       video.playheadTime = event.value; 
      } 

      protected function video_playheadUpdateHandler(event:mx.events.VideoEvent):void 
      {    
       //scrubber.value = event.playheadTime; 
       //http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/controls/examples/assets/phone.flv 
      } 

     ]]> 
    </mx:Script> 

    <mx:Panel> 
     <mx:VideoDisplay id="video" source="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/controls/examples/assets/phone.flv" minWidth="200" minHeight="200" 
         autoPlay="false" 
         /> 
     <mx:ControlBar> 
      <mx:Button label="Play" click="video.play();"/> 
      <mx:Button label="Stop" click="video.pause();"/> 
      <mx:HSlider liveDragging="true" id="scrubber" minimum="0" maximum="11.5" change="scrubber_changeHandler(event)" thumbPress="video.pause();"/> 
     </mx:ControlBar> 
    </mx:Panel> 

</mx:Application> 

В обоих случаях, если нажать воспроизведение/пауза достаточно быстро, вы можете остановиться на отдельных кадрах с гораздо большей детализацией, но это еще не хороший UX

Есть ли что-то я не хватает, чтобы сделать это программно ?

Я бы также сказать, что изменения интервала в зависимости от длины видео, то, что было 3minutes давно 10-секундные интервалы

ответ

6

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

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

Чтобы иметь видео, которое может останавливаться и искать какой-либо фрейм, вы должны закодировать его с расстоянием ключевого кадра. Попробуйте это, и вы увидите, что размер файла - enourmouse, но теперь вы можете заставить его играть плавно назад.

Что касается кустарника, который неточен в поиске, да. Это. Это своего рода неряшливо. Бу и все это. Но вам нужно сделать компромисс между рассказом игроку о том, чтобы искать на каждом движке мыши, что могло бы заглушить игрока, когда он вычисляет кефру плюс дельту для каждого движения мыши, и фактически может перетащить панель.

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

+0

спасибо за понимание – chrisan