Author: solomax Date: Thu Dec 13 10:19:27 2012 New Revision: 1421190 URL: http://svn.apache.org/viewvc?rev=1421190&view=rev Log: Audio convertion is refactored to have less copy/paste and avoid running "SoX pad" with negative length
Modified: incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/converter/BaseConverter.java Modified: incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/converter/BaseConverter.java URL: http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/converter/BaseConverter.java?rev=1421190&r1=1421189&r2=1421190&view=diff ============================================================================== --- incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/converter/BaseConverter.java (original) +++ incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/converter/BaseConverter.java Thu Dec 13 10:19:27 2012 @@ -47,35 +47,25 @@ public abstract class BaseConverter { @Autowired private FlvRecordingMetaDeltaDao flvRecordingMetaDeltaDaoImpl; - protected String getPathToFFMPEG() { - String pathToFFMPEG = configurationmanagement.getConfKey( - "ffmpeg_path").getConf_value(); - if (!pathToFFMPEG.equals("") && !pathToFFMPEG.endsWith(File.separator)) { - pathToFFMPEG += File.separator; + private String getPath(String key, String app) { + String path = configurationmanagement.getConfValue(key, String.class, ""); + if (!path.equals("") && !path.endsWith(File.separator)) { + path += File.separator; } - pathToFFMPEG += "ffmpeg"; - return pathToFFMPEG; + path += app; + return path; + } + + protected String getPathToFFMPEG() { + return getPath("ffmpeg_path", "ffmpeg"); } protected String getPathToSoX() { - String pathToSoX = configurationmanagement.getConfKey("sox_path") - .getConf_value(); - if (!pathToSoX.equals("") && !pathToSoX.endsWith(File.separator)) { - pathToSoX += File.separator; - } - pathToSoX += "sox"; - return pathToSoX; + return getPath("sox_path", "sox"); } protected String getPathToImageMagick() { - String pathToImageMagick = this.configurationmanagement.getConfKey( - "imagemagick_path").getConf_value(); - if (!pathToImageMagick.equals("") - && !pathToImageMagick.endsWith(File.separator)) { - pathToImageMagick += File.separator; - } - pathToImageMagick += "convert" + GenerateSWF.execExt; - return pathToImageMagick; + return getPath("imagemagick_path", "convert") + GenerateSWF.execExt; } protected boolean isUseOldStyleFfmpegMap() { @@ -128,6 +118,30 @@ public abstract class BaseConverter { stripAudioFirstPass(flvRecording, returnLog, listOfFullWaveFiles, streamFolder, metaDataList); } + private String[] addSoxPad(List<ConverterProcessResult> returnLog, String job, double length, double position, String inFile, String outFile) { + if (length >= 0 && position >= 0 && (length > 0 || position > 0)) { + String[] argv_sox = new String[] { getPathToSoX(), + inFile, outFile, "pad", + "" + length, "" + position }; + + if (log.isDebugEnabled()) { + log.debug("START " + job + " ################# "); + String padString = ""; + for (int i = 0; i < argv_sox.length; i++) { + padString += " " + argv_sox[i]; + } + log.debug("padString :: " + padString); + log.debug("END " + job + " ################# "); + } + returnLog.add(ProcessHelper.executeScript(job, argv_sox)); + return argv_sox; + } else { + log.debug("::addSoxPad " + job + " Invalid parameters: " + + " length = " + length + "; position = " + position + "; inFile = " + inFile); + } + return null; + } + protected void stripAudioFirstPass(FlvRecording flvRecording, List<ConverterProcessResult> returnLog, List<String> listOfFullWaveFiles, File streamFolder, @@ -137,23 +151,23 @@ public abstract class BaseConverter { log.debug("### meta Data Number - " + metaDataList.size()); log.debug("###################################################"); - for (FlvRecordingMetaData flvRecordingMetaData : metaDataList) { + for (FlvRecordingMetaData metaData : metaDataList) { - if (flvRecordingMetaData.getStreamReaderThreadComplete() == null) { + if (metaData.getStreamReaderThreadComplete() == null) { throw new IllegalStateException("StreamReaderThreadComplete Bit is NULL, error in recording"); } - if (!flvRecordingMetaData.getStreamReaderThreadComplete()) { + if (!metaData.getStreamReaderThreadComplete()) { - log.debug("### meta Stream not yet written to disk" + flvRecordingMetaData.getFlvRecordingMetaDataId()); + log.debug("### meta Stream not yet written to disk" + metaData.getFlvRecordingMetaDataId()); boolean doStop = true; while(doStop) { - log.debug("### Stream not yet written Thread Sleep - " + flvRecordingMetaData.getFlvRecordingMetaDataId()); + log.debug("### Stream not yet written Thread Sleep - " + metaData.getFlvRecordingMetaDataId()); - flvRecordingMetaData = flvRecordingMetaDataDaoImpl.getFlvRecordingMetaDataById(flvRecordingMetaData.getFlvRecordingMetaDataId()); + metaData = flvRecordingMetaDataDaoImpl.getFlvRecordingMetaDataById(metaData.getFlvRecordingMetaDataId()); - if (flvRecordingMetaData.getStreamReaderThreadComplete()) { + if (metaData.getStreamReaderThreadComplete()) { log.debug("### Stream now written Thread continue - " ); doStop = false; } @@ -162,17 +176,17 @@ public abstract class BaseConverter { } } - File inputFlvFile = new File(streamFolder, flvRecordingMetaData.getStreamName() + ".flv"); + File inputFlvFile = new File(streamFolder, metaData.getStreamName() + ".flv"); - String hashFileName = flvRecordingMetaData.getStreamName() - + "_WAVE.wav"; + String hashFileName = metaData.getStreamName() + "_WAVE.wav"; String outputWav = new File(streamFolder, hashFileName).getCanonicalPath(); //FIXME - flvRecordingMetaData.setWavAudioData(hashFileName); + metaData.setWavAudioData(hashFileName); log.debug("FLV File Name: {} Length: {} ", inputFlvFile.getName(), inputFlvFile.length()); + metaData.setAudioIsValid(false); if (inputFlvFile.exists()) { String[] argv = new String[] { this.getPathToFFMPEG(), @@ -190,143 +204,77 @@ public abstract class BaseConverter { // check if the resulting Audio is valid File output_wav = new File(outputWav); - if (!output_wav.exists()) { - flvRecordingMetaData.setAudioIsValid(false); - } else { - if (output_wav.length() == 0) { - flvRecordingMetaData.setAudioIsValid(false); - } else { - flvRecordingMetaData.setAudioIsValid(true); - } + if (output_wav.exists() && output_wav.length() != 0) { + metaData.setAudioIsValid(true); } - - } else { - flvRecordingMetaData.setAudioIsValid(false); } - if (flvRecordingMetaData.getAudioIsValid()) { + if (metaData.getAudioIsValid()) { // Strip Wave to Full Length String outputGapFullWav = outputWav; // Fix Start/End in Audio List<FlvRecordingMetaDelta> flvRecordingMetaDeltas = flvRecordingMetaDeltaDaoImpl - .getFlvRecordingMetaDeltaByMetaId(flvRecordingMetaData + .getFlvRecordingMetaDeltaByMetaId(metaData .getFlvRecordingMetaDataId()); int counter = 0; - for (FlvRecordingMetaDelta flvRecordingMetaDelta : flvRecordingMetaDeltas) { + for (FlvRecordingMetaDelta metaDelta : flvRecordingMetaDeltas) { String inputFile = outputGapFullWav; // Strip Wave to Full Length - String hashFileGapsFullName = flvRecordingMetaData + String hashFileGapsFullName = metaData .getStreamName() + "_GAP_FULL_WAVE_" + counter + ".wav"; outputGapFullWav = new File(streamFolder, hashFileGapsFullName).getCanonicalPath(); - flvRecordingMetaDelta - .setWaveOutPutName(hashFileGapsFullName); + metaDelta.setWaveOutPutName(hashFileGapsFullName); String[] argv_sox = null; - if (flvRecordingMetaDelta.getIsStartPadding() != null - && flvRecordingMetaDelta.getIsStartPadding()) { - - double gapSeconds = Double.valueOf( - flvRecordingMetaDelta.getDeltaTime() - .toString()).doubleValue() / 1000; - - Double.valueOf( - flvRecordingMetaDelta.getDeltaTime() - .toString()).doubleValue(); - - if (gapSeconds > 0) { - // Add the item at the beginning - argv_sox = new String[] { this.getPathToSoX(), - inputFile, outputGapFullWav, "pad", - String.valueOf(gapSeconds).toString(), - "0" }; - } - - } else if (flvRecordingMetaDelta.getIsEndPadding() != null - && flvRecordingMetaDelta.getIsEndPadding()) { - - double gapSeconds = Double.valueOf( - flvRecordingMetaDelta.getDeltaTime() - .toString()).doubleValue() / 1000; - - if (gapSeconds > 0) { - // Add the item at the end - argv_sox = new String[] { this.getPathToSoX(), - inputFile, outputGapFullWav, "pad", - "0", - String.valueOf(gapSeconds).toString() }; + if (metaDelta.getDeltaTime() != null) { + if (metaDelta.getIsStartPadding() != null && metaDelta.getIsStartPadding()) { + double gapSeconds = ((double)metaDelta.getDeltaTime()) / 1000; + argv_sox = addSoxPad(returnLog, "fillGap", gapSeconds, 0, inputFile, outputGapFullWav); + } else if (metaDelta.getIsEndPadding() != null && metaDelta.getIsEndPadding()) { + double gapSeconds = ((double)metaDelta.getDeltaTime()) / 1000; + argv_sox = addSoxPad(returnLog, "fillGap", 0, gapSeconds, inputFile, outputGapFullWav); } } if (argv_sox != null) { - log.debug("START addGapAudioToWaves ################# "); - log.debug("START addGapAudioToWaves ################# Delta-ID :: " - + flvRecordingMetaDelta - .getFlvRecordingMetaDeltaId()); - String commandHelper = " "; - for (int i = 0; i < argv_sox.length; i++) { - commandHelper += " " + argv_sox[i]; - } - log.debug(" commandHelper " + commandHelper); - log.debug("END addGapAudioToWaves ################# "); - - returnLog.add(ProcessHelper.executeScript("fillGap", - argv_sox)); + log.debug("START fillGap ################# Delta-ID :: " + + metaDelta.getFlvRecordingMetaDeltaId()); - this.flvRecordingMetaDeltaDaoImpl - .updateFlvRecordingMetaDelta(flvRecordingMetaDelta); + flvRecordingMetaDeltaDaoImpl.updateFlvRecordingMetaDelta(metaDelta); counter++; } else { outputGapFullWav = inputFile; } - } // Strip Wave to Full Length - String hashFileFullName = flvRecordingMetaData - .getStreamName() + "_FULL_WAVE.wav"; + String hashFileFullName = metaData.getStreamName() + "_FULL_WAVE.wav"; String outputFullWav = new File(streamFolder, hashFileFullName).getCanonicalPath(); // Calculate delta at beginning - Long deltaTimeStartMilliSeconds = flvRecordingMetaData - .getRecordStart().getTime() + long deltaTimeStartMilliSeconds = metaData.getRecordStart().getTime() - flvRecording.getRecordStart().getTime(); - Float startPadding = Float - .parseFloat(deltaTimeStartMilliSeconds.toString()) / 1000; + double length = ((double)deltaTimeStartMilliSeconds) / 1000; // Calculate delta at ending - Long deltaTimeEndMilliSeconds = flvRecording.getRecordEnd() - .getTime() - - flvRecordingMetaData.getRecordEnd().getTime(); - - Float endPadding = Float - .parseFloat(deltaTimeEndMilliSeconds.toString()) / 1000; - - String[] argv_sox = new String[] { this.getPathToSoX(), - outputGapFullWav, outputFullWav, "pad", - startPadding.toString(), endPadding.toString() }; - - log.debug("START addAudioToWaves ################# "); - String padString = ""; - for (int i = 0; i < argv_sox.length; i++) { - padString += " " + argv_sox[i]; - } - log.debug("padString :: " + padString); - log.debug("END addAudioToWaves ################# "); + long deltaTimeEndMilliSeconds = flvRecording.getRecordEnd().getTime() + - metaData.getRecordEnd().getTime(); + + double endPadding = ((double)deltaTimeEndMilliSeconds) / 1000; - returnLog.add(ProcessHelper.executeScript( - "addStartEndToAudio", argv_sox)); + addSoxPad(returnLog, "addStartEndToAudio", length, endPadding, outputGapFullWav, outputFullWav); // Fix for Audio Length - Invalid Audio Length in Recorded // Files @@ -339,16 +287,14 @@ public abstract class BaseConverter { throw new Exception( "Audio File does not exist , could not extract the Audio correctly"); } - flvRecordingMetaData.setFullWavAudioData(hashFileFullName); + metaData.setFullWavAudioData(hashFileFullName); // Finally add it to the row! listOfFullWaveFiles.add(outputFullWav); } - flvRecordingMetaDataDaoImpl - .updateFlvRecordingMetaData(flvRecordingMetaData); - + flvRecordingMetaDataDaoImpl.updateFlvRecordingMetaData(metaData); } } catch (Exception err) { log.error("[stripAudioFromFLVs]", err);