ffmpeg-java

Java Interface for FFmpeg Command-line

License

License

Categories

Categories

Java Languages
GroupId

GroupId

com.itshidu.ffmpeg
ArtifactId

ArtifactId

ffmpeg-java
Last Version

Last Version

1.0
Release Date

Release Date

Type

Type

jar
Description

Description

ffmpeg-java
Java Interface for FFmpeg Command-line
Project URL

Project URL

https://github.com/XiaZengming/ffmpeg-java.git
Source Code Management

Source Code Management

https://github.com/XiaZengming/ffmpeg-java.git

Download ffmpeg-java

How to add to project

<!-- https://jarcasting.com/artifacts/com.itshidu.ffmpeg/ffmpeg-java/ -->
<dependency>
    <groupId>com.itshidu.ffmpeg</groupId>
    <artifactId>ffmpeg-java</artifactId>
    <version>1.0</version>
</dependency>
// https://jarcasting.com/artifacts/com.itshidu.ffmpeg/ffmpeg-java/
implementation 'com.itshidu.ffmpeg:ffmpeg-java:1.0'
// https://jarcasting.com/artifacts/com.itshidu.ffmpeg/ffmpeg-java/
implementation ("com.itshidu.ffmpeg:ffmpeg-java:1.0")
'com.itshidu.ffmpeg:ffmpeg-java:jar:1.0'
<dependency org="com.itshidu.ffmpeg" name="ffmpeg-java" rev="1.0">
  <artifact name="ffmpeg-java" type="jar" />
</dependency>
@Grapes(
@Grab(group='com.itshidu.ffmpeg', module='ffmpeg-java', version='1.0')
)
libraryDependencies += "com.itshidu.ffmpeg" % "ffmpeg-java" % "1.0"
[com.itshidu.ffmpeg/ffmpeg-java "1.0"]

Dependencies

compile (6)

Group / Artifact Type Version
org.slf4j : slf4j-api jar 1.7.25
com.google.guava : guava jar 20.0
commons-io : commons-io jar 2.5
org.apache.commons : commons-lang3 jar 3.5
com.google.code.gson : gson jar 2.8.0
org.modelmapper : modelmapper jar 2.3.4

provided (2)

Group / Artifact Type Version
com.google.code.findbugs : annotations jar 3.0.1u2
com.google.errorprone : error_prone_annotations jar 2.0.19

test (6)

Group / Artifact Type Version
ch.qos.logback : logback-classic jar 1.2.2
junit : junit jar 4.12
org.mockito : mockito-core jar 2.7.19
org.hamcrest : hamcrest-integration jar 1.3
com.nitorcreations : matchers jar 1.3
org.glassfish.grizzly : grizzly-http-server jar 2.3.30

Project Modules

There are no modules declared in this project.

ffmpeg-java

Java Interface for FFmpeg Command-line

引入Maven依赖:

<dependency>
    <groupId>com.itshidu.ffmpeg</groupId>
    <artifactId>ffmpeg-java</artifactId>
    <version>1.0</version>
</dependency>

获取媒体信息

import com.alibaba.fastjson.JSON
import com.itshidu.ffmpeg.FFprobe
import com.itshidu.ffmpeg.probe.FFmpegFormat
import com.itshidu.ffmpeg.probe.FFmpegProbeResult
import com.itshidu.ffmpeg.probe.FFmpegStream

public class GetMediaInformation {
    final static String FFMPEG_HOME = "D:/Documents/ProgramFiles/ffmpeg-20190219-ff03418-win64-static/bin/"
    public static void main(String[] args) {


        FFprobe ffprobe = new FFprobe(FFMPEG_HOME+"ffprobe.exe")
        FFmpegProbeResult probeResult = ffprobe.probe("D:/abc/002.mp4")

        FFmpegFormat format = probeResult.getFormat()
        System.out.format("%nFile: '%s' ; Format: '%s' ; Duration: %.3fs",
                format.filename,
                format.format_long_name,
                format.duration
        );

        FFmpegStream stream = probeResult.getStreams().get(0);
        System.out.format("%nCodec: '%s' ; Width: %dpx ; Height: %dpx",
                stream.codec_long_name,
                stream.width,
                stream.height
        );
        println("----------------")
        println(JSON.toJSONString(format))
        println(JSON.toJSONString(stream))
    }
}

视频转码

import com.itshidu.ffmpeg.FFmpeg
import com.itshidu.ffmpeg.FFmpegExecutor
import com.itshidu.ffmpeg.FFprobe
import com.itshidu.ffmpeg.builder.FFmpegBuilder

public class VideoEncoding {
    final static String FFMPEG_HOME = "D:/Documents/ProgramFiles/ffmpeg-20190219-ff03418-win64-static/bin/";
    public static void main(String[] args) {
        FFmpeg ffmpeg = new FFmpeg(FFMPEG_HOME+"ffmpeg.exe");
        FFprobe ffprobe = new FFprobe(FFMPEG_HOME+"ffprobe.exe");

        FFmpegBuilder builder = new FFmpegBuilder()

                .setInput("002.mp4")     // Filename, or a FFmpegProbeResult
                .overrideOutputFiles(true) // Override the output if it exists

                .addOutput("output.mp4")   // Filename for the destination
                .setFormat("mp4")        // Format is inferred from filename, or can be set
                .setTargetSize(250_000)  // Aim for a 250KB file

                .disableSubtitle()       // No subtiles

                .setAudioChannels(1)         // Mono audio
                .setAudioCodec("aac")        // using the aac codec
                .setAudioSampleRate(48_000)  // at 48KHz
                .setAudioBitRate(32768)      // at 32 kbit/s

                .setVideoCodec("libx264")     // Video using x264
                .setVideoFrameRate(24, 1)     // at 24 frames per second
                .setVideoResolution(640, 480) // at 640x480 resolution

                .setStrict(FFmpegBuilder.Strict.EXPERIMENTAL) // Allow FFmpeg to use experimental specs
                .done();

        FFmpegExecutor executor = new FFmpegExecutor(ffmpeg, ffprobe);

        executor.createJob(builder).run()

// Or run a two-pass encode (which is better quality at the cost of being slower)
        executor.createTwoPassJob(builder).run()
    }
}

转码时进度监听

import com.itshidu.ffmpeg.FFmpeg
import com.itshidu.ffmpeg.FFmpegExecutor
import com.itshidu.ffmpeg.FFmpegUtils
import com.itshidu.ffmpeg.FFprobe
import com.itshidu.ffmpeg.builder.FFmpegBuilder
import com.itshidu.ffmpeg.job.FFmpegJob
import com.itshidu.ffmpeg.probe.FFmpegProbeResult
import com.itshidu.ffmpeg.progress.Progress
import com.itshidu.ffmpeg.progress.ProgressListener

import java.util.concurrent.TimeUnit

class GetProgressWhileEncoding {
    final static String FFMPEG_HOME = "D:/Documents/ProgramFiles/ffmpeg-20190219-ff03418-win64-static/bin/"
    public static void main(String[] args) {

        FFmpeg ffmpeg = new FFmpeg(FFMPEG_HOME+"ffmpeg.exe")
        FFprobe ffprobe = new FFprobe(FFMPEG_HOME+"ffprobe.exe")

        FFmpegExecutor executor = new FFmpegExecutor(ffmpeg, ffprobe)
        FFmpegProbeResult probeResult = ffprobe.probe("D:/abc/002.mp4")
        FFmpegBuilder builder = new FFmpegBuilder()
                .setInput(probeResult) // Or filename
                .addOutput("D:/abc/002_output.mp4")
                .done()
        final double duration_ns = probeResult.getFormat().duration * TimeUnit.SECONDS.toNanos(1);
        FFmpegJob job = executor.createJob(builder, new ProgressListener() {
            // Using the FFmpegProbeResult determine the duration of the input


            public void progress(Progress progress) {
                double percentage = progress.out_time_ns / duration_ns;

                // Print out interesting information about the progress
                System.out.println(String.format(
                        "[%.0f%%] status:%s frame:%d time:%s ms fps:%.0f speed:%.2fx",
                        percentage * 100,
                        progress.status,
                        progress.frame,
                        FFmpegUtils.toTimecode(progress.out_time_ns, TimeUnit.NANOSECONDS),
                        progress.fps.doubleValue(),
                        progress.speed
                ));
            }
        });

        job.run();
    }
}

Versions

Version
1.0