Как я могу контролировать визуальный эффект с помощью класса Camera? - PullRequest
0 голосов
/ 01 августа 2010

Я проверил документ:

http://help.adobe.com/en_US/AS3LCR/Flash_10.0/flash/media/Camera.html

Но все еще не могу найти информацию о том, как контролировать визуальный эффект (например, яркость, насыщенность и т. Д.) Моегокамера для ПК.

Возможна ли такая работа с ActionScript?

Ответы [ 2 ]

1 голос
/ 01 августа 2010

Вы не можете изменять фактические данные камеры (есть разница между этим и тем, что я описываю далее), но можно легко делать то, что вы хотите, после присоединения объекта камеры к объекту видео и использования разнообразия.фильтров преобразования и подпрограмм из других собственных классов ActionScript, таких как ColorTransform, DisplayObject.transform.colorTransform и DisplayObject.filters, для изменения того, что отображается на экране / в памяти, что, я полагаю, в любом случае, вероятно, вам и нужно.

Чтобы дать вам пример использования в реальном мире, вы можете настроить насыщенность данных камеры, отображаемых в вашем видео, с помощью следующего кода:

/// Desaturate displayed image completely
video.filters = [ new ColorMatrixFilter(saturation_filter_matrix(0)) ];

, где я определил методы как:

static inline var RWGT = 0.3086;
static inline var GWGT = 0.6094;
static inline var BWGT = 0.0820;

static public function brightness_filter_matrix(b: Float)
{
    return [    b, 0, 0, 0, 0,
                0, b, 0, 0, 0,
                0, 0, b, 0, 0,
                0, 0, 0, 1, 0 ];
}

static public function saturation_filter_matrix(s: Float)
{
    var b = (1 - s) * RWGT;
    var a = b + s;
    var d = (1 - s) * GWGT;
    var e = d + s;
    var g = (1 - s) * BWGT;
    var i = g + s;

    return [    a, d, g, 0, 0,
                b, e, g, 0, 0,
                b, d, i, 0, 0,
                0, 0, 0, 1, 0 ];
}

static public function contrast_filter_matrix(v: Float)
{
    v += 1;

    var r = v;
    var g = v;
    var b = v;

    return [    r, 0, 0, 0, 128 * (1 - r),
                0, g, 0, 0, 128 * (1 - g),
                0, 0, b, 0, 128 * (1 - b),
                0, 0, 0, 1, 0 ];
}

Я также думаю, что transform.colorTransform может быть более эффективным при выполнении той же работы, так как я заметил, что фильтры имеют тенденцию облагать Adobe Flash Player налогом от средней до высокой степени, поэтому имейте в виду.

Следствием того факта, что вы не можете изменить фактический вход камеры, является то, что, когда вы публикуете свою камеру по сети (на Fнапример, Media Server), независимо от того, какие эффекты вы используете для отображения данных в своем собственном видеообъекте, сторона, воспроизводящая поток, увидит исходные неизмененные данные.«Обходное решение» - объявить принимающей стороне точные параметры, которые вы хотите, чтобы они применили к своему видеообъекту, воспроизводящему поток.Предполагая, что они применяют эти параметры так же, как вы применяете их к отображаемому изображению с камеры, они будут видеть изображение с вашей камеры так, как вы его видите.

Примечание: Код написан на Haxe,но два языка очень похожи.Необходимо помнить об изменениях (например, явная реклама для Haxe :-) Float в Haxe - это Number в ActionScript 3, а Haxe использует вывод типов, который позволяет опускать типы переменных по желанию, позволяяHaxe разберись сам (когда вы добавляете два int, что вы получаете? На платформе Flash вы всегда получаете также int.) Также в AS3 нет концепции встраивания (пока?) И т. Д.Вы должны просто удалить синтаксис inline из кода, вот и все.

0 голосов
/ 01 августа 2010

В ответ на ваш комментарий относительно прямого доступа к данным камеры, единственная область, о которой я могу подумать, где это может быть проблемой, - это запись в FMS (флэш-медиа-сервер, Red5, wowza и т. Д.), И в этом случаеданные поступают прямо из камеры и попадают в netstream (netStream.attachCamera(cam)).Для этого не существует прямого обходного пути, вы можете сохранить настройки яркости и контрастности (из эффекта фильтра) в виде метаданных flv при публикации / потоковой передаче видео, но тогда человеку на другом конце придется декодировать эти метаданные (т.е.воспроизведение с использованием компонента Flash или что-то, что может декодировать данные AMF), для этого см. метод setDataFrame NetConnection

. Для всего остального вы можете использовать методы, предложенные выше, взять камеру, засунуть ее вVideo экземпляр с video.attachCamera, а затем используйте video.filters = [myFilter], чтобы применить желаемый эффект.Если вы хотите разбираться с пикселями, вы можете использовать свойство draw объекта BitmapData, чтобы нарисовать изображение камеры из видео на растровом изображении для манипуляции, однако вы должны сделать это на enterFrame илиTimer для синхронизации bitmapData.

var video:Video = new Video(w,h);
video.attachCamera(Camera.getCamera());
var bmd:BitmapData = new BitmapData(w,h);
bmd.draw(video);

Надеюсь, это поможет

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