Netstream и step () или seek ()? - PullRequest
       63

Netstream и step () или seek ()?

3 голосов
/ 20 февраля 2012

Я нахожусь на проекте AS3, играю видео (H264).Я хочу по каким-то особым причинам перейти на определенную должность.

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

  • это определенно не мой любимый способ, потому что я не хочуперекодировать все видео.

б) Я пытаюсь сделать это с помощью NetStream.step ().Это должно дать мне возможность медленно переходить от кадра к кадру.Но в документации сказано:

Этот метод доступен только при потоковой передаче данных с Flash Media Server 3.5.3 или более поздней версии, а также когда NetStream.inBufferSeek имеет значение true.

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/NetStream.html#step()

Означает ли это, что это невозможно с Air for Desktop?Когда я пробую, ничего не работает.

Есть предложения, как решить эту проблему?

Привет и спасибо!Николя

Ответы [ 3 ]

1 голос
/ 23 января 2013

Я заметил, что флеш-плеер 9 чистит красиво и плавно, но в плеерах 10+ у меня возникает эта проблема без скрабов.

Мое исправление состояло в том, чтобы ограничить частоту обращений к функции поиска до <= 200 мс,Эта исправленная очистка, но гораздо менее плавная, чем у плеера 9. Возможно, из-за ограничения «Flash-видео может быть продлено только за секунды»?Я использовал таймер для переключения функции, которая вызывает seek () для видео. </p>

    private var scrubInterval:Timer = new Timer(200);

    private function  videoScrubberTouch():void {
        _ns.pause();

        var bounds:Rectangle = new Rectangle(0,0,340,0);

        scrubInterval.addEventListener(TimerEvent.TIMER, scrubTimeline);
        scrubInterval.start();

        videoThumb.startDrag(false, bounds);


    }
    private function  scrubTimeline(e:TimerEvent):void {
        var amt:Number = Math.floor((videoThumb.x / 340) * duration);
        trace("SCRUB duration: "+duration+" videoThumb.x: "+videoThumb.x+" amt "+amt);

        _ns.seek(amt);

    }
1 голос
/ 29 февраля 2012

Flash-видео может продвигаться только за секунды, если у вас нет Flash Media Server, на котором размещено ваше видео.Технически это означает, что вы можете заставить его работать так, как задумано в Air, однако видео должно быть потоковым (глупый Adobe ...).

У вас есть два варианта:

1) Импортируйте отснятый материал как видеоклип.В Flash IDE есть мастер для этого, и если вы разрабатываете исключительно в среде, отличной от FlashIDE, вы можете конвертировать и экспортировать как внешний ресурс, такой как SWF или SWC.Затем он будет встроен или загружен во время выполнения в ваше приложение, предоставляя вам доступ к пошаговым методам MovieClip для каждого кадра.Это, однако, имеет некоторые проблемы с синхронизацией звука (iirc).Кроме того, очистка в обратном направлении - не удача для MC.

2) Напишите собственный видеообъект, который загружает последовательность изображений и отображает каждый кадр по порядку.Вам придется настроить свои собственные возможности синхронизации звука, но это может быть самое прямое решение, кроме FLVComponent или NetStream.

0 голосов
/ 20 мая 2014

Проверьте эту демонстрационную ссылку (или получите SWF-файл для тестирования вне браузера через настольный Flash Player).
Примечание: Для демонстрации требуется FLV с видеокодеком H.264 и аудиокодеком AAC или MP3.

Исходный код для этого здесь: Github ссылка

В вышеприведенной демонстрации есть (основанный на байтах) поиск и покадровый пошаговый переход. Функции, которые вы хотите изучить, в основном:

  • Append_SEEK (сумма позиции) - эта информация будет указана в байтах и ​​будет выполняться поиск ближайшего доступного ключевого кадра.

  • get_frame_TAG - это извлечет тег, содержащий один кадр данных. Звук также может быть в кадрах, но давайте предположим, что у вас есть только видео. Эта функция - ваша возможность настроить отметки времени . При запуске он также добавляет тег (так что каждый get_frame_TAG также является «шагом кадра»).

Например: у вас есть видео со скоростью 25 кадров в секунду, вы хотите, чтобы третий кадр воспроизводился через 4 секунды ...

1000 милисек / 25 кадров в секунду = 40 единиц для каждой временной метки.
4000 мс == 4 секунды + добавьте 40 х 3-й кадр == ожидаемая временная метка 4120.

Итак, получить этот кадр означает ... Сначала найдите ключевой кадр. Затем пройдитесь по каждому кадру, проверяя временные метки, которые представляют нужный вам кадр. Если это не так, измените его на то же, что и у самой последней отметки времени ключевого кадра (это заставляет Flash выполнять быструю перемотку вперед по всем кадрам, чтобы синхронизировать данные, поскольку предполагается, что кадр [с меньшей, чем ожидалось, отметкой времени] должен был воспроизводиться к этому времени) , Вы можете «спрятать» видеообъект во время этого процесса, если вам не нравится внешний вид ускоренной перемотки.

...