Hi list!
I write a simple AS3/Red5 project that capture/replay video from webcam.
However, the call to remove the temp file often fails if it has been
replayed.
I think it might be a cache issue. But I don't know how to clean the cache
on server side.
Any suggestion?
Thanks for your attention.
Simon
==============
Note for code snippets
==============
I remove some "irrelevant" code to keep it clear.
In attached code, doDiscardStream won't remove the file on server if
doReplayStream has been called.
==============
Client AS3 file
==============
package
{
import flash.display.*;
import flash.net.*;
import flash.events.*;
import flash.media.*;
import flash.utils.*;
public class App extends Sprite
{
import flash.media.Camera;
import flash.media.Microphone;
private var nc:NetConnection;
private var ns:NetStream;
private var cam:Camera;
private var mic:Microphone;
private var publish_video:Video;
private var curFlvName:String;
// connect to red5 server
public function doConnection(e:Event):void
{
if (!nc.connected)
{
// connect and return, will start recording automatically.
nc.connect("rtmp://192.168.1.100/myTest");
return;
}
doRecordStream();
}
// camera capture and save on server
public function doRecordStream():void
{
if(!nc.connected || recording) return;
recording = true;
ns = new NetStream(nc);
publish_video.attachCamera(cam);
curFlvName = new String("Demo" + getTimer());
ns.publish(curFlvName, "record");
ns.attachCamera(cam);
ns.attachAudio(mic);
}
// stop capture
public function doStopStream(e:Event):void
{
if(!recording && !replaying) return;
recording = false;
replaying = false;
publish_video.attachNetStream(null);
publish_video.attachCamera(null);
ns.close();
}
// replay recorded flv
public function doReplayStream(e:Event):void
{
doStopStream(null);
if (curFlvName==null)
{
return;
}
replaying = true;
publish_video.attachNetStream(ns);
ns.close();
ns.play(curFlvName);
}
// remove flv
public function doDiscardStream(e:Event):void
{
doStopStream(null);
ns.close();
var nc_responder:Responder = new Responder(cbDiscard, null);
nc.call("discardFlv", nc_responder, curFlvName);
}
public function cbDiscard(cbResult:String):void
{
}
}
}
==============
Server app method to delete file
==============
public String discardFlv(String fileName){
try {
IScope scope = appScope;
IStreamFilenameGenerator generator = (IStreamFilenameGenerator)
ScopeUtils.getScopeService(scope, IStreamFilenameGenerator.KEY,
DefaultStreamFilenameGenerator.class);
String filename = generator.generateFilename(scope, fileName,
".flv");
Resource res = scope.getResource(filename);
res.getInputStream().close();
res.getFile().delete();
} catch (IOException e) {log.error(e.getMessage());}
return fileName;
}
_______________________________________________
Red5 mailing list
[email protected]
http://osflash.org/mailman/listinfo/red5_osflash.org