这个问题很老,但我刚刚找到它,所以我决定为其他用户编写一个可能的解决方案。
有一些方法可以解决这个问题,可以自己包装 FFmpeg CLI for Java 或使用包装的 FFmpeg 库。前者需要相当长的时间和精力才能做到。而后者使用起来会更实用。
例如,一个不错的库是JavaCV。您只需使用以下pom.xml
文件将 maven 存储库添加到您的项目中:
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.4.3</version>
</dependency>
然后,您可以创建一个SimplePlayer
类并使用FFmpegFrameGrabber
该类来解码转换为图像并显示在您的 Java 应用程序中的帧。
public class SimplePlayer
{
private static volatile Thread playThread;
private AnimationTimer timer;
private int counter;
public SimplePlayer(String source, GrabberListener grabberListener)
{
if (grabberListener == null) return;
if (source.isEmpty()) return;
counter = 0;
playThread = new Thread(() -> {
try {
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(source);
grabber.start();
grabberListener.onMediaGrabbed(grabber.getImageWidth(), grabber.getImageHeight());
Java2DFrameConverter converter = new Java2DFrameConverter();
while (!Thread.interrupted()) {
Frame frame = grabber.grab();
if (frame == null) {
break;
}
if (frame.image != null) {
Image image = SwingFXUtils.toFXImage(converter.convert(frame), null);
Platform.runLater(() -> {
grabberListener.onImageProcessed(image);
});
}
grabber.stop();
grabber.release();
Platform.exit();
} catch (Exception exception) {
System.exit(1);
}
});
playThread.start();
}
public void stop()
{
playThread.interrupt();
}
}
您可以在此 GitHub 存储库中找到完整的实现。