/** * Internal helper to fork a process with handbrake and read the values from the process * * @param videoTranscoding * @return true: all ok; false: an error happend along the way */ private boolean forkTranscodingProcess(VideoTranscoding videoTranscoding) { OLATResource video = videoTranscoding.getVideoResource(); VideoModule videoModule = CoreSpringFactory.getImpl(VideoModule.class); VideoManager videoManager = CoreSpringFactory.getImpl(VideoManager.class); File masterFile = videoManager.getVideoFile(video); File transcodingFolder = ((LocalFolderImpl) videoManager.getTranscodingContainer(video)).getBasefile(); File transcodedFile = new File( transcodingFolder, Integer.toString(videoTranscoding.getResolution()) + masterFile.getName()); // mark this as beeing transcoded by this local transcoder videoTranscoding.setTranscoder(VideoTranscoding.TRANSCODER_LOCAL); videoTranscoding = videoManager.updateVideoTranscoding(videoTranscoding); ArrayList<String> cmd = new ArrayList<>(); String tasksetConfig = videoModule.getTranscodingTasksetConfig(); if (tasksetConfig != null && !"Mac OS X".equals(System.getProperty("os.name"))) { cmd.add("taskset"); cmd.add("-c"); cmd.add(tasksetConfig); } cmd.add("HandBrakeCLI"); cmd.add("-i"); cmd.add(masterFile.getAbsolutePath()); cmd.add("-o"); cmd.add(transcodedFile.getAbsolutePath()); cmd.add("--optimize"); cmd.add("--preset"); cmd.add("Normal"); cmd.add("--height"); cmd.add(Integer.toString(videoTranscoding.getResolution())); cmd.add("--deinterlace"); cmd.add("--crop"); cmd.add("0:0:0:0"); Process process = null; try { if (log.isDebug()) { log.debug(cmd.toString()); } ProcessBuilder builder = new ProcessBuilder(cmd); process = builder.start(); return updateVideoTranscodingFromProcessOutput(process, videoTranscoding, transcodedFile); } catch (IOException e) { log.error("Could not spawn convert sub process", e); return false; } finally { if (process != null) { process.destroy(); process = null; } } }