You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2018/08/03 09:54:43 UTC

[openmeetings] branch master updated: [OPENMEETINGS-1142] more work on recording conversions

This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to refs/heads/master by this push:
     new f4dfd2e  [OPENMEETINGS-1142] more work on recording conversions
f4dfd2e is described below

commit f4dfd2e18a7c8e99dd2539f0359905a6fdf63ede
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Fri Aug 3 16:52:42 2018 +0700

    [OPENMEETINGS-1142] more work on recording conversions
---
 .../openmeetings/core/converter/BaseConverter.java |  8 ++++---
 .../core/converter/InterviewConverter.java         | 28 +++++++++++++---------
 .../db/dao/basic/ConfigurationDao.java             | 10 ++++++++
 .../installation/ImportInitvalues.java             |  4 ++++
 .../openmeetings/util/OpenmeetingsVariables.java   | 10 ++++++++
 .../openmeetings/web/user/record/VideoInfo.java    |  2 +-
 6 files changed, 47 insertions(+), 15 deletions(-)

diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/BaseConverter.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/BaseConverter.java
index 3b5833d..0e2e676 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/BaseConverter.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/BaseConverter.java
@@ -32,6 +32,7 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_PATH_IMA
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_PATH_SOX;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getAudioBitrate;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getAudioRate;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.getVideoPreset;
 
 import java.io.File;
 import java.io.IOException;
@@ -379,10 +380,11 @@ public abstract class BaseConverter {
 				"-c:v", "h264", //
 				"-crf", "24",
 				"-pix_fmt", "yuv420p",
-				"-preset", "medium",
+				"-preset", getVideoPreset(),
 				"-profile:v", "baseline",
-				"-c:a", "libfaac",
-				"-c:a", "libfdk_aac",
+				"-level", "3.0",
+				"-movflags", "faststart",
+				"-c:a", "aac",
 				"-ar", String.valueOf(getAudioRate()),
 				"-b:a", getAudioBitrate(),
 				"-s", getDimensions(r), //
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/InterviewConverter.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/InterviewConverter.java
index 9ef0c56..669ea05 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/InterviewConverter.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/InterviewConverter.java
@@ -117,10 +117,12 @@ public class InterviewConverter extends BaseConverter implements IRecordingConve
 							//createBlankPod(id, streamFolder, interviewCam, diff, logs, pods, parts);
 							PodPart.add(parts, diff);
 							if (!meta.isAudioOnly()) {
-								parts.add(new PodPart(path));
+								parts.add(new PodPart(path, diff(meta.getRecordEnd(), meta.getRecordStart())));
 							}
 							pStart = meta.getRecordEnd();
 						}
+					} else {
+						log.debug("Meta FLV doesn't exist: {}", flv);
 					}
 				}
 				if (!parts.isEmpty()) {
@@ -140,7 +142,6 @@ public class InterviewConverter extends BaseConverter implements IRecordingConve
 					List<String> args = new ArrayList<>();
 					args.add(getPathToFFMPEG());
 					args.add("-y");
-					args.add("-an");
 					StringBuilder videos = new StringBuilder();
 					StringBuilder concat = new StringBuilder();
 					for (int i = 0; i < parts.size(); ++i) {
@@ -165,6 +166,7 @@ public class InterviewConverter extends BaseConverter implements IRecordingConve
 					}
 					args.add("-filter_complex");
 					args.add(concat.insert(0, videos).append("concat=n=").append(parts.size()).append(":v=1:a=0").toString());
+					args.add("-an");
 					args.add(podX);
 					ProcessResult res = ProcessHelper.executeScript(String.format("Full Flv pod_%s", N), args.toArray(new String[0]), true);
 					logs.add(res);
@@ -206,16 +208,21 @@ public class InterviewConverter extends BaseConverter implements IRecordingConve
 					args.add("-i");
 					args.add(pods.get(i));
 					cols.append('[').append(i).append(":v]");
-					if (i != 0 && i % w == 0) {
-						cols.append("hstack=inputs=").append(w).append("[c").append(j).append("];");
+					if (i != 0 && (i + 1) % w == 0) {
+						cols.append("hstack=inputs=").append(w);
+						if (j == 0 && i == N - 1) {
+							cols.append("[v]");
+						} else {
+							cols.append("[c").append(j).append("];");
+						}
 						rows.append("[c").append(j).append(']');
 						j++;
 					}
 					if (i == N - 1) {
-						if (j == 0) {
-							cols.append("hstack=inputs=").append(i).append("[v]");
-						} else {
+						if (j > 1) {
 							rows.append("vstack=inputs=").append(j).append("[v]");
+						} else {
+							rows.setLength(0);
 						}
 					}
 				}
@@ -254,14 +261,13 @@ public class InterviewConverter extends BaseConverter implements IRecordingConve
 		final String file;
 		final long duration;
 
-		public PodPart(String file) {
+		public PodPart(String file, long duration) {
 			this.file = file;
-			this.duration = 0L;
+			this.duration = duration;
 		}
 
 		public PodPart(long duration) {
-			this.file = null;
-			this.duration = duration;
+			this(null, duration);
 		}
 
 		public String getFile() {
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java
index 16c40f2..7871871 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java
@@ -39,6 +39,7 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_LOGIN_MI
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MAX_UPLOAD_SIZE;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MP4_AUDIO_BITRATE;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MP4_AUDIO_RATE;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MP4_VIDEO_PRESET;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_PASS_MIN_LENGTH;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REST_ALLOW_ORIGIN;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SIP_ENABLED;
@@ -70,6 +71,7 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.setRestAllowOri
 import static org.apache.openmeetings.util.OpenmeetingsVariables.setRoomSettings;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.setSipContext;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.setSipEnabled;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.setVideoPreset;
 
 import java.net.UnknownHostException;
 import java.util.ArrayList;
@@ -333,6 +335,9 @@ public class ConfigurationDao implements IDataProviderDao<Configuration> {
 			case CONFIG_MP4_AUDIO_BITRATE:
 				reloadAudioBitrate();
 				break;
+			case CONFIG_MP4_VIDEO_PRESET:
+				reloadVideoPreset();
+				break;
 			case CONFIG_DEFAULT_TIMEZONE:
 				reloadTimezone();
 				break;
@@ -414,6 +419,10 @@ public class ConfigurationDao implements IDataProviderDao<Configuration> {
 		setAudioBitrate(getString(CONFIG_MP4_AUDIO_BITRATE, "32k"));
 	}
 
+	private void reloadVideoPreset() {
+		setVideoPreset(getString(CONFIG_MP4_VIDEO_PRESET, "medium"));
+	}
+
 	private void reloadTimezone() {
 		String defaultTzName = getString(CONFIG_DEFAULT_TIMEZONE, "Europe/Berlin");
 
@@ -469,6 +478,7 @@ public class ConfigurationDao implements IDataProviderDao<Configuration> {
 		reloadGaCode();
 		reloadAudioRate();
 		reloadAudioBitrate();
+		reloadVideoPreset();
 		reloadTimezone();
 		reloadRestAllowOrigin();
 		reloadRoomSettings();
diff --git a/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java b/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
index 302ca2a..2200477 100644
--- a/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
+++ b/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
@@ -61,6 +61,7 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_LOGIN_MI
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MAX_UPLOAD_SIZE;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MP4_AUDIO_BITRATE;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MP4_AUDIO_RATE;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MP4_VIDEO_PRESET;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MYROOMS_ENABLED;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_PASS_MIN_LENGTH;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_PATH_FFMPEG;
@@ -347,6 +348,9 @@ public class ImportInitvalues {
 				"Number of chars needed in a user last name", "4.0.4");
 		addCfg(list, CONFIG_CHAT_SEND_ON_ENTER, String.valueOf(false), Configuration.Type.bool,
 				"Controls if chat message will be set on Enter (default: send on Ctrl+Enter)", "4.0.5");
+		addCfg(list, CONFIG_MP4_VIDEO_PRESET, "medium", Configuration.Type.bool,
+				"Preset (encoder optimization settings) to be used while performing mp4 conversion."
+				+ "Valid values are: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow", "4.0.5");
 		return list;
 	}
 	public void loadConfiguration(InstallationConfig cfg) {
diff --git a/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java b/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
index c59ec1f..791d6bd 100644
--- a/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
+++ b/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
@@ -93,6 +93,7 @@ public class OpenmeetingsVariables {
 	public static final String CONFIG_REMINDER_MESSAGE = "reminder.message";
 	public static final String CONFIG_MP4_AUDIO_RATE = "mp4.audio.rate";
 	public static final String CONFIG_MP4_AUDIO_BITRATE = "mp4.audio.bitrate";
+	public static final String CONFIG_MP4_VIDEO_PRESET = "mp4.video.preset";
 	public static final String CONFIG_REST_ALLOW_ORIGIN = "rest.allow.origin";
 	public static final String CONFIG_FNAME_MIN_LENGTH = "user.fname.minimum.length";
 	public static final String CONFIG_LNAME_MIN_LENGTH = "user.lname.minimum.length";
@@ -136,6 +137,7 @@ public class OpenmeetingsVariables {
 	private static Long defaultGroup = 1L;
 	private static int audioRate = 22050;
 	private static String audioBitrate = "32k";
+	private static String videoPreset = "medium";
 	private static String defaultTimezone = "Europe/Berlin";
 	private static String restAllowOrigin = null;
 	private static Class<?> appClass = null;
@@ -254,6 +256,14 @@ public class OpenmeetingsVariables {
 		audioBitrate = bitrate;
 	}
 
+	public static String getVideoPreset() {
+		return videoPreset;
+	}
+
+	public static void setVideoPreset(String preset) {
+		videoPreset = preset;
+	}
+
 	public static String getDefaultTimezone() {
 		return defaultTimezone;
 	}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.java
index ef2a75a..93e4107 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.java
@@ -145,6 +145,7 @@ public class VideoInfo extends Panel {
 		boolean exists = false;
 		if (_r instanceof Recording) {
 			Recording r = (Recording)_r;
+			isInterview = r.isInterview();
 			rm.setObject(r);
 			exists = r.exists();
 			try {
@@ -153,7 +154,6 @@ public class VideoInfo extends Panel {
 					Room room = roomDao.get(r.getRoomId());
 					if (room != null) {
 						name = room.getName();
-						isInterview = Room.Type.interview == room.getType();
 					}
 				}
 				roomName.setObject(name);