среда, 26 декабря 2007 г.

Video. Camera. NetStream. Настройка

Посмотрим, что же изменилось в тройке по работе с вебкамерой?

Создаю два файла в ТоталКомандере (Shift+F4) try_Camera_and_NetConnection.fla, затем Alt+F4 затем навожу рамку выбора на уже созданный файл, снова Shift+F4, нужно только в поле ввода имени файла автоматически подставляется имя выбранного файла, поэтому чтобы создать файл с таким же именем, но расширением .as нужно исправить только расширение.
Есть два пустых файла: try_Camera_and_NetConnection.fla и Try_Camera_and_NetConnection.as. Жму на первый запускается Flash CS3, второй перетаскиваю во FlashDevelop. Во флэше пишу в поле Document Class: Try_Camera_and_NetConnection. Все. Можно писать код.

Наверняка не самый "прямой" способ -), но, надеюсь, и не самый корявый. Делайте скидку на то что многие флешеры не программисты изначально.

В файле .as пишу шапку. Множно конечно сгенерить ее, но пока мне доставляет удовольствие писать все ручками (используя подсказки редактора - кайф!). Еще заметил, что как только начинаю копипастить, то появляются ошибки которые долго искать. Для себя решил что буду писать все руками, пусть это медленне, но экономится много времени на меньшем количестве ошибок. Да и чувство какое-то от такого кода другое... большего контроля, что ли.

Итак шапка:

package {
public class Try_Camera_and_NetConnection extends Sprite {
import flash.display.Sprite;
public function Try_Camera_and_NetConnection() {

}
}
}


Создаю объект Camera:

package {
import flash.display.Sprite;
import flash.media.Camera;
public class Try_Camera_and_NetConnection extends Sprite {

private var cam:Camera;

public function Try_Camera_and_NetConnection() {
this.cam = new Camera.getCamera();
}
}
}

Ага, непривычно, раньше было просто Camera.get();

Добавлю два экзэмпляра класса Video. В одном будет видео с камеры, в другом поток с Red5 сервера.

private var cameraVideo:Video;
private var inVideo:Video;
...
this.cameraVideo = new Video(160,120);
addChild(cameraVideo);


* * *

Принцип понятен, опустим несколько шагов. Вот результат:

package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.MouseEvent;
import flash.events.NetStatusEvent;
import flash.events.SecurityErrorEvent;
import flash.media.Camera;
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;


public class Try_Camera_and_NetConnection extends Sprite {

private var nc:NetConnection;
private var txt:TextField;
private var cameraVideo:Video;
private var inVideo:Video;
private var cam:Camera;

private var outNS:NetStream;
private var inNS:NetStream;

function Try_Camera_and_NetConnection() {
this.nc = new NetConnection();
this.nc.connect("rtmp://127.0.0.1:1935/SOSample");
this.nc.addEventListener(NetStatusEvent.NET_STATUS, onStatus);

txt = new TextField();
txt.autoSize = TextFieldAutoSize.CENTER;
txt.x = 100;
txt.y = 100;
addChild(txt);

this.cam = Camera.getCamera();

cam.setQuality(6000, 90);
cam.setMode(320, 240, 15);

this.cameraVideo = new Video(160,120);
addChild(cameraVideo);
cameraVideo.attachCamera(cam);

}

private function onStatus(e:NetStatusEvent) {
trace(e.info.code);
txt.text = e.info.code;
this.outNS = new NetStream(this.nc);
this.outNS.attachCamera(cam);
this.outNS.publish("first", "live");

this.inNS = new NetStream(nc);
this.inNS.play("first");

this.inVideo = new Video(32,240);
addChild(inVideo);
inVideo.x = 320;
inVideo.attachNetStream(inNS);
inVideo.width = 150;
inVideo.height = 150;
}
}
}

Для того чтобы запустить сервер достаточно скачать установить и запустить щелкнув по ярлычку.

Итак, что же получилось? Два видеоокна. В одном видео с камеры, в другом видео с камеры упакованное в видеопоток отпраленное на сервер и снова назад клиенту.

У класса Camera есть два важных метода:

Camera.setMode();
Camera.setQuality();


Продолжение см часть 2. TODO

Комментариев нет: