尝试流式传输到自定义 RTMP 时,DJI Mobile SDK 中出现 LiveStreamManager 错误 -3?

Posted

技术标签:

【中文标题】尝试流式传输到自定义 RTMP 时,DJI Mobile SDK 中出现 LiveStreamManager 错误 -3?【英文标题】:Getting LiveStreamManager error -3 in DJI Mobile SDK when trying to stream to custom RTMP? 【发布时间】:2019-04-17 15:43:31 【问题描述】:

我正在尝试实现一个将实时视频从无人机发送到我的自定义 rtmp 服务器的应用程序。当我使用 DJI Mobile SDK 中的 de LiveStreamManager 时,它给了我错误代码 -3,并且流无法启动。如何使用此 API?

我的应用注册成功,我可以设置任务,并从无人机获取遥测数据。但是当我尝试使用 LiveStreamManeger 时,无论如何它都不起作用。即使完全按照Sample Code 中的方式实现,它也不起作用。 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。但我没有看到我可以在哪里设置这个东西为假。我应该如何实现 LiveStreamingManager?

【问题讨论】:

在此期间,我正在使用示例代码并将其转换为我的应用程序。过程很慢,因为我已经一一删除类并检查它将如何影响应用程序 【参考方案1】:

回答我自己的问题...

我已经设法解决了这个问题。显然,为了能够使用 LiveStreamManager,您必须首先在代码中的某处调用函数 VideoFeeder.getPrimaryVideoFeed() 否则它会给出错误代码 -3。

使用示例代码,internal.utils.VideoFeedView 中有一个类可用于此目的

我首先声明了一个私有属性 VideoFeedView。

然后在我的类构造函数中调用 initUI 函数。

private VideoFeedView primaryVideoFeed;

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


【讨论】:

我有同样的问题,但你的解决方案对我不起作用。你在哪里找到的,也许那里有更多适合我的解决方案。 其实我已经通过反复试验找到了。 DJI MSDK 在任何地方都没有太多支持,而且 DJI 本身似乎也不感兴趣。我们开发人员最终不得不挖掘这些变通方法。【参考方案2】:

我不知道我是不是很幸运,但对我来说,下面的代码解决了我的问题。我不再需要任何东西,比如 VideoFeedView。使用它的原因是什么? 我在 mavic 2 pro 上运行并将 30fps 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? 是的,uxsdk,如果没有你的意思,它不工作吗?

以上是关于尝试流式传输到自定义 RTMP 时,DJI Mobile SDK 中出现 LiveStreamManager 错误 -3?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 RTMP 将视频流式传输到 iOS?

如何使用 Gstreamer 通过 RTMP 流式传输?

如何使用 WebRTC 将视频流式传输到 RTMP?

无法从 nginx-rtmp 获得破折号流式传输

我们可以在 ios 应用程序中进行 RTMP 流式传输吗?

使用 LFLiveKit 捕获屏幕并流式传输到 rtmp 服务器