it-swarm.com.de

verwenden Sie den Java-ffmpeg-Wrapper oder verwenden Sie einfach die Java-Laufzeitumgebung, um ffmpeg auszuführen.

Ich bin relativ neu in Java. Ich muss ein Programm schreiben, das Anweisungen zur Videokonvertierung hört und das Video konvertiert, sobald eine neue Anweisung eintrifft. (Anweisungen werden in Amazon SQS gespeichert, sind aber für meine Frage irrelevant.)

Ich stehe vor einer Wahl. Entweder verwende Java RunTime, um die 'ffmpeg'-Konvertierung auszuführen (wie von der Befehlszeile aus), oder ich kann einen ffJmp-Wrapper verwenden, der in Java http://fmj-sf.net/ffmpeg-Java/getting_started geschrieben ist .php

Ich würde Java Runtime viel lieber als direktes Ausführen von ffmpeg verwenden und die Verwendung des Java-ffmpeg-Wrappers vermeiden, da ich die Bibliothek lernen muss. meine Frage ist also, gibt es irgendwelche Vorteile bei der Verwendung von Java-ffmpeg-Wrapper gegenüber exec ffmpeg direkt bei der Runtime? Ich brauche nicht ffmpeg, um Videos abzuspielen, nur Videos konvertieren

Vielen Dank

36
Beier

Wenn ich mich nicht irre, ist das Projekt "ffmpeg wrapper", mit dem Sie verlinkt haben, nicht mehr aktuell und wird nicht verwaltet. ffmpeg ist ein sehr aktives Projekt, viele Änderungen und Veröffentlichungen.

Sie sollten sich das Xuggler-Projekt ansehen. Dieses bietet eine Java-API für das, was Sie tun möchten, und sie sind eng mit ffmpeg integriert.

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

Wenn Sie sich für den Pfad Runtime.exec () entscheiden, sollte dieser Red5-Thread nützlich sein:

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

34
Peter Thomas

Auch ich suche nach etwas, das FFMPEG in Java einwickelt. Bei der Suche habe ich Folgendes gefunden: https://github.com/bramp/ffmpeg-cli-wrapper .

Bis heute scheint es vor einem Monat geändert worden zu sein. Hoffentlich bleibt es noch eine Weile.

Ein Beispiel aus ihren Dokumenten:

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

Es gibt viele Java-Bibliotheken, die FFMPEG-Wrapper bereitstellen. Die meisten dieser Bibliotheken sind jedoch leider veraltet und verwenden alte FFMPEG-Versionen, denen wichtige Codecs fehlen (z. B. Xuggler, bescheidene Videos, JavaAV, JavaAVC und Java). Seien Sie also vorsichtig bei diesen Projekten!

Es gibt jedoch einen FFMPEG-Wrapper, der noch active entwickelt ist und auch FFMPEG 3 unterstützt:

Alternativ können Sie einen Wrapper für die Befehlszeilenschnittstelle von FFMPEG verwenden, z. B. ffmpeg-cli-wrapper . Dann liegt es in Ihrer Hand, ffmpeg manuell zu aktualisieren, ohne auf eine neue Version der Wrapper-Bibliothek warten zu müssen.

8

Seit Xuggler 3.3 ist Xuggler LGPL, dh Sie benötigen keine kommerzielle Lizenz.

8
Art Clarke

Ich habe meinen eigenen Java-ffmpeg-Befehlszeilen-Wrapper geschrieben: Jaffree . Es funktioniert sowohl mit ffprobe als auch mit ffmpeg und unterstützt die programmatische Videoproduktion und den Videoverbrauch. Außerdem hat es meiner Meinung nach mehr Komfort-API.

Hier ist ein Verwendungsbeispiel für 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
    }
};

Und das ist für ffmpeg:

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

sie können jave http://www.sauronsoftware.it/projects/jave ausprobieren.

4
sohilv

Die Vorteile der Verwendung des Wrappers liegen hauptsächlich darin, dass er mehr und feinere Funktionen bietet, die nicht über die Befehlszeile (nicht für Sie relevant) zugänglich sind, und die Fehlerbehandlung und Statuskontrolle vereinfacht. Sie müssen den Standard des Befehlszeilen-Tools parsen Ausgabe- und Fehlerströme.

3

ich versuche mehrere Möglichkeiten, die einfachste ist für mich ffmpeg-cli-wrapper, da er standardmäßig ffmpeg oder eine bestimmte verwendet. Außerdem können Sie viele Konfigurationen wie Skalierung, Bitrate konfigurieren ... Dauer abrufen ... JAVE aus Sauronsoftware machen viel Fehler, XUGGLE und andere fand ich zu kompliziert

0
cyril