!7 cmodule VideoSplicer > DynPrintLog { S inputFile, outputFile; S timestamps; transient int audioWindowSize = 44100/10; transient ImageSurface isPreview; visual jvsplit(northAndCenterWithMargins( vstackWithSpacing( withLabel("Input video:", filePathInputWithBrowseButton(dm_textField('inputFile))), withLabel("Output video:", filePathInputWithBrowseButton(dm_textField('outputFile))), rightAlignedLine(jbutton("Load video", rThread loadVideo))), 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.setImage(loadImage2(previewFile)); if (!fileExists(audioFile)) { print("Extracting audio..."); ffmpeg_toMonoAudio(f, audioFile); print("Done - " + fileInfo(audioFile)); } else print("Have audio"); // TODO: audio sample rate print("Getting volume profile..."); int[] profile = decodeWAVToMonoSamples_volumeProfile(audioFile, audioWindowSize); print("Have volume profile (" + nEntries(l(profile)) + ")"); printStruct(takeFirstOfIntArray(100, profile)); } }