Искать точку воспроизведения в определенном месте во Flash Video? - PullRequest
3 голосов
/ 22 декабря 2011

Если вы загружаете компонент FLVPlayback во Flash или VideoDisplay во Flex и пытаетесь выполнить поиск в определенном месте или задаете playheadTime в определенном месте, фильм всегда округляется в большую или меньшую сторону

Впрошить, перетащить компонент 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

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

<?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

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

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

1 Ответ

6 голосов
/ 22 декабря 2011

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

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

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

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

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

...