utiliser java-ffmpeg wrapper, ou tout simplement utiliser java runtime pour exécuter ffmpeg?

Je suis assez nouveau en Java, j'ai besoin d'écrire un programme qui écoute les instructions de conversion vidéo et de convertir la vidéo Une fois qu'une nouvelle instruction arrive (les instructions sont stockées dans Amazon SQS, mais ce n'est pas pertinent à ma question)

je suis face à un choix, soit utiliser Java RunTime pour la conversion exec 'ffmpeg' (comme depuis la ligne de commande), soit je peux utiliser un inJava écrit par enveloppe ffmpeg http://fmj-sf.net/ffmpeg-java/getting_started.php

je préférerais utiliser Java Runtime to exec ffmpeg directement, et éviter d'utiliser java-ffmpeg wrapper car je dois apprendre la bibliothèque. ma question est donc de savoir s'il y a des avantages à utiliser java-ffmpeg wrapper sur exec ffmpeg directement en utilisant Runtime? Je n'ai pas besoin de ffmpeg pour lire les vidéos, il suffit de convertir les vidéos

Merci

36
demandé sur Andrew Thompson 2009-08-15 10:59:23

8 réponses

si Je ne me trompe pas, le projet "ffmpeg wrapper" auquel vous avez fait référence est dépassé et n'est pas maintenu. ffmpeg est un projet très actif, beaucoup de changements et de sorties tout le temps.

vous devriez regarder le projet Xuggler, cela fournit une API Java pour ce que vous voulez faire, et ils ont une intégration étroite avec ffmpeg.

http://www.xuggle.com/xuggler/

si vous choisissez d'arrêter L'exécution.exec () path, ce thread Red5 devrait être utile:

http://www.nabble.com/java-call-ffmpeg-ts15886850.html

34
répondu Peter Thomas 2009-08-15 08:19:35

moi aussi je cherche quelque chose pour envelopper FFMPEG en Java. En cherchant, j'ai trouvé ceci: https://github.com/bramp/ffmpeg-cli-wrapper.

A partir d'aujourd'hui, il semble avoir été modifié il y a un mois. Donc, j'espère qu'il va rester pour un certain temps.

Un échantillon de leurs docs:

FFmpeg ffmpeg = new FFmpeg("/path/to/ffmpeg");
FFprobe ffprobe = new FFprobe("/path/to/ffprobe");

FFmpegBuilder builder = new FFmpegBuilder()
    .setInput(in)
    .overrideOutputFiles(true)
    .addOutput("output.mp4")
        .setFormat("mp4")
        .setTargetSize(250000)

        .disableSubtitle()

        .setAudioChannels(1)
        .setAudioCodec("libfdk_aac")
        .setAudioRate(48000)
        .setAudioBitrate(32768)

        .setVideoCodec("libx264")
        .setVideoFramerate(Fraction.getFraction(24, 1))
        .setVideoResolution(640, 480)

        .setStrict(FFmpegBuilder.Strict.EXPERIMENTAL)
        .done();

FFmpegExecutor executor = new FFmpegExecutor(ffmpeg, ffprobe);
executor.createTwoPassJob(builder).run();
20
répondu mateuscb 2015-08-26 15:03:30

aussi, à partir de Xuggler 3.3, Xuggler est LGPL ce qui signifie que vous n'avez pas besoin d'une licence commerciale.

8
répondu Art Clarke 2009-11-06 21:29:49

il y a beaucoup de bibliothèques Java qui fournissent FFMPEG wrappers. Cependant, la plupart de ces bibliothèques sont malheureusement dépassées et utilisent les anciennes versions de FFMPEG qui manquent de codecs importants (par exemple Xuggler, humble video, JavaAV, JavaAVC, et jave). Alors faites attention quand vous utilisez ces projets!

cependant, il y a un emballage FFMPEG qui est encore développé activement et prend en charge FFMPEG 3 aussi:

vous pouvez aussi utiliser un wrapper pour l'interface en ligne de commande de FFMPEG, comme ffmpeg-cli-wrapper. Ensuite, c'est dans votre main pour mettre à jour ffmpeg manuellement sans avoir à attendre une nouvelle version de la bibliothèque d'encapsulation.

7
répondu Stefan Endrullis 2016-08-08 13:51:42

j'ai écrit ma propre ligne de commande java ffmpeg wrapper:Jaffree. Il travaille à la fois avec ffprobe et ffmpeg et prend en charge la production et la consommation vidéo programmées. Aussi, il a à mon avis plus pratique fluide API.

FFprobeResult result = FFprobe.atPath(BIN)
        .setInputPath(VIDEO_MP4)
        .setShowStreams(true)
        .setShowError(true)
        .execute();

if (result.getError() != null) {
    //TODO handle ffprobe error message
    return;
}

for (Stream stream : probe.getStreams().getStream()) {
    //TODO analyze stream data
}

ProgressListener listener = new ProgressListener() {
    @Override
    public void onProgress(FFmpegProgress progress) {
        //TODO handle progress data
    }
};
FFmpegResult result = FFmpeg.atPath(BIN)
        .addInput(Input.fromPath(VIDEO_MP4))
        .addOutput(Output.toPath(outputPath)
                .addCodec(null, "copy")
        )
        .setProgressListener(listener)
        .execute();
5
répondu Denis Kokorin 2018-04-29 10:37:28
4
répondu sohilv 2010-04-01 11:12:20

les avantages de l'utilisation du wrapper seraient principalement qu'il offre plus de fonctionnalités à grain fin non accessibles via la ligne de commande (ne s'applique pas à vous) et rend la manipulation des erreurs et le contrôle de l'état plus facile-vous devrez analyser les flux de sortie et d'erreur standard de l'outil en ligne de commande.

3
répondu Michael Borgwardt 2009-08-15 07:34:14

j'essaie plusieurs façons, la plus simple pour moi est ffmpeg-cli-wrapper, parce qu'il utilise par défaut ffmpeg ou un spécifique, de plus vous pouvez configurer beaucoup de configuration comme scale, bitrate... obtenir la durée... JAVE de sauronsoftware faire beaucoup d'erreur, XUGGLE et d'autres je l'ai trouvé trop compliqué

0
répondu cyril 2017-05-31 11:25:34