Skip to content

DJI SDK LiveStreamManager -3 Error: Failed to Start Stream #1329

@George2397

Description

@George2397

Hi all,

I'm working on a project using the DJI Mobile SDK V4 to stream live video from a drone to an RTMP server. Despite receiving video data consistently, I get a -3 error when trying to start the live stream via LiveStreamManager.startStream().

What I tried:

  • I verified that video data is indeed being received from the drone.
  • My RTMP server works because I tried streaming my mobile's camera feed.
  • I enabled encoding with setVideoEncodingEnabled(true).

Below are the key parts of my code. The VideoFeedView is taken from the sample code

1. Drone Live Stream Manager

class DroneLiveStreamManager(private val primaryVideoFeedView: VideoFeedView) {

        private val maxRetries = 10
        private val retryDelay = 1000L // 1 second delay for retrying

        // Initialize and set up the live stream manager
        fun initLiveStream(retryCount: Int = 0) {
            if (DJISDKManager.getInstance().getLiveStreamManager() == null) {
                if (retryCount < maxRetries) {
                    Log.w(TAG, "LiveStreamManager is not available yet, retrying in ${retryDelay / 1000} seconds...")
                    Handler(Looper.getMainLooper()).postDelayed({
                        initLiveStream(retryCount + 1) // Retry after delay
                    }, retryDelay)
                } else {
                    Log.e(TAG, "LiveStreamManager initialization failed after multiple retries.")
                }
                return
            }

            // Proceed with initialization once LiveStreamManager is available
            primaryVideoFeedView.registerLiveVideo(VideoFeeder.getInstance().primaryVideoFeed, true)


            DJISDKManager.getInstance().getLiveStreamManager().setVideoEncodingEnabled(true)
            DJISDKManager.getInstance().getLiveStreamManager().setVideoSource(LiveStreamManager.LiveStreamVideoSource.Primary)
            DJISDKManager.getInstance().getLiveStreamManager().addLiveErrorStatusListener { errorCode, errorMessage ->
                Log.d(TAG, "Streaming error: Code $errorCode, Message: $errorMessage")
            }

            DJISDKManager.getInstance().getLiveStreamManager().registerListener(object : LiveStreamManager.OnLiveChangeListener {
                override fun onStatusChanged(status: Int) {
                    Log.d(TAG, "Live stream status changed: $status")
                }
            })

            Log.d(TAG, "Live stream manager initialized with RTMP URL.")
        }

        fun startLiveStream() {

            if (DJISDKManager.getInstance().getLiveStreamManager()?.isStreaming == false) {
                Thread {
                    // Set the live URL immediately before starting the stream
                    DJISDKManager.getInstance().getLiveStreamManager().setLiveUrl("rtmp://192.168.0.32:1935/live/test")
                    val result = DJISDKManager.getInstance().getLiveStreamManager().startStream()
                    DJISDKManager.getInstance().getLiveStreamManager().setStartTime()
                    Log.d(TAG, "startStream result: $result")
                    if (result == 0) {
                        Log.d(TAG, "Stream started successfully")
                    } else {
                        Log.e(TAG, "Failed to start stream, error code: $result")
                    }
                }.start()
            } else {
                Log.d(TAG, "Stream already active or LiveStreamManager not available")
            }
        }


        fun stopLiveStream() {
            val liveStreamManager = DJISDKManager.getInstance().liveStreamManager
            if (liveStreamManager?.isStreaming == true) {
                liveStreamManager.stopStream()
                Log.d(TAG, "Stopped live stream")
            } else {
                Log.d(TAG, "Stream is not active or LiveStreamManager not available")
            }
        }
    }

2. Initializing Live Stream Manager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        Log.d(TAG, "MainActivity created")

        // Initialize the handler
        mHandler = Handler(Looper.getMainLooper())

        // Initialize videoFeedView after setting the content view
        videoFeedView = findViewById(R.id.video_feed_view)

        // Initialize the DroneLiveStreamManager
        droneLiveStreamManager = DroneLiveStreamManager(videoFeedView)

        // Check and request permissions if necessary
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            checkAndRequestPermissions()
        }

        // Call the dialog to prompt the user for Simulation or Normal Mode
        showModeSelectionDialog()
    }

3. Calling the StartLiveStream()

    private fun showModeSelectionDialog() {
        val builder = AlertDialog.Builder(this)
        builder.setTitle("Select Mode")
        builder.setMessage("Do you want to use Simulation Mode or Normal Mode?")

        builder.setPositiveButton("Simulation Mode") { _, _ ->
            Log.d(TAG, "User selected Simulation Mode")
            // Start the live stream
            droneLiveStreamManager.startLiveStream()
        }

        builder.setNegativeButton("Normal Mode") { _, _ ->
            Log.d(TAG, "User selected Normal Mode")
            showToast("Normal Mode selected. Attempting to connect to GPS if available.")
            // Start the live stream
            droneLiveStreamManager.startLiveStream()
        }

        builder.setCancelable(false)
        builder.show()
    }

4. Error I get:
Failed to start stream, error code: -3

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions