use of org.fagu.fmv.ffmpeg.metadatas.VideoStream in project fmv by f-agu.
the class FileCache method scaleForMake.
/**
* @param inFile
* @throws IOException
*/
private void scaleForMake(File inFile) throws IOException {
OutputInfos outputInfos = project.getOutputInfos();
Size makeSize = outputInfos.getSize();
MovieMetadatas metadatas = MovieMetadatas.with(inFile).extract();
VideoStream videoStream = metadatas.getVideoStream();
if (videoStream == null) {
return;
}
Size videoSize = videoStream.size();
if (videoSize.equals(makeSize)) {
return;
}
File makeTmpFile = File.createTempFile(inFile.getName() + "-", "." + FilenameUtils.getExtension(inFile.getName()), inFile.getParentFile());
try {
makeTmpFile.delete();
if (!inFile.renameTo(makeTmpFile)) {
throw new IOException("Unable to rename " + inFile + " to " + makeTmpFile);
}
File toFile = inFile;
FFMPEGExecutorBuilder builder = FFUtils.builder(project);
// input
builder.addMediaInputFile(makeTmpFile);
// filter
builder.filter(Scale.to(makeSize, ScaleMode.fitToBox()));
// output
builder.addMediaOutputFile(toFile).format(outputInfos.getFormat()).overwrite();
FFExecutor<Object> build = builder.build();
build.execute();
} finally {
makeTmpFile.delete();
}
}
use of org.fagu.fmv.ffmpeg.metadatas.VideoStream in project fmv by f-agu.
the class FFHelper method concatFade.
/**
* @param in1VideoFile
* @param in2VideoFile
* @param fadeDuration
* @param outFile
* @throws IOException
*/
public static void concatFade(File in1VideoFile, File in2VideoFile, Duration fadeDuration, File outFile) throws IOException {
FFMPEGExecutorBuilder builder = FFMPEGExecutorBuilder.create();
InputProcessor video1InputProcessor = builder.addMediaInputFile(in1VideoFile);
InputProcessor video2InputProcessor = builder.addMediaInputFile(in2VideoFile);
VideoStream videoStream1 = video1InputProcessor.getMovieMetadatas().getVideoStream();
VideoStream videoStream2 = video2InputProcessor.getMovieMetadatas().getVideoStream();
Optional<Duration> duration1 = videoStream1.duration();
Time startTimeT1 = Time.valueOf(duration1.get().toSeconds() - fadeDuration.toSeconds());
Duration duration0T1 = Duration.valueOf(startTimeT1.toSeconds());
Optional<Duration> duration2 = videoStream2.duration();
Time startTimeT2 = Time.valueOf(duration2.get().toSeconds() - fadeDuration.toSeconds());
Duration durationT2END = Duration.valueOf(startTimeT2.toSeconds());
// source 1: video
NullSourceVideo nullSourceVideo1 = NullSourceVideo.build().size(videoStream1.size()).duration(durationT2END);
Concat concat1V = Concat.create(builder, video1InputProcessor, FilterComplex.create(nullSourceVideo1)).countVideo(1).countAudio(0).countInputs(2);
// source 1: audio
AudioGenerator audioGenerator1 = AudioGenerator.build().silence().duration(durationT2END);
Concat concat1A = Concat.create(builder, video1InputProcessor, FilterComplex.create(audioGenerator1)).countVideo(0).countAudio(1).countInputs(2);
FilterComplex fadeAudio1 = FilterComplex.create(FadeAudio.out().startTime(startTimeT1).duration(fadeDuration)).addInput(concat1A);
// source 2: video
NullSourceVideo nullSourceVideo2 = NullSourceVideo.build().size(videoStream2.size()).duration(duration0T1);
Concat concat2V = Concat.create(builder, FilterComplex.create(nullSourceVideo2), video2InputProcessor).countVideo(1).countAudio(0).countInputs(2);
// source 2: audio
AudioGenerator audioGenerator2 = AudioGenerator.build().silence().duration(duration0T1);
Concat concat2A = Concat.create(builder, FilterComplex.create(audioGenerator2), video2InputProcessor).countVideo(0).countAudio(1).countInputs(2);
FilterComplex fadeAudio2 = FilterComplex.create(FadeAudio.in().startTime(startTimeT1).duration(fadeDuration)).addInput(concat2A);
// blend / merge video
SetSAR setSAR = SetSAR.toRatio("1");
Format formatRGBA = Format.with(PixelFormat.RGBA);
FilterComplex vfc1 = FilterComplex.create(setSAR, formatRGBA).addInput(concat1V);
FilterComplex vfc2 = FilterComplex.create(setSAR, formatRGBA).addInput(concat2V);
Blend blend = Blend.build().mode(Mode.ADDITION).repeatLast(true).opacity(1).exprFade(startTimeT1, fadeDuration);
Format formatYUV = Format.with(PixelFormat.YUVA422P10LE);
FilterComplex vfcBlend = FilterComplex.create(blend, formatYUV).addInput(vfc1).addInput(vfc2);
builder.filter(vfcBlend);
// merge audio
FilterComplex audioMix = AudioMix.build().duration(MixAudioDuration.SHORTEST).addInput(fadeAudio1).addInput(fadeAudio2);
builder.filter(audioMix);
// out
builder.addMediaOutputFile(outFile).overwrite();
FFExecutor<Object> executor = builder.build();
executor.execute();
}
use of org.fagu.fmv.ffmpeg.metadatas.VideoStream in project fmv by f-agu.
the class FFHelper method extractThumbnails2JPEGS.
/**
* @param inFile
* @param outFolder
* @param countFrame
* @return
* @throws IOException
*/
public static ExtractThumbnail extractThumbnails2JPEGS(File inFile, File outFolder, int countFrame) throws IOException {
// extract images
FFMPEGExecutorBuilder builder = FFMPEGExecutorBuilder.create();
// global
builder.hideBanner();
builder.logLevel(LogLevel.INFO);
// input
InputProcessor inputProcessor = builder.addMediaInputFile(inFile);
MovieMetadatas videoMetadatas = inputProcessor.getMovieMetadatas();
VideoStream videoStream = videoMetadatas.getVideoStreams().get(0);
if (!outFolder.exists()) {
outFolder.mkdirs();
}
// filter
SelectVideo selectVideo = SelectVideo.build().countFrame(videoStream, countFrame);
builder.filter(selectVideo);
// output
builder.mux(Image2Muxer.to(new File(outFolder, "out%05d.jpg"))).videoSync(VSync.PASSTHROUGH).overwrite();
FFExecutor<Object> executor = builder.build();
executor.execute();
return ExtractThumbnail.find(outFolder, "out\\d+\\.jpg");
}
use of org.fagu.fmv.ffmpeg.metadatas.VideoStream in project fmv by f-agu.
the class FFReducer method applyScaleIfNecessary.
/**
* @param builder
* @param movieMetadatas
* @param maxSize
* @param logger
* @param rotation
* @return
*/
public static Size applyScaleIfNecessary(FFMPEGExecutorBuilder builder, MovieMetadatas movieMetadatas, Size maxSize, Logger logger, Rotation inRotation) {
VideoStream videoStream = movieMetadatas.getVideoStream();
Size size = videoStream.size();
Rotation rotation = inRotation;
if (rotation == null) {
rotation = videoStream.rotate();
}
if (rotation != null) {
size = rotation.resize(size);
}
if (size.getWidth() <= maxSize.getWidth() && size.getHeight() <= maxSize.getHeight()) {
return size;
}
StringBuilder log = new StringBuilder();
log.append("Need to resize ").append(size);
if (rotation != null) {
log.append(" (rotation of ").append(rotation.getValue()).append(')');
}
size = size.fitAndKeepRatioTo(maxSize);
if (rotation != null && !AutoRotate.isAutoRotateObsolete()) {
size = rotation.resize(size);
}
// fix [libx264 @ 037f8b00] height not divisible by 2 (1078x607)
size = Libx264NotDisibleBy2FFExecFallback.resize(size);
log.append(" to under ").append(maxSize).append(": ").append(size);
logger.log(log.toString());
// .forceOriginalAspectRatio(ForceOriginalAspectRatio.DECREASE)
builder.filter(Scale.to(size, ScaleMode.fitToBoxKeepAspectRatio()));
return size;
}
use of org.fagu.fmv.ffmpeg.metadatas.VideoStream in project fmv by f-agu.
the class Bootstrap method findMovie.
// ---------------------------------------------------
/**
*/
private MovieFinder findMovie(File saveFile, File... srcFiles) throws IOException {
MovieFinder movieFinder = new MovieFinder(saveFile);
movieFinder.addInfoFile(new VolumeInfoFile());
movieFinder.addListener(new FileFinderListener<Movie>() {
private int count;
/**
* @see org.fagu.fmv.utils.file.FileFinderListener#eventFindPre(org.fagu.fmv.utils.file.FileFinder.FileFound)
*/
@Override
public void eventFindPre(FileFound fileFound) {
System.out.println(count + ": " + fileFound.getFileFound().getName());
++count;
}
/**
* @see org.fagu.fmv.utils.file.FileFinderListener#eventFindPost(FileFound, java.lang.Object)
*/
@Override
public void eventFindPost(FileFound fileFound, FileFinder<Movie>.InfosFile infosFile) {
Movie movie = infosFile.getMain();
MovieMetadatas videoMetadatas = movie.getMetadatas();
// Format format = videoMetadatas.getFormat();
VideoStream videoStream = videoMetadatas.getVideoStream();
Rotation rotate = videoStream.rotate();
// System.out.println(count + ": " + file.getName() + " " + infos); // .getFormat().creationDate()
System.out.println(" " + rotate + ", " + videoStream.handlerName());
}
});
for (File srcFile : srcFiles) {
movieFinder.find(srcFile);
}
return movieFinder;
}
Aggregations