Looks like my attachment was scrubbed. Here it is again.

On 02/08/06, Tony <[EMAIL PROTECTED]> wrote:
Hi,

I'm using Red5 0.5 set up a simple record/playback system where I record microphone audio, play the audio back, then record again, overwriting the previous recording ( i.e. using the same stream name). This system was working fine with FCS, and it works up to a point in Red5. If I create multiple recordings without playing it back, Red5 is happy to overwrite the FLV with new content. I can even play the recording back...once. The problem happens when I try to record again after playback, I get multilpe Red5 errors (see below).

Attached is a modified red5\samples\livestream\recorder\Main.as used by simpleRecorder which mimics, more or less, what I'm trying to do by always recording to the same file, then automatically playing back the recording after a short interval. If you publish simpleRecorder.fla with the modified file, recording for a second time after playback causes the errors. Reverting Main.as to use a new stream name each recording (using getTimer()), fixes the problem. I've tried  various ways of tidying up the playback and recording streams by .close(), .publish(false) etc thinking that might be the problem, but can't get rid of this error. I've also tried the latest SVN version and it's still not happy. I guess I could look at modifying my app to use a new stream name each time but would like to avoid doing that if possible. Any ideas?

Thanks for your help.

Tony

Error Message:

[java] [ERROR] 771860 IoWorker-4:( org.red5.server.stream.consumer.FileConsumer.error ) error init file consumer
[java] java.io.FileNotFoundException : C:\Program Files\Red5\webapps\oflaDemo\streams\red5RecordDemo99.flv (The requested operation cannot be performed on a file with a user-mapped section open)
[java]     at java.io.FileOutputStream.open(Native Method)
[java]     at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
[java]     at java.io.FileOutputStream.<init>(FileOutputStream.java:131)
[java]     at org.red5.io.flv.impl.FLV.getWriter(FLV.java :148)
[java]     at org.red5.server.stream.consumer.FileConsumer.init(FileConsumer.java:158)
[java]     at org.red5.server.stream.consumer.FileConsumer.pushMessage(FileConsumer.java:73)
[java]     at org.red5.server.messaging.InMemoryPushPushPipe.pushMessage (InMemoryPushPushPipe.java:67)
[java]     at org.red5.server.stream.ClientBroadcastStream.dispatchEvent(ClientBroadcastStream.java:270)
[java]     at org.red5.server.net.rtmp.RTMPHandler.messageReceived(RTMPHandler.java :160)
[java]     at org.red5.server.net.rtmp.RTMPMinaIoHandler.messageReceived(RTMPMinaIoHandler.java:68)
[java]     at org.apache.mina.common.support.AbstractIoFilterChain$2.messageReceived(AbstractIoFilterChain.java :188)
[java]     at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:501)
[java]     at org.apache.mina.common.support.AbstractIoFilterChain.access$1000(AbstractIoFilterChain.java :51)
[java]     at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:787)
[java]     at org.apache.mina.filter.ThreadPoolFilter.processEvent(ThreadPoolFilter.java :718)
[java]     at org.apache.mina.filter.ThreadPoolFilter$Worker.processEvents(ThreadPoolFilter.java:474)
[java]     at org.apache.mina.filter.ThreadPoolFilter$Worker.run(ThreadPoolFilter.java:429)
[java] [ERROR] 771860 IoWorker-4:( org.red5.server.messaging.InMemoryPushPushPipe.error ) exception when pushing message to consumer
[java] java.lang.NullPointerException
[java]     at org.red5.server.stream.consumer.FileConsumer.pushMessage(FileConsumer.java :119)
[java]     at org.red5.server.messaging.InMemoryPushPushPipe.pushMessage(InMemoryPushPushPipe.java:67)
[java]     at org.red5.server.stream.ClientBroadcastStream.dispatchEvent(ClientBroadcastStream.java:270)
[java]     at org.red5.server.net.rtmp.RTMPHandler.messageReceived(RTMPHandler.java:160)
[java]     at org.red5.server.net.rtmp.RTMPMinaIoHandler.messageReceived(RTMPMinaIoHandler.java:68)
[java]     at org.apache.mina.common.support.AbstractIoFilterChain$2.messageReceived (AbstractIoFilterChain.java:188)
[java]     at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:501)
[java]     at org.apache.mina.common.support.AbstractIoFilterChain.access$1000 (AbstractIoFilterChain.java:51)
[java]     at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:787)
[java]     at org.apache.mina.filter.ThreadPoolFilter.processEvent (ThreadPoolFilter.java:718)
[java]     at org.apache.mina.filter.ThreadPoolFilter$Worker.processEvents(ThreadPoolFilter.java:474)
[java]     at org.apache.mina.filter.ThreadPoolFilter$Worker.run(ThreadPoolFilter.java :429)



// ** AUTO-UI IMPORT STATEMENTS **
import org.red5.utils.Connector;
import org.red5.ui.controls.IconButton;
// ** END AUTO-UI IMPORT STATEMENTS **
import com.neoarchaic.ui.Tooltip;
import org.red5.net.Stream;
import org.red5.utils.Delegate;
import com.blitzagency.xray.util.XrayLoader;

class org.red5.samples.livestream.recorder.Main extends MovieClip {
// Constants:
        public static var CLASS_REF = org.red5.samples.livestream.recorder.Main;
        public static var LINKAGE_ID:String = 
"org.red5.samples.livestream.recorder.Main";
// Public Properties:
// Private Properties:
        private var recordingStream:Stream;
        private var playingStream:Stream;
        private var recording:Boolean;
        private var playing:Boolean;
        private var cam:Camera;
        private var mic:Microphone;
        private var currentTimer:Number;
// UI Elements:

// ** AUTO-UI ELEMENTS **
        private var connector:Connector;
        private var playback:IconButton;
        private var publish_video:Video;
        private var startRecord:IconButton;
        private var stopPlayback:IconButton;
        private var stopRecord:IconButton;
// ** END AUTO-UI ELEMENTS **

// Initialization:
        private function Main() {XrayLoader.loadConnector("xray.swf");}
        private function onLoad():Void { configUI(); }

   private var playWaitInterval:Number;
   
// Public Methods:
// Semi-Private Methods:
// Private Methods:
        private function configUI():Void 
        {
                // setup the tooltip defaults
                Tooltip.options = {size:10, font:"_sans", corner:0};
                
                // setupbuttons
                startRecord.tooltip = "start recording";
                stopRecord.tooltip = "stop recording";
                //playback.tooltip = "playback recording";
                //stopPlayback.tooltip = "stop playback";
                
                startRecord.addEventListener("click", Delegate.create(this, 
recordStream));
                stopRecord.addEventListener("click", Delegate.create(this, 
stopStream));
                //playback.addEventListener("click", Delegate.create(this, 
startStreamPlayback));
                //stopPlayback.addEventListener("click", Delegate.create(this, 
stopStreamPlayback));
                
                // setup cam
                cam = Camera.get();
                
                // setup mic
                mic = Microphone.get();
                
                // get notified of connection changes
                connector.addEventListener("connectionChange", this);
                
                // set the uri
                Connector.red5URI = "rtmp://localhost/oflaDemo";
                
                // initialize the connector
                connector.configUI();   
        }
        
        private function startStreamPlayback(evtObj:Object):Void
        {
                trace("playWaitInterval" + playWaitInterval);
                trace("playing" + playing);
                clearInterval(playWaitInterval);
                if(playing) return;
                //stream = new Stream(connector.connection);
                
                playingStream.play("red5RecordDemo" + currentTimer + ".flv");
                publish_video.attachVideo(playingStream);
                playing = true;
        }
        
        private function stopStreamPlayback(evtObj:Object):Void
        {
                if(!playing) return;
                playing = false;
                playingStream.close();
        }
        
        private function recordStream(evtObj:Object):Void
        {
                if(!connector.connection.isConnected || recording) return;
                recording = true;
                
                // setup stream
                currentTimer = getTimer();
                currentTimer = 99;
                recordingStream.publish("red5RecordDemo" + currentTimer, 
"record");
                recordingStream.attachVideo(cam);
                recordingStream.attachAudio(mic);
                publish_video.attachVideo(cam);
        }
        
        private function stopStream(evtObj:Object):Void
        {
                if(!recording) return;
                recording = false;
                recordingStream.close();
                recordingStream.publish(false);
                
                playing = false;
                playWaitInterval = setInterval(this, "startStreamPlayback", 
2000);
        }
        
        private function connectionChange(evtObj:Object):Void
        {               
                if(evtObj.connected) 
                {
                        recording = false;
                        playing = false;
                        recordingStream = new Stream(evtObj.connection);
                        playingStream = new Stream(evtObj.connection);
                        playingStream.addEventListener("streamStop", 
Delegate.create(this, stopStreamPlayback));
                }
        }

}
_______________________________________________
Red5 mailing list
[email protected]
http://osflash.org/mailman/listinfo/red5_osflash.org

Reply via email to