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

Reply via email to