Warning: session_start(): open(/var/lib/php/sessions/sess_0r9knavl1ueuh3ubmjlv8l9l1l, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
!7
cmodule VideoSplicer > DynPrintLog {
S inputFile, outputFile;
S timestamps;
transient double profileSamplingInterval = 0.05; // 50 ms
transient int audioWindowSize = iround(profileSamplingInterval*16000);
transient ImageSurface isPreview;
transient JAmplitudeGraph graph;
transient float[] profile;
visual jvsplit(northAndCenterWithMargins(
vstackWithSpacing(
withLabel("Input video:", filePathInputWithBrowseButton(dm_textField('inputFile))),
withLabel("Output video:", filePathInputWithBrowseButton(dm_textField('outputFile))),
rightAlignedLine(
jbutton("Load video", rThread loadVideo),
jbutton("Auto jump cuts!", rThread autoJumpCuts),
jbutton("Make video", rThread makeVideo)),
jsection("Audio", jMinHeight(50, graph =
setForeground(Color.red, swingNu(JAmplitudeGraph))))),
jsection("Timestamps", dm_textArea('timestamps))),
jhsplit(jsection("Preview", jscroll_center(isPreview = jImageSurface())),
super));
void loadVideo enter {
File f = newFile(inputFile);
if (!fileExists(f)) ret with infoBox("File not found: " + f2s(f));
S id = md5(f2s(f));
File previewFile = prepareCacheProgramFile("preview-" + id + ".jpg");
File audioFile = prepareCacheProgramFile("preview-" + id + ".wav");
if (!fileExists(previewFile)) {
print("Getting preview image...");
ffmpeg_getSingleFrame(f, previewFile, 0.0);
print("Done");
} else print("Have preview image");
isPreview.setImageAndZoomToDisplay(loadImage2(previewFile));
if (!fileExists(audioFile)) {
print("Extracting audio...");
ffmpeg_toMonoAudio_16k(f, audioFile);
print("Done - " + fileInfo(audioFile));
} else print("Have audio");
print("Getting volume profile...");
profile = decodeWAVToMonoSamples_floatVolumeProfile(audioFile, audioWindowSize);
print("Have volume profile (" + nEntries(l(profile)) + ")");
//printStruct(takeFirstOfFloatArray(100, profile));
graph.setValues(profile);
}
void makeVideo enter {
if (empty(outputFile)) ret with infoBox("Need output file path");
File in = newFile(inputFile), out = newFile(outputFile);
L ranges = parseTimestampRanges(timestamps);
if (empty(ranges))
ret with infoBox("Need timestamps");
print(+ranges);
if (fileExists(out) && !confirmOKCancel("Overwrite " + fileName(out) + "?")) ret;
temp tempInfoBox_noHide("Splicing video...");
backtickToConsole(ffmpegCmd() + " -y " + ffmpeg_argsForSplice(in, out, ranges));
if (fileExists(out))
infoBox("Done splicing video!" + fileInfo(out));
else
infoBox("Something went wrong...");
}
void autoJumpCuts enter {
if (profile == null) loadVideo();
if (profile == null) ret;
L ranges = audio_findSpeechPartsFromVolumeProfile(profile, profileSamplingInterval);
setField(timestamps := formatTimestampRanges(ranges));
infoBox("Created " + nSlices(ranges) + ", ready to make video");
}
}