diff --git a/openvidu-java-client/src/main/java/io/openvidu/java/client/OpenVidu.java b/openvidu-java-client/src/main/java/io/openvidu/java/client/OpenVidu.java
index 6f8f6c55..a9e41581 100644
--- a/openvidu-java-client/src/main/java/io/openvidu/java/client/OpenVidu.java
+++ b/openvidu-java-client/src/main/java/io/openvidu/java/client/OpenVidu.java
@@ -194,8 +194,16 @@ public class OpenVidu {
JSONObject json = new JSONObject();
json.put("session", sessionId);
json.put("name", properties.name());
- json.put("recordingLayout", (properties.recordingLayout() != null) ? properties.recordingLayout().name() : "");
- json.put("customLayout", (properties.customLayout() != null) ? properties.customLayout() : "");
+ json.put("outputMode", properties.outputMode());
+
+ if (Recording.OutputMode.COMPOSED.equals(properties.outputMode())) {
+ json.put("recordingLayout",
+ (properties.recordingLayout() != null) ? properties.recordingLayout().name() : "");
+ if (RecordingLayout.CUSTOM.equals(properties.recordingLayout())) {
+ json.put("customLayout", (properties.customLayout() != null) ? properties.customLayout() : "");
+ }
+ }
+
StringEntity params = null;
try {
params = new StringEntity(json.toString());
diff --git a/openvidu-java-client/src/main/java/io/openvidu/java/client/Recording.java b/openvidu-java-client/src/main/java/io/openvidu/java/client/Recording.java
index c8183b37..74a4211f 100644
--- a/openvidu-java-client/src/main/java/io/openvidu/java/client/Recording.java
+++ b/openvidu-java-client/src/main/java/io/openvidu/java/client/Recording.java
@@ -59,6 +59,22 @@ public class Recording {
failed;
}
+ /**
+ * See {@link io.openvidu.java.client.Recording#getOutputMode()}
+ */
+ public enum OutputMode {
+
+ /**
+ * Recording all streams in a grid layout in a single archive
+ */
+ COMPOSED,
+
+ /**
+ * Record each stream individually
+ */
+ INDIVIDUAL;
+ }
+
private Recording.Status status;
private String id;
@@ -67,8 +83,6 @@ public class Recording {
private long size; // bytes
private double duration; // seconds
private String url;
- private boolean hasAudio = true;
- private boolean hasVideo = true;
private RecordingProperties recordingProperties;
protected Recording(JSONObject json) {
@@ -78,11 +92,20 @@ public class Recording {
this.size = (long) json.get("size");
this.duration = (double) json.get("duration");
this.url = (String) json.get("url");
- this.hasAudio = (boolean) json.get("hasAudio");
- this.hasVideo = (boolean) json.get("hasVideo");
this.status = Recording.Status.valueOf((String) json.get("status"));
- this.recordingProperties = new RecordingProperties.Builder().name((String) json.get("name"))
- .recordingLayout(RecordingLayout.valueOf((String) json.get("recordingLayout"))).build();
+
+ OutputMode outputMode = OutputMode.valueOf((String) json.get("outputMode"));
+ RecordingProperties.Builder builder = new RecordingProperties.Builder().name((String) json.get("name"))
+ .outputMode(outputMode).hasAudio((boolean) json.get("hasAudio"))
+ .hasVideo((boolean) json.get("hasVideo"));
+ if (OutputMode.COMPOSED.equals(outputMode)) {
+ builder.recordingLayout(RecordingLayout.valueOf((String) json.get("recordingLayout")));
+ String customLayout = (String) json.get("customLayout");
+ if (customLayout != null) {
+ builder.customLayout(customLayout);
+ }
+ }
+ this.recordingProperties = builder.build();
}
/**
@@ -109,12 +132,30 @@ public class Recording {
}
/**
- * The layout used in this recording
+ * Mode of recording: COMPOSED for a single archive in a grid layout or
+ * INDIVIDUAL for one archive for each stream
+ */
+ public OutputMode getOutputMode() {
+ return this.recordingProperties.outputMode();
+ }
+
+ /**
+ * The layout used in this recording. Only defined if OutputMode is COMPOSED
*/
public RecordingLayout getRecordingLayout() {
return this.recordingProperties.recordingLayout();
}
+ /**
+ * The custom layout used in this recording. Only defined if if OutputMode is
+ * COMPOSED and
+ * {@link io.openvidu.java.client.RecordingProperties.Builder#customLayout(String)}
+ * has been called
+ */
+ public RecordingLayout getCustomLayout() {
+ return this.recordingProperties.recordingLayout();
+ }
+
/**
* Session associated to the recording
*/
@@ -159,7 +200,7 @@ public class Recording {
* otherwise (currently fixed to true)
*/
public boolean hasAudio() {
- return hasAudio;
+ return this.recordingProperties.hasAudio();
}
/**
@@ -167,7 +208,7 @@ public class Recording {
* otherwise (currently fixed to true)
*/
public boolean hasVideo() {
- return hasVideo;
+ return this.recordingProperties.hasVideo();
}
}
diff --git a/openvidu-java-client/src/main/java/io/openvidu/java/client/RecordingProperties.java b/openvidu-java-client/src/main/java/io/openvidu/java/client/RecordingProperties.java
index 71e00ac6..77af078e 100644
--- a/openvidu-java-client/src/main/java/io/openvidu/java/client/RecordingProperties.java
+++ b/openvidu-java-client/src/main/java/io/openvidu/java/client/RecordingProperties.java
@@ -24,8 +24,11 @@ package io.openvidu.java.client;
public class RecordingProperties {
private String name;
+ private Recording.OutputMode outputMode;
private RecordingLayout recordingLayout;
private String customLayout;
+ private boolean hasAudio;
+ private boolean hasVideo;
/**
* Builder for {@link io.openvidu.java.client.RecordingProperties}
@@ -33,22 +36,24 @@ public class RecordingProperties {
public static class Builder {
private String name = "";
+ private Recording.OutputMode outputMode = Recording.OutputMode.COMPOSED;
private RecordingLayout recordingLayout;
private String customLayout = "";
+ private boolean hasAudio = true;
+ private boolean hasVideo = true;
/**
* Builder for {@link io.openvidu.java.client.RecordingProperties}
*/
public RecordingProperties build() {
- return new RecordingProperties(this.name, this.recordingLayout, this.customLayout);
+ return new RecordingProperties(this.name, this.outputMode, this.recordingLayout, this.customLayout,
+ this.hasAudio, this.hasVideo);
}
/**
* Call this method to set the name of the video file. You can access this same
* value in your clients on recording events (recordingStarted
,
- * recordingStopped
). WARNING: this parameter follows an
- * overwriting policy. If you name two recordings the same, the newest
- * MP4 file will overwrite the oldest one
+ * recordingStopped
)
*/
public RecordingProperties.Builder name(String name) {
this.name = name;
@@ -56,7 +61,20 @@ public class RecordingProperties {
}
/**
- * Call this method to set the layout to be used in the recording
+ * Call this method to set the mode of recording: COMPOSED for a single archive
+ * in a grid layout or INDIVIDUAL for one archive for each stream
+ */
+ public RecordingProperties.Builder outputMode(Recording.OutputMode outputMode) {
+ this.outputMode = outputMode;
+ return this;
+ }
+
+ /**
+ * Call this method to set the layout to be used in the recording. Will only
+ * have effect if
+ * {@link io.openvidu.java.client.RecordingProperties.Builder#outputMode(Recording.OutputMode)}
+ * has been called with value
+ * {@link io.openvidu.java.client.Recording.OutputMode#COMPOSED}
*/
public RecordingProperties.Builder recordingLayout(RecordingLayout layout) {
this.recordingLayout = layout;
@@ -68,7 +86,12 @@ public class RecordingProperties {
* {@link io.openvidu.java.client.RecordingProperties.Builder#recordingLayout(RecordingLayout)}
* to {@link io.openvidu.java.client.RecordingLayout#CUSTOM} you can call this
* method to set the relative path to the specific custom layout you want to
- * use. See
+ * Will only have effect if
+ * {@link io.openvidu.java.client.RecordingProperties.Builder#outputMode(Recording.OutputMode)}
+ * has been called with value
+ * {@link io.openvidu.java.client.Recording.OutputMode#COMPOSED}.
+ * See Custom recording layouts to learn more
*/
@@ -77,25 +100,51 @@ public class RecordingProperties {
return this;
}
+ /**
+ * Call this method to specify whether or not to record the audio track
+ */
+ public RecordingProperties.Builder hasAudio(boolean hasAudio) {
+ this.hasAudio = true;
+ return this;
+ }
+
+ /**
+ * Call this method to specify whether or not to record the video track
+ */
+ public RecordingProperties.Builder hasVideo(boolean hasVideo) {
+ this.hasVideo = true;
+ return this;
+ }
+
}
- protected RecordingProperties(String name, RecordingLayout layout, String customLayout) {
+ protected RecordingProperties(String name, Recording.OutputMode outputMode, RecordingLayout layout,
+ String customLayout, boolean hasAudio, boolean hasVideo) {
this.name = name;
+ this.outputMode = outputMode;
this.recordingLayout = layout;
this.customLayout = customLayout;
+ this.hasAudio = hasAudio;
+ this.hasVideo = hasVideo;
}
/**
* Defines the name you want to give to the video file. You can access this same
* value in your clients on recording events (recordingStarted
,
- * recordingStopped
). WARNING: this parameter follows an
- * overwriting policy. If you name two recordings the same, the newest
- * MP4 file will overwrite the oldest one
+ * recordingStopped
)
*/
public String name() {
return this.name;
}
+ /**
+ * Defines the mode of recording: COMPOSED for a single archive in a grid layout
+ * or INDIVIDUAL for one archive for each stream
+ */
+ public Recording.OutputMode outputMode() {
+ return this.outputMode;
+ }
+
/**
* Defines the layout to be used in the recording
*/
@@ -115,4 +164,18 @@ public class RecordingProperties {
return this.customLayout;
}
+ /**
+ * Defines if the recording has an audio track or not
+ */
+ public boolean hasAudio() {
+ return this.hasAudio;
+ }
+
+ /**
+ * Defines if the recording has a video track or not
+ */
+ public boolean hasVideo() {
+ return this.hasVideo;
+ }
+
}