Получение ошибки LiveStreamManager -3 в DJI Mobile SDK при попытке потоковой передачи в пользовательский RTMP?

Я пытаюсь реализовать приложение, которое отправляет живое видео с дрона на мой собственный сервер rtmp. Когда я использую LiveStreamManager из DJI Mobile SDK, он выдает мне код ошибки -3, и поток не запускается. Как я могу использовать этот API?

Мое приложение успешно регистрируется, я могу настраивать миссии и получать телеметрию от дрона. Но когда я пытаюсь использовать LiveStreamManeger, это не сработает, несмотря ни на что. Даже если реализовать именно так, как это реализовано в Образец кода, это не сработает. В документации в справочнике DJI API, похоже, также отсутствуют несколько методов.

Вот моя реализация

    private void setupLiveStream() {
        DJISDKManager.getInstance().getLiveStreamManager().registerListener(listener);
        initListener();
        DJISDKManager.getInstance().getLiveStreamManager().setAudioStreamingEnabled(false);
        DJISDKManager.getInstance().getLiveStreamManager().setVideoSource(LiveStreamManager.LiveStreamVideoSource.Primary);
        liveURL = "rtmp://mycustomrtmp.com/drone/live_testDJI";
    }

    private void initListener() {
        listener = new LiveStreamManager.OnLiveChangeListener() {
            @Override
            public void onStatusChanged(int i) {
                setResultToToast("status changed : " + i);
            }
        };
    }
    private void StartStreaming(){
        if (!isLiveStreamManagerOn()) {
            return;
        }
        if (DJISDKManager.getInstance().getLiveStreamManager().isStreaming()) {
            setResultToToast("already started the Stream!");
            return;
        }
        new Thread() {
            @Override
            public void run() {
                DJISDKManager.getInstance().getLiveStreamManager().setLiveUrl(liveURL);// + vehicleID);
                int result = DJISDKManager.getInstance().getLiveStreamManager().startStream();
                DJISDKManager.getInstance().getLiveStreamManager().setStartTime();
                setResultToToast("LiveStream Start: " + result +
                        "\n isVideoStreamSpeedConfigurable:" + DJISDKManager.getInstance().getLiveStreamManager().isVideoStreamSpeedConfigurable() +
                        "\n isLiveAudioEnabled:" + DJISDKManager.getInstance().getLiveStreamManager().isLiveAudioEnabled());
            }
        }.start();
    }

Я всегда получаю код возврата -3. Когда я использую пример кода, я могу заставить его работать. Единственная разница в том, что я вызываю функцию isVideoStreamSpeedConfigurable(), она возвращает true в моем коде и false в примере кода. Но я не видел, где я могу установить эту вещь в false. Как мне реализовать LiveStreamingManager?

Пока я использую пример кода и преобразовываю его в свое приложение. Процесс идет медленно, так как я удаляю классы один за другим и проверяю, как это повлияет на приложение.

Marcello Moreira 23.04.2019 19:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
1
648
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Отвечая на мой собственный вопрос...

Мне удалось решить проблему. По-видимому, чтобы иметь возможность использовать LiveStreamManager, вы должны сначала вызвать функцию VideoFeeder.getPrimaryVideoFeed() где-нибудь в своем коде, иначе она выдаст код ошибки -3.

Используя пример кода, в internal.utils.VideoFeedView есть класс, который можно использовать для этой цели.

Сначала я объявил частную собственность VideoFeedView.

Затем в моем конструкторе класса я вызываю функцию initUI.

private VideoFeedView primaryVideoFeed;

private void initUI() {
   primaryVideoFeed.registerLiveVideo(VideoFeeder.getInstance().getPrimaryVideoFeed(),true);
   startStreaming();

}

У меня такая же проблема, но ваше решение мне не подходит. Откуда вы это узнали, может там есть еще решения для меня.

Rabbi Shuki Gur 22.09.2019 20:49

На самом деле я нашел методом проб и ошибок. DJI MSDK практически нигде не поддерживается, и сама DJI, похоже, тоже не заинтересована. Нам, разработчикам, приходится копаться в этих обходных путях.

Marcello Moreira 23.09.2019 17:43

Я не знаю, повезло ли мне, но для меня следующий код решил мою проблему. Мне не нужно было ничего больше, например VideoFeedView. В чем причина использования этого? Я использую Mavic 2 Pro и транслирую 30 кадров в секунду 720p на YouTube.

    private LiveStreamManager l;
    public int live_streaming_start(String live_url){
      Log.d("MavicMax", "LiveStream:live_streaming_start:" + live_url);
      l = DJISDKManager.getInstance().getLiveStreamManager();
      l.registerListener((x)->{Log.d("MavicMax", "LiveStream callback:" + x);});
      l.setVideoSource(LiveStreamManager.LiveStreamVideoSource.Primary);
      l.setVideoEncodingEnabled(true);
      l.setLiveUrl(live_url);
      int r = 0;
      r = l.startStream();
      return r;
}

Вы показываете живое видео пользователю? как использовать uxsdk и fpvwidget?

Marcello Moreira 27.10.2020 14:37

Да, я знаю, uxsdk, ты имеешь в виду, что без этого не работает?

Mats Bohlinsson 28.10.2020 21:35

Другие вопросы по теме