【问题标题】:Receive DJI Tello's video stream using Java使用 Java 接收 DJI Tello 的视频流
【发布时间】:2020-12-11 20:54:02
【问题描述】:

我正在尝试编写一个用于控制 DJI Tello 无人机的 Java 应用程序。

我已经能够通过使用 java.net.DatagramSocket 作为客户端向无人机发送简单的命令。
Tello SDK 说:
它说我必须使用 java.net.DatagramSocket 作为服务器来接收视频流。 这是我接收视频流的尝试:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class TelloCamera extends Thread {
    private boolean isStreamOn;
    private DatagramSocket serverSocket;
    private byte[] receiveData = new byte[1470];

    public TelloCamera() {
        isStreamOn = true;
    }

    public void run() {
        try {
            serverSocket = new DatagramSocket(11111);
        } catch (SocketException e) {
            e.printStackTrace();
            return;
        }

        while (isStreamOn) {
            receiveData = new byte[1470];
            try {
                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                serverSocket.receive(receivePacket);

                String z = new String(receivePacket.getData());
                System.out.println(z);

            } catch (IOException e) {
                e.printStackTrace();
            }
            isStreamOn = false;
        }
        serverSocket.close();
    }

    public boolean isStreamOn() {
        return isStreamOn;
    }

    public void setStreamOn(boolean streamOn) {
        isStreamOn = streamOn;
    }
}

主要:

package tellotest;

public class maintellotest {

    public static void main(String[] args) {

        TelloCommander tello = new TelloCommander();
        tello.sendCommand("command");
        tello.sendCommand("streamon");
        TelloCamera camera = new TelloCamera();
        camera.start();

    }
}

有人知道为什么我没有将字符串打印到控制台吗?

【问题讨论】:

    标签: java dji-sdk


    【解决方案1】:

    您必须先在 8889 端口向 Tello 发送“streamon”命令,然后在 11111 端口进行监听。但是在您的代码代码中,没有用于发送命令的代码。尝试先添加发送命令的代码,发送“command”,然后发送“streamon”,然后监听端口 11111。

    【讨论】:

    • 正如您在 Main 中看到的,我正在通过 TelloCommander 对象发送“command”和“streamon”。
    • 顺便说一句,我得到一个字符串。你能说我该怎么处理它。我想把它转换成一个框架但是 IDK 怎么做?谁能帮帮我。提前致谢。
    【解决方案2】:

    我也在寻找解决方案,发现了一个很好实现的 Tello java 库,JTello @ https://github.com/xrv0/JTello

    在库中作者使用 JCodec (http://jcodec.org/) 来解码 H.246 流:

    例如:

    // byte[] message refers to the content of the datagram received from the drone over port 1111    
    // Allocate output frame of max size
    Picture out = Picture.create(1920, 1088, ColorSpace.YUV420);
    Picture real = decoder.decodeFrame(ByteBuffer.wrap(message), out.getData());
    

    【讨论】:

      【解决方案3】:

      您需要创建一个IP为“0.0.0.0”和端口为11111的InetSocketAddress,然后将套接字绑定到它。并从 while 循环中删除 isStreamOn = false

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-11
        • 2019-04-10
        • 2016-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多