The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
import flash.net.*;
import flash.events.*;
import flash.media.*;

private var nc:NetConnection;
private var ns:NetStream;

private function init():void {
    nc = new NetConnection();
    nc.addEventListener(NetStatusEvent.NET_STATUS, status_handler);
    nc.objectEncoding = ObjectEncoding.AMF0;
    nc.client = this;
    nc.connect("rtmp:/stream/rec");
}

private function status_handler(event:NetStatusEvent):void {
    switch (event.info.code) {
    case "NetConnection.Connect.Success":
        setStatus("Connected.");
        break;
    default:
        setStatus(event.info.code);
    }
}

private function setStatus(text:String):void {
    status.text = text;
}

private function start_publish():void {
    var channel_name:String = input.text;
    if (!channel_name) return;

    ns = new NetStream(nc);
    ns.addEventListener(NetStatusEvent.NET_STATUS, status_handler);

    var camera:Camera = Camera.getCamera();
    if (!camera) {
        setStatus("No camera found");
        return;
    }

    var mic:Microphone = Microphone.getMicrophone();
    if (!mic) {
        setStatus("No mic found");
        return;
    }

    publish_button.enabled = false;
    start_button.enabled = true;
    stop_button.enabled = true;

    // set quality
    camera.setMode(320, 240, 30);
    camera.setQuality(0, 80);
    mic.setSilenceLevel(0);
    mic.rate = 22;

    video.attachCamera(camera);

    ns.attachCamera(camera);
    ns.attachAudio(mic);
    ns.publish(channel_name, "live");
}

public function record_start():void {
    nc.call("record", new Responder(function():void {}), "start");
}

public function record_stop():void {
    nc.call("record", new Responder(function():void {}), "stop");
}