Search in sources :

Example 1 with VideoStream

use of org.fagu.fmv.ffmpeg.metadatas.VideoStream in project fmv by f-agu.

the class AutoRotateTestCase method test.

@Test
public void test() {
    MovieMetadatas movieMetadatas = mock(MovieMetadatas.class);
    VideoStream videoStream = mock(VideoStream.class);
    doReturn(videoStream).when(movieMetadatas).getVideoStream();
    doReturn(Optional.of("90")).when(videoStream).tag("rotate");
    AutoRotate.create(movieMetadatas);
}
Also used : MovieMetadatas(org.fagu.fmv.ffmpeg.metadatas.MovieMetadatas) VideoStream(org.fagu.fmv.ffmpeg.metadatas.VideoStream) Test(org.junit.Test)

Example 2 with VideoStream

use of org.fagu.fmv.ffmpeg.metadatas.VideoStream in project fmv by f-agu.

the class Movie method getDevice.

/**
 * @see org.fagu.fmv.media.Media#getDevice()
 */
@Override
public String getDevice() {
    List<String> keys = new ArrayList<>();
    VideoStream videoStream = videoMetadatas.getVideoStream();
    if (videoStream != null) {
        String handlerName = videoStream.handlerName().orElse(null);
        if (StringUtils.isNotEmpty(handlerName)) {
            keys.add(handlerName);
        }
        Size size = videoStream.size();
        if (size != null) {
            keys.add(size.toString());
        }
    }
    AudioStream audioStream = videoMetadatas.getAudioStream();
    if (audioStream != null) {
        String handlerName = audioStream.handlerName().orElse(null);
        if (StringUtils.isNotEmpty(handlerName)) {
            keys.add(handlerName);
        }
        OptionalInt sampleRate = audioStream.sampleRate();
        if (sampleRate.isPresent()) {
            keys.add(sampleRate.getAsInt() + "Hz");
        }
    }
    return keys.stream().collect(Collectors.joining(" "));
}
Also used : AudioStream(org.fagu.fmv.ffmpeg.metadatas.AudioStream) Size(org.fagu.fmv.utils.media.Size) ArrayList(java.util.ArrayList) VideoStream(org.fagu.fmv.ffmpeg.metadatas.VideoStream) OptionalInt(java.util.OptionalInt)

Example 3 with VideoStream

use of org.fagu.fmv.ffmpeg.metadatas.VideoStream in project fmv by f-agu.

the class FFReducer method isVideo.

/**
 * @param metadatas
 * @param logger
 * @return
 */
private boolean isVideo(MovieMetadatas metadatas, Logger logger) {
    if (!metadatas.contains(Type.VIDEO)) {
        logger.log("Is audio: not contains video stream");
        return false;
    }
    VideoStream videoStream = metadatas.getVideoStream();
    OptionalInt numberOfFrames = videoStream.numberOfFrames();
    if (numberOfFrames.isPresent() && numberOfFrames.getAsInt() == 1) {
        logger.log("Is audio: number of frames unavailable: " + numberOfFrames);
        return false;
    }
    if (Decoders.MJPEG.getName().equals(videoStream.codecName().get())) {
        FrameRate frameRate = videoStream.frameRate().orElse(null);
        if (frameRate != null && frameRate.floatValue() < 100) {
            return true;
        }
        logger.log("Is audio: frameRate is null or too high: " + frameRate);
        return false;
    }
    return true;
}
Also used : FrameRate(org.fagu.fmv.ffmpeg.utils.FrameRate) VideoStream(org.fagu.fmv.ffmpeg.metadatas.VideoStream) OptionalInt(java.util.OptionalInt)

Example 4 with VideoStream

use of org.fagu.fmv.ffmpeg.metadatas.VideoStream in project fmv by f-agu.

the class FFReducer method reduceVideo.

/**
 * @param metadatas
 * @param srcFile
 * @param movieMetadatas
 * @param destFile
 * @param consolePrefixMessage
 * @param logger
 * @throws IOException
 */
private boolean reduceVideo(MovieMetadatas metadatas, File srcFile, File destFile, String consolePrefixMessage, Logger logger) throws IOException {
    AudioStream audioStream = metadatas.getAudioStream();
    boolean audioCodecCopy = audioStream.isCodec(Formats.AC3);
    FFMPEGExecutorBuilder builder = FFMPEGExecutorBuilder.create();
    builder.hideBanner();
    InputProcessor inputProcessor = builder.addMediaInputFile(srcFile);
    builder.filter(AutoRotate.create(metadatas));
    applyScaleIfNecessary(builder, metadatas, getMaxSize(), logger);
    VolumeDetect volumeDetect = null;
    if (!audioCodecCopy) {
        volumeDetect = VolumeDetect.build();
        builder.filter(volumeDetect);
    }
    CropDetect cropDetect = CropDetect.build();
    builder.filter(cropDetect);
    MovieMetadatas videoMetadatas = inputProcessor.getMovieMetadatas();
    Collection<AudioStream> audioStreams = StreamOrder.sort(videoMetadatas.getAudioStreams());
    OutputProcessor outputProcessor = builder.addMediaOutputFile(destFile);
    outputProcessor.qualityScale(0);
    // video
    for (Stream stream : videoMetadatas.getVideoStreams()) {
        logger.log("map[" + stream.index() + "] video: " + stream);
        outputProcessor.map().streams(stream).input(inputProcessor);
    }
    // audio
    for (Stream stream : audioStreams) {
        logger.log("map[" + stream.index() + "] audio: " + stream);
        outputProcessor.map().streams(stream).input(inputProcessor);
    }
    // subtitle
    Collection<SubtitleStream> subtitleStreams = StreamOrder.sort(videoMetadatas.getSubtitleStreams());
    for (Stream stream : subtitleStreams) {
        logger.log("map[" + stream.index() + "] subtitle: " + stream);
        outputProcessor.map().streams(stream).input(inputProcessor);
    }
    // other stream (Apple... again bullshit)
    // for (Stream stream : videoMetadatas.getStreams()) {
    // Type type = stream.type();
    // if (type != Type.AUDIO && type != Type.VIDEO && type != Type.SUBTITLE) {
    // logger.log("map other stream: " + stream);
    // outputProcessor.map().streams(stream).input(inputProcessor);
    // }
    // }
    // -------------------------- codec -------------------------
    outputProcessor.codec(H264.findRecommanded().strict(Strict.EXPERIMENTAL).quality(crf));
    // audio
    if (audioCodecCopy) {
        logger.log("Audio: AC3, copy");
        outputProcessor.codecCopy(Type.AUDIO);
    } else {
        logger.log("Audio: force AAC");
        outputProcessor.codecAutoSelectAAC();
    }
    // subtitle
    if (videoMetadatas.contains(Type.SUBTITLE)) {
        outputProcessor.codecCopy(Type.SUBTITLE);
    }
    outputProcessor.overwrite();
    FFExecutor<Object> executor = builder.build();
    executor.addListener(createLogFFExecListener(logger));
    executor.addListener(createCropDetectFFExecListener(logger, cropDetect, videoMetadatas));
    if (!audioCodecCopy) {
        executor.addListener(createVolumeDetectFFExecListener(logger, volumeDetect));
    }
    VideoStream videoStream = metadatas.getVideoStream();
    OptionalInt countEstimateFrames = videoStream.countEstimateFrames();
    Progress progress = executor.getProgress();
    if (countEstimateFrames.isPresent() && progress != null) {
        textProgressBar = FFMpegProgressBar.with(progress).byFrame(countEstimateFrames.getAsInt()).fileSize(srcFile.length()).build().makeBar(consolePrefixMessage);
    } else {
        StringJoiner joiner = new StringJoiner(", ");
        if (progress == null) {
            joiner.add("progress not found");
        }
        if (!countEstimateFrames.isPresent()) {
            joiner.add("nb frames nout found");
        }
        logger.log("No progress bar: " + joiner.toString());
    }
    executor.execute();
    Optional<String> codecName = videoStream.codecName();
    if (codecName.isPresent() && codecName.get().equalsIgnoreCase(Formats.HEVC.getName())) {
        // h265
        return true;
    }
    return false;
}
Also used : FFMPEGExecutorBuilder(org.fagu.fmv.ffmpeg.executor.FFMPEGExecutorBuilder) Progress(org.fagu.fmv.ffmpeg.operation.Progress) VolumeDetect(org.fagu.fmv.ffmpeg.filter.impl.VolumeDetect) SubtitleStream(org.fagu.fmv.ffmpeg.metadatas.SubtitleStream) VideoStream(org.fagu.fmv.ffmpeg.metadatas.VideoStream) InputProcessor(org.fagu.fmv.ffmpeg.operation.InputProcessor) OptionalInt(java.util.OptionalInt) CropDetect(org.fagu.fmv.ffmpeg.filter.impl.CropDetect) AudioStream(org.fagu.fmv.ffmpeg.metadatas.AudioStream) MovieMetadatas(org.fagu.fmv.ffmpeg.metadatas.MovieMetadatas) OutputProcessor(org.fagu.fmv.ffmpeg.operation.OutputProcessor) Stream(org.fagu.fmv.ffmpeg.metadatas.Stream) SubtitleStream(org.fagu.fmv.ffmpeg.metadatas.SubtitleStream) VideoStream(org.fagu.fmv.ffmpeg.metadatas.VideoStream) AudioStream(org.fagu.fmv.ffmpeg.metadatas.AudioStream) StringJoiner(java.util.StringJoiner)

Example 5 with VideoStream

use of org.fagu.fmv.ffmpeg.metadatas.VideoStream in project fmv by f-agu.

the class FFReducer method needToReduceAudio.

/**
 * @param metadatas
 * @param srcFile
 * @return
 */
private boolean needToReduceAudio(MovieMetadatas metadatas, File srcFile) {
    AudioStream audioStream = metadatas.getAudioStream();
    String extension = FilenameUtils.getExtension(srcFile.getName());
    if (!audioFormat.equalsIgnoreCase(extension) || audioStream.bitRate().getAsInt() > 128000) {
        return true;
    }
    VideoStream videoStream = metadatas.getVideoStream();
    if (videoStream != null && Decoders.MJPEG.getName().equals(videoStream.codecName().get())) {
        // has cover
        return true;
    }
    return false;
}
Also used : AudioStream(org.fagu.fmv.ffmpeg.metadatas.AudioStream) VideoStream(org.fagu.fmv.ffmpeg.metadatas.VideoStream)

Aggregations

VideoStream (org.fagu.fmv.ffmpeg.metadatas.VideoStream)21 MovieMetadatas (org.fagu.fmv.ffmpeg.metadatas.MovieMetadatas)11 FFMPEGExecutorBuilder (org.fagu.fmv.ffmpeg.executor.FFMPEGExecutorBuilder)8 InputProcessor (org.fagu.fmv.ffmpeg.operation.InputProcessor)8 File (java.io.File)6 AudioStream (org.fagu.fmv.ffmpeg.metadatas.AudioStream)5 Duration (org.fagu.fmv.utils.time.Duration)5 OptionalInt (java.util.OptionalInt)4 FilterComplex (org.fagu.fmv.ffmpeg.filter.FilterComplex)4 AudioGenerator (org.fagu.fmv.ffmpeg.filter.impl.AudioGenerator)4 MixAudioDuration (org.fagu.fmv.ffmpeg.filter.impl.AudioMix.MixAudioDuration)4 Blend (org.fagu.fmv.ffmpeg.filter.impl.Blend)4 Concat (org.fagu.fmv.ffmpeg.filter.impl.Concat)4 Format (org.fagu.fmv.ffmpeg.filter.impl.Format)4 NullSourceVideo (org.fagu.fmv.ffmpeg.filter.impl.NullSourceVideo)4 SetSAR (org.fagu.fmv.ffmpeg.filter.impl.SetSAR)4 OutputProcessor (org.fagu.fmv.ffmpeg.operation.OutputProcessor)4 PixelFormat (org.fagu.fmv.ffmpeg.utils.PixelFormat)4 Size (org.fagu.fmv.utils.media.Size)4 Time (org.fagu.fmv.utils.time.Time)4