[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