web-dev-qa-db-fra.com

utiliser l'encapsuleur Java-ffmpeg ou simplement utiliser le runtime Java 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 convertit la vidéo une fois qu'une nouvelle instruction arrive (les instructions sont stockées dans Amazon SQS, mais cela n'a aucune pertinence pour ma question).

Je suis confronté à un choix: utiliser Java RunTime pour exécuter la conversion 'ffmpeg' (comme en ligne de commande) ou utiliser un wrapper ffmpeg écrit en java http://fmj-sf.net/ffmpeg-Java/getting_started .php

Je préférerais de loin utiliser Java Runtime pour exécuter directement ffmpeg, et éviter d'utiliser l'encapsuleur Java-ffmpeg car je dois apprendre la bibliothèque. Ma question est la suivante: y at-il des avantages à utiliser l'encapsuleur Java-ffmpeg par rapport à exec ffmpeg directement à l'aide de Runtime? Je n'ai pas besoin de ffmpeg pour lire des vidéos, il suffit de convertir des vidéos

Merci

36
Beier

Si je ne me trompe pas, le projet "ffmpeg wrapper" auquel vous avez lié est obsolète et n'est pas maintenu. ffmpeg est un projet très actif, il y a 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 de descendre le chemin Runtime.exec (), ce thread Red5 devrait être utile:

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

34
Peter Thomas

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

À ce jour, il semble avoir été modifié il y a un mois. Donc, j'espère que ça va rester pendant un moment.

Un échantillon de leurs documents:

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
mateuscb

Il existe de nombreuses bibliothèques Java fournissant des wrappers FFMPEG. Cependant, la plupart de ces bibliothèques sont malheureusement obsolètes et utilisent les anciennes versions de FFMPEG ne contenant pas certains codecs importants (par exemple, Xuggler, humble video, JavaAV, JavaAVC et jave). Alors soyez prudent lorsque vous utilisez ces projets!

Cependant, il existe un wrapper FFMPEG qui est toujours activement développé et qui supporte FFMPEG 3 également:

Vous pouvez également utiliser un wrapper pour l'interface de ligne de commande de FFMPEG, tel que ffmpeg-cli-wrapper . Ensuite, vous pouvez mettre à jour ffmpeg manuellement sans attendre la nouvelle version de la bibliothèque d'encapsuleurs.

8
Stefan Endrullis

En outre, depuis Xuggler 3.3, Xuggler est LGPL, ce qui signifie que vous n’avez pas besoin d’une licence commerciale.

8
Art Clarke

J'ai écrit mon propre wrapper de ligne de commande Java ffmpeg: Jaffree . Il fonctionne à la fois avec ffprobe et ffmpeg et prend en charge la production et la consommation de vidéos programmatiques ..__ En outre, il possède à mon avis une API fluide plus pratique.

Voici un exemple d'utilisation de ffprobe:

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
    }
};

Et ceci est pour ffmpeg:

FFmpegResult result = FFmpeg.atPath(BIN)
        .addInput(Input.fromPath(VIDEO_MP4))
        .addOutput(Output.toPath(outputPath)
                .addCodec(null, "copy")
        )
        .setProgressListener(listener)
        .execute();
6
Denis Kokorin
4
sohilv

L'avantage d'utiliser le wrapper serait principalement qu'il offre davantage de fonctionnalités fines non accessibles via la ligne de commande (qui ne vous concernent pas) et facilite la gestion des erreurs et le contrôle de l'état - vous devrez analyser le standard de l'outil de ligne de commande. flux de sortie et d'erreur.

3
Michael Borgwardt

j'essaie plusieurs manières, la plus simple pour moi est ffmpeg-cli-wrapper, car elle utilise ffmpeg par défaut ou une valeur spécifique. De plus, vous pouvez configurer beaucoup de configurations telles que scale, bitrate ... get duration ... JAVE de sauronsoftware rend beaucoup d'erreur, XUGGLE et d'autres je l'ai trouvé trop compliqué

0
cyril