【问题标题】:How to put FFmpeg ffplay frame into my own Java application?如何将 FFmpeg ffplay 框架放入我自己的 Java 应用程序中?
【发布时间】:2015-10-17 20:05:03
【问题描述】:

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

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

【问题讨论】:

    标签: java video ffmpeg ar.drone


    【解决方案1】:

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

    有一些方法可以解决这个问题,您可以自己包装 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();
        }
    }
    

    你可以在this GitHub repository找到完整的实现。

    【讨论】:

      【解决方案2】:

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

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

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

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

      Xuggler and playing from live stream

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

      【讨论】:

        猜你喜欢
        • 2020-07-14
        • 2012-12-21
        • 1970-01-01
        • 1970-01-01
        • 2011-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-01
        相关资源
        最近更新 更多