[Red5commits] [1554] (1) Record FLV to Context.getResource() rather than Scope.getResource()(2) Impl

sgong luke at codegent.com
Wed Jan 24 10:53:19 EST 2007


(1) Record FLV to Context.getResource() rather than Scope.getResource()
(2) Implement ServerSideStream?.saveAs()
(3) Added a commented sample in oflaDemo's Application for ServerSideStream?.saveAs()


Timestamp: 11/17/06 22:33:36 EST (2 months ago) 
Change: 1554 
Author: sgong

Files (see diff or trac for details): 
java/server/trunk/src/org/red5/server/stream/ClientBroadcastStream.java
java/server/trunk/src/org/red5/server/stream/ServerStream.java
java/server/trunk/webapps/oflaDemo/WEB-INF/src/org/red5/server/webapp/oflaDemo/Application.java


Trac: http://mirror1.cvsdude.com/trac/osflash/red5/changeset/1554

Index: /java/server/trunk/src/org/red5/server/stream/ServerStream.java
===================================================================
--- /java/server/trunk/src/org/red5/server/stream/ServerStream.java (revision 1538)
+++ /java/server/trunk/src/org/red5/server/stream/ServerStream.java (revision 1554)
@@ -20,4 +20,6 @@
  */
 
+import java.io.File;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -27,4 +29,6 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.red5.server.api.IScope;
+import org.red5.server.api.ScopeUtils;
 import org.red5.server.api.scheduling.IScheduledJob;
 import org.red5.server.api.scheduling.ISchedulingService;
@@ -32,6 +36,8 @@
 import org.red5.server.api.stream.IPlaylistController;
 import org.red5.server.api.stream.IServerStream;
+import org.red5.server.api.stream.IStreamFilenameGenerator;
 import org.red5.server.api.stream.ResourceExistException;
 import org.red5.server.api.stream.ResourceNotFoundException;
+import org.red5.server.api.stream.IStreamFilenameGenerator.GenerationType;
 import org.red5.server.messaging.IFilter;
 import org.red5.server.messaging.IMessage;
@@ -44,4 +50,5 @@
 import org.red5.server.messaging.IProvider;
 import org.red5.server.messaging.IPushableConsumer;
+import org.red5.server.messaging.InMemoryPushPushPipe;
 import org.red5.server.messaging.OOBControlMessage;
 import org.red5.server.messaging.PipeConnectionEvent;
@@ -49,6 +56,8 @@
 import org.red5.server.net.rtmp.event.IRTMPEvent;
 import org.red5.server.net.rtmp.event.VideoData;
+import org.red5.server.stream.consumer.FileConsumer;
 import org.red5.server.stream.message.RTMPMessage;
 import org.red5.server.stream.message.ResetMessage;
+import org.springframework.core.io.Resource;
 
 /**
@@ -89,4 +98,6 @@
 
 	private IMessageOutput msgOut;
+	
+	private IPipe recordPipe;
 
 	private ISchedulingService scheduler;
@@ -208,8 +219,61 @@
 	}
 
-	public void saveAs(String filePath, boolean isAppend)
+	public void saveAs(String name, boolean isAppend)
 			throws ResourceNotFoundException, ResourceExistException {
-		// TODO Auto-generated method stub
-
+		try {
+			IScope scope = getScope();
+			IStreamFilenameGenerator generator = (IStreamFilenameGenerator) ScopeUtils
+			.getScopeService(scope, IStreamFilenameGenerator.class,
+					DefaultStreamFilenameGenerator.class);
+			
+			String filename = generator.generateFilename(scope, name, ".flv", GenerationType.RECORD);
+			Resource res = scope.getContext().getResource(filename);
+			if (!isAppend) {
+				if (res.exists()) {
+					// Per livedoc of FCS/FMS:
+					// When "live" or "record" is used,
+					// any previously recorded stream with the same stream URI is deleted.
+					res.getFile().delete();
+				}
+			} else {
+				if (!res.exists()) {
+					// Per livedoc of FCS/FMS:
+					// If a recorded stream at the same URI does not already exist,
+					// "append" creates the stream as though "record" was passed.
+					isAppend = false;
+				}
+			}
+
+			if (!res.exists()) {
+				// Make sure the destination directory exists
+				try {
+					String path = res.getFile().getAbsolutePath();
+					int slashPos = path.lastIndexOf(File.separator);
+					if (slashPos != -1) {
+						path = path.substring(0, slashPos);
+					}
+					File tmp = new File(path);
+					if (!tmp.isDirectory()) {
+						tmp.mkdirs();
+					}
+				} catch (IOException err) {
+					log.error("Could not create destination directory.", err);
+				}
+				res = scope.getResource(filename);
+			}
+
+			if (!res.exists()) {
+				res.getFile().createNewFile();
+			}
+			FileConsumer fc = new FileConsumer(scope, res.getFile());
+			Map<Object, Object> paramMap = new HashMap<Object, Object>();
+			if (isAppend) {
+				paramMap.put("mode", "append");
+			} else {
+				paramMap.put("mode", "record");
+			}
+			recordPipe.subscribe(fc, paramMap);
+		} catch (IOException e) {
+		}
 	}
 
@@ -242,8 +306,13 @@
 					"A published name is needed to start");
 		}
+		// publish this server-side stream
 		IProviderService providerService = (IProviderService) getScope()
 				.getContext().getBean(IProviderService.BEAN_NAME);
 		providerService
 				.registerBroadcastStream(getScope(), publishedName, this);
+		Map<Object, Object> recordParamMap = new HashMap<Object, Object>();
+		recordPipe = new InMemoryPushPushPipe();
+		recordParamMap.put("record", null);
+		recordPipe.subscribe((IProvider) this, recordParamMap);
 		scheduler = (ISchedulingService) getScope().getContext().getBean(
 				ISchedulingService.BEAN_NAME);
@@ -282,4 +351,5 @@
 			msgOut.unsubscribe(this);
 		}
+		recordPipe.unsubscribe((IProvider) this);
 		state = State.CLOSED;
 	}
@@ -290,5 +360,5 @@
 
 	public void pushMessage(IPipe pipe, IMessage message) {
-		msgOut.pushMessage(message);
+		pushMessage(message);
 	}
 
@@ -367,7 +437,12 @@
 		nextItem();
 	}
+	
+	private void pushMessage(IMessage message) {
+		msgOut.pushMessage(message);
+		recordPipe.pushMessage(message);
+	}
 
 	private void sendResetMessage() {
-		msgOut.pushMessage(new ResetMessage());
+		pushMessage(new ResetMessage());
 	}
 
@@ -435,5 +510,5 @@
 					}
 					vodJobName = null;
-					msgOut.pushMessage(nextRTMPMessage);
+					pushMessage(nextRTMPMessage);
 					nextRTMPMessage.getBody().release();
 					long start = currentItem.getStart();
Index: /java/server/trunk/src/org/red5/server/stream/ClientBroadcastStream.java
===================================================================
--- /java/server/trunk/src/org/red5/server/stream/ClientBroadcastStream.java (revision 1550)
+++ /java/server/trunk/src/org/red5/server/stream/ClientBroadcastStream.java (revision 1554)
@@ -143,5 +143,5 @@
 
 			String filename = generator.generateFilename(scope, name, ".flv", GenerationType.RECORD);
-			Resource res = scope.getResource(filename);
+			Resource res = scope.getContext().getResource(filename);
 			if (!isAppend) {
 				if (res.exists()) {
Index: /java/server/trunk/webapps/oflaDemo/WEB-INF/src/org/red5/server/webapp/oflaDemo/Application.java
===================================================================
--- /java/server/trunk/webapps/oflaDemo/WEB-INF/src/org/red5/server/webapp/oflaDemo/Application.java (revision 1406)
+++ /java/server/trunk/webapps/oflaDemo/WEB-INF/src/org/red5/server/webapp/oflaDemo/Application.java (revision 1554)
@@ -7,4 +7,6 @@
 import org.red5.server.api.stream.IStreamCapableConnection;
 import org.red5.server.api.stream.support.SimpleBandwidthConfigure;
+import org.red5.server.api.stream.support.SimplePlayItem;
+import org.red5.server.api.stream.support.StreamUtils;
 
 public class Application extends ApplicationAdapter {
@@ -31,13 +33,24 @@
 			streamConn.setBandwidthConfigure(sbc);
 		}
-		/*
-		 * if (appScope == conn.getScope()) { serverStream =
-		 * StreamUtils.createServerStream(appScope, "live0"); SimplePlayItem
-		 * item = new SimplePlayItem(); item.setStart(0); item.setLength(10000);
-		 * item.setName("on2_flash8_w_audio"); serverStream.addItem(item); item =
-		 * new SimplePlayItem(); item.setStart(20000); item.setLength(10000);
-		 * item.setName("on2_flash8_w_audio"); serverStream.addItem(item);
-		 * serverStream.start(); }
-		 */
+		
+//		if (appScope == conn.getScope()) {
+//			serverStream = StreamUtils.createServerStream(appScope, "live0");
+//			SimplePlayItem item = new SimplePlayItem();
+//			item.setStart(0);
+//			item.setLength(10000);
+//			item.setName("on2_flash8_w_audio");
+//			serverStream.addItem(item);
+//			item = new SimplePlayItem();
+//			item.setStart(20000);
+//			item.setLength(10000);
+//			item.setName("on2_flash8_w_audio");
+//			serverStream.addItem(item);
+//			serverStream.start();
+//			try {
+//				serverStream.saveAs("aaa", false);
+//				serverStream.saveAs("bbb", false);
+//			} catch (Exception e) {}
+//		}
+		 
 		return super.appConnect(conn, params);
 	}


Note:
Diffs are chopped if more than 25k.
This is to get past the limit on the mailing list.



More information about the Red5commits mailing list