1

我收到来自 Parrot AR.Drone 2.0 的实时视频反馈。我能够从无人机获取传入的视频流(使用 command-ffplay tcp://192.168.1.1:5555)并成功为我输出实时视频。我注意到 ffplay 将与实时视频一起显示自己的帧。

那么,是否可以在应用程序中“直接”或将框架放入我们自己的 Java 框架中?如果我想在我自己的 JCheckBox 中实现该功能,我该如何实现呢?EG 如果我单击 JCheckBox,它应该自动从无人机获取实时视频流并在应用程序中为我显示,而不是使用 ffplay 帧?

4

2 回答 2

0

这个问题很老,但我刚刚找到它,所以我决定为其他用户编写一个可能的解决方案。

有一些方法可以解决这个问题,可以自己包装 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 存储库中找到完整的实现。

于 2018-12-03T05:32:33.727 回答
-1

您需要解码 AR.Drone 使用的几乎但不完全的 H264 视频格式。为此,您需要做两件事:

  1. 处理 AR.Drone 的自定义视频帧,该帧使用 PaVE 格式的标题。该格式记录在AR.Drone 开发人员指南的第 7.3 节中,但几乎所有现有的 AR.Drone 库都有处理 PaVE 标头的代码。

  2. 解码剩余的 H264 视频帧。 Xuggler使用 Java 封装了本地库,并且可能是解码 H264 的最佳、最快的方法。一个替代方案是h264j库,它是纯 Java 的,但速度较慢并且有一些解码故障。

有关详细信息,请参阅以下相关问题:

Xuggler 和从直播中播放

https://stackoverflow.com/questions/30307003/use-a-xuggler-videostream-in-javacv

于 2015-09-03T23:20:46.957 回答