Hello List Members,
I am having a hard time with Red5. I am new to Red5 and unable to record the
live stream from my webcam through Flash. I am attaching the code below on
which I am working:
========================= Main.as===============================
// ** AUTO-UI IMPORT STATEMENTS **
import org.red5.utils.Connector;
import org.red5.samples.camrecorder.ThankYou;
import org.red5.samples.camrecorder.Recorder ;
// ** END AUTO-UI IMPORT STATEMENTS **
import com.neoarchaic.ui.Tooltip;
import org.red5.utils.Delegate;
import com.blitzagency.xray.util.XrayLoader;
import com.blitzagency.xray.logger.XrayLog;
import com.acmewebworks.controls.BaseClip;
import com.mosesSupposes.fuse.*;
class org.red5.samples.camrecorder.Main extends BaseClip {
// Constants:
public static var CLASS_REF = org.red5.samples.camrecorder.Main ;
public static var LINKAGE_ID:String = "org.red5.samples.camrecorder.Main";
// Public Properties:
// Private Properties:
var log:XrayLog;
// UI Elements:
// ** AUTO-UI ELEMENTS **
private var connector:Connector;
private var recorder:Recorder;
private var thankYou:ThankYou;
// ** END AUTO-UI ELEMENTS **
// Initialization:
private function Main() {}
private function onLoad():Void
{
fscommand("fullscreen", true);
fscommand("allowscale", false);
mx.styles.StyleManager.registerColorName("special_orange", 0xff9900);
_global.style.setStyle ("themeColor", "special_orange");
_global.style.setStyle("fontFamily", "_sans");
_global.style.setStyle("fontSize", 10);
ZigoEngine.register(Shortcuts, FuseItem, PennerEasing, Fuse, FuseFMP);
// hide the connector
connector._visible = false;
// hide thank you
thankYou.addEventListener ("onHide", Delegate.create(recorder,
recorder.enableControls));
XrayLoader.addEventListener(XrayLoader.LOADCOMPLETE, this, "configUI");
XrayLoader.loadConnector("xrayConnector_1.6.1.swf", null, false);
log = new XrayLog();
}
// Public Methods:
// Semi-Private Methods:
// Private Methods:
private function configUI():Void
{
_level0.__xrayConnector._visible = false;
// to show / hide the connector
Key.addListener(this);
// register for stopRecording messages
recorder.addEventListener("stopRecording", Delegate.create("thankYou",
thankYou.show));
// setup the tooltip defaults
Tooltip.options = {size:10, font:"_sans", corner:0};
// get notified of connection changes
connector.addEventListener("connectionChange", this);
// set the uri
Connector.red5URI = "rtmp://localhost/camRecorder";
// initialize the connector
connector.configUI();
// connect automatically
connector.makeConnection();
}
private function connectionChange(evtObj:Object):Void
{
if(evtObj.connected)
{
recorder.registerConnection(evtObj.connection);
}
}
private function onKeyDown():Void
{
var key:Number = Key.getAscii();
// SHIFT + ~
if(Key.isDown(Key.SHIFT) && key == 126)
{
//trace(log.debug("key!!", Key.getAscii()));
connector._visible = !connector._visible;
}
}
}
==================================================================
================ Recorder.as======================================
// ** AUTO-UI IMPORT STATEMENTS **
import org.red5.controls.GraphicButton;
// ** END AUTO-UI IMPORT STATEMENTS **
import com.blitzagency.xray.logger.XrayLog;
import org.red5.utils.Delegate;
import org.red5.net.Connection ;
import com.acmewebworks.controls.BaseClip;
import mx.controls.Alert;
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.geom.Point;
import flash.geom.Matrix;
import com.gskinner.geom.ColorMatrix ;
import flash.filters.ColorMatrixFilter;
class org.red5.samples.camrecorder.Recorder extends BaseClip
{
// Constants:
public static var CLASS_REF = org.red5.samples.camrecorder.Recorder;
public static var LINKAGE_ID:String = "
org.red5.samples.camrecorder.Recorder";
private static var BRIGHTNESS_START = -30;
private static var CONTRAST_START = 10;
private static var SATURATION_START = -100;
private static var HUE_START = 0;
// Public Properties:
//public var recording:Boolean = false;
// Private Properties:
private var log:XrayLog;
private var charList:Array;
private var connection:Connection;
private var ns:NetStream;
private var recording:Boolean = false;
private var playing:Boolean = false;
private var cam:Camera;
private var mic:Microphone;
private var timeoutSI:Number;
private var updateSI:Number;
private var matrix:Matrix;
private var bd:BitmapData;
private var cm:ColorMatrix;
// UI Elements:
// ** AUTO-UI ELEMENTS **
private var nameBG:MovieClip;
private var videoContainer:MovieClip;
private var record:GraphicButton;
private var stopRecord:GraphicButton;
private var preview:GraphicButton;
private var txtName:TextField;
private var videoBitmapContainer:MovieClip;
// ** END AUTO-UI ELEMENTS **
// Initialization:
private function Recorder() {}
private function onLoad():Void { configUI(); }
// Public Methods:
public function registerConnection(p_connection:Connection):Void
{
trace(log.debug("registerConnection", p_connection));
connection = p_connection;
ns = new NetStream(connection);
}
public function disableControls():Void
{
// we're in record mode
txtName.type = "dynamic";
record.enabled = false;
stopRecord.enabled = true;
videoBitmapContainer._alpha = 100;
}
public function enableControls():Void
{
// there isn't an enabled property on textfields, so we just switch them
between dynamic and input.
videoBitmapContainer._alpha = 0;
record.enabled = true;
stopRecord.enabled = false;
txtName.type = "input";
txtName.text = "1. enter your name(s)";
Selection.setFocus(null);
trace( log.debug("enableControls", txtName.text));
}
// Semi-Private Methods:
// Private Methods:
private function configUI():Void
{
log = new XrayLog();
// move videoContainer off way off
videoContainer._x = -1000;
cm = new ColorMatrix();
cm.adjustColor(BRIGHTNESS_START,CONTRAST_START,SATURATION_START,HUE_START);
videoContainer.filters = [new ColorMatrixFilter(cm)];
matrix = new Matrix();
bd = new BitmapData(videoContainer._width, videoContainer._height, false);
videoBitmapContainer.attachBitmap(bd, 1);
charList = [" ", ".", "&", "@", ":", "\"", "'", ";", "/", "\\", ">", "<"];
txtName.onSetFocus = Delegate.create(this, onSetFocus);
record.addEventListener("click", Delegate.create(this, recordClickHandler));
stopRecord.addEventListener("click", Delegate.create(this,
stopRecordClickHandler));
preview.addEventListener("click", Delegate.create(this,
startStreamPlayback));
// setup cam
cam = Camera.get();
cam.setMode(320, 270, 30);
cam.setQuality(0,80);
// setup mic
mic = Microphone.get ();
mic.setRate(11);
enableControls();
}
private function onSetFocus(evtObj:Object):Void
{
if(txtName.text.toLowerCase() == "1. enter your name(s)") txtName.text = "";
}
private function recordClickHandler(evtObj:Object):Void
{
if(txtName.text.toLowerCase() == "1. enter your name(s)" ||
txtName.text.length <= 0)
{
Alert.show("Please enter a valid name for your video", "Error in Name(s)",
Alert.OK, null, enableControls);
}else
{
// clean name
var flvName:String = cleanString(txtName.text) + "_" + getTimer();
trace(log.debug("flvName", flvName));
// start recording
startRecording(flvName);
}
}
private function stopRecordClickHandler(evtObj:Object):Void
{
stopRecording();
}
private function startStreamPlayback(evtObj:Object):Void
{
startPlayback();
}
private function startRecording(flvName:String):Void
{
if(recording) return;
// lock down controls
disableControls();
recording = true;
// connect for recording
ns.publish(flvName, "record");
ns.attachVideo(cam);
ns.attachAudio(mic);
// attach to video object on stage
videoContainer.publish_video.attachVideo(cam);
// update the bitmapdataobject
clearInterval(updateSI);
updateSI = setInterval(this, "updateBitmap", 25);
// turn off in 3 minutes if not already done so
timeoutSI = setInterval(this, "stopRecording", 180000);
}
private function updateBitmap():Void
{
bd.draw(videoContainer, matrix);
}
private function stopRecording():Void
{
if(!recording) return;
trace(log.debug("stopRecording"));
recording = false;
// clear video on stage
videoContainer.publish_video.attachVideo (null);
videoContainer.publish_video.clear();
videoBitmapContainer._alpha = 0;
// close netStream
ns.close();
dispatchEvent({type:"stopRecording"});
cleanString();
}
private function startPlayback(flvName:String):Void
{
if(playing) return;
playing = true;
// connect for recording
ns.play("flvName" + ".flv");
ns.attachVideo(cam);
// attach to video object on stage
videoContainer.publish_video .attachVideo (cam);
}
private function cleanString(str:String):String
{
for(var i:Number=0;i<charList.length;i++)
{
str = str.split(charList[i]).join("");
}
return str.toLowerCase();
}
}
==================================================================
Can you just check the above code and let me know where I am making the
mistake. I also could not able to save the recorded video in my application
folder in webapps. I need you help very badly!!!
Regards,
Simanta
_______________________________________________
Red5 mailing list
[email protected]
http://osflash.org/mailman/listinfo/red5_osflash.org