Обновите фото в флекс не мигая - PullRequest
0 голосов
/ 27 октября 2011

Я пытаюсь смоделировать живое изображение с помощью камеры canon.

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

Проблема не в получении изображения , проблема в том, что когда язагрузить новое изображение, используя что-то вроде :

image.source = my_new_image;

новое изображение загружено, но оно производит короткое белое миганиеи это портит видео ...

Так что я хотел бы знать, есть ли способ обновить изображение на Flex, избегая проблемы с миганием, или я мог бы сделать потоковое видеоиз Java и забрать его с flex ...

Заранее спасибо !!!

1 Ответ

3 голосов
/ 27 октября 2011

Самый простой способ - использовать технику под названием double buffering, используя два Loaders - один для изображения, которое является видимым, и один для изображения, которое загружается и невидимо. Когда изображение завершило загрузку, оно становится видимым, а другое становится невидимым, и процесс повторяется.

С точки зрения эффективности, было бы лучше, по крайней мере, использовать сокетное соединение с сервером для передачи байтов изображения, предпочтительно в формате AMF, поскольку оно имеет незначительные накладные расходы. Это все вполне возможно в BlazeDS с некоторыми сценариями.

Для повышения эффективности вы можете попробовать использовать в режиме реального времени фрейм или видеокодер на сервере, однако декодирование видео на клиенте будет сложной задачей. Для лучшей производительности будет лучше использовать встроенный видеодекодер и потоковый сервер, такой как Flash Media Server.

ОБНОВЛЕНИЕ (пример сценария):

В этом примере загружаются изображения по HTTP. Более эффективный подход - использовать сокет AMF (упомянутый выше) для передачи изображения, а затем использовать Loader.loadBytes () для его отображения.

private var loaderA:Loader;
private var loaderB:Loader;
private var foregroundLoader:Loader;
private var backgroundLoader:Loader;

public function Main()
{       
    loaderA = new Loader();
    loaderB = new Loader();
    foregroundLoader = loaderA;
    backgroundLoader = loaderB;

    loadNext();
}

private function loadNext():void
{
    trace("loading");
    backgroundLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderCompleteHandler);
    backgroundLoader.load(new URLRequest("http://www.phpjunkyard.com/randim/randim.php?type=1"));
}

private function loaderCompleteHandler(event:Event):void
{
    trace("loaded");

    var loaderInfo:LoaderInfo = event.target as LoaderInfo;
    var loader:Loader = loaderInfo.loader;
    loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, loaderCompleteHandler);

    if (contains(foregroundLoader))
        removeChild(foregroundLoader);

    var temp:Loader = foregroundLoader;
    foregroundLoader = backgroundLoader;
    backgroundLoader = temp;

    addChild(foregroundLoader);

    loadNext();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...