0

我遵循全景演示示例并连接到无人机。我得到了一个具有正确型号的 DJIAircraft 和一个 DJICamera,但视频永远不会开始(没有图像和 didReceiveVideoData 永远不会被调用)。如果我切换到 DJI GO 4 应用程序,我可以看到实时视频源。有任何想法吗?

//
//  CaptureViewController.swift
//

// MARK: - Source https://developer.dji.com/mobile-sdk/documentation/ios-tutorials/PanoDemo.html

import UIKit
import VideoPreviewer
import ToastSwiftFramework

class CaptureViewController: UIViewController, DJISDKManagerDelegate, DJICameraDelegate, DJIPlaybackDelegate, DJIMissionManagerDelegate, DJIFlightControllerDelegate {
    @IBOutlet var fpvPreviewView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        tabBarItem.title = "CAPTURE".localized

        VideoPreviewer.instance().setView(fpvPreviewView)
        self.registerApp()
    }

    func registeredAppWithError(error: Error?) {
        guard error == nil else {
            makeToast("Error registering app \(error)")

            return
        }

        VideoPreviewer.instance().start()
    }

    //MARK: - DJI Delegate

    func registerApp() {
        DJISDKManager.registerApp("******************", with: self)
    }

    func sdkManagerDidRegisterAppWithError(_ error: Error?) {
        guard error == nil else {
            makeToast("Error registering SDK Manager \(error)")

            return
        }

        DJISDKManager.startConnectionToProduct()

        makeToast("Registered app with DJISDKManager")
    }

    func camera(product: DJIBaseProduct?) -> DJICamera? {
        guard let aircraft = DJISDKManager.product() as? DJIAircraft else { return nil }

        return aircraft.camera
    }

    func sdkManagerProductDidChange(from oldProduct: DJIBaseProduct?, to newProduct: DJIBaseProduct?) {
        makeToast("Found \(newProduct?.model ?? "")")

        guard let camera = camera(product: newProduct) else {
            makeToast("No camera!")

            return
        }

        makeToast("Camera \(camera.displayName)")

        camera.delegate = self
        camera.playbackManager?.delegate = self
    }

    var receivedVideo = false

    func camera(_ camera: DJICamera, didReceiveVideoData videoBuffer: UnsafeMutablePointer<UInt8>, length size: Int) {
        makeToast("Receiving video!")

        VideoPreviewer.instance().push(videoBuffer, length: Int32(size))
    }

    func playbackManager(_ playbackManager: DJIPlaybackManager, didUpdate playbackState: DJICameraPlaybackState) {
        makeToast("PlaybackState: \(playbackState.playbackMode)")
    }
}
4

3 回答 3

0

您应该在您的应用连接到 DJI 产品后开始视频流。放入委托方法VideoPreviewer.instance().start()sdkManagerProductDidChange解决问题。

func sdkManagerDidRegisterAppWithError(_ error: Error?) {
    guard error == nil else {
        makeToast("Error registering SDK Manager \(error)")

        return
    }

    DJISDKManager.startConnectionToProduct()
    VideoPreviewer.instance().start()

    makeToast("Registered app with DJISDKManager")
}
于 2017-03-23T15:04:04.450 回答
0

我知道它很晚,但我们在我们的应用程序中遇到了类似的问题,问题是当 DJI 无人机连接时,同时我们在连接时没有得到相机的实例。连接后添加 5-10 秒的延迟。我做过类似的事情,现在它适用于每架无人机。

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(7 * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), {
                    let camera = ConnectedDroneManager.sharedDroneInstance.fetchCamera()
                camera?.delegate = self
                camera?.playbackManager?.delegate = self

})

希望这对您有所帮助。

于 2017-03-23T10:26:20.747 回答
-2

DJI 的 iOS PanoDemo 是用 Objective-C 编写的,我在 Phantom 4 Pro 上尝试过,演示应用程序可以成功显示实时视频源。好像您正在使用 Swift 编写自己的 DJI SDK 应用程序。

在您上面显示的代码中,我认为您尚未成功注册该应用程序。有趣的是registerApp(),您在 DJISDKManager.registerApp() 方法中传递了“******************”,这是不正确的,您应该使用 Xcode 的包创建一个 App 密钥DJI开发者网站用户中心的ID:https ://developer.dji.com/user/apps/ ,然后粘贴到registerApp()方法中。

更多内容,您可以关注 Github 上的 DJI Swift 示例代码:https ://github.com/dji-sdk/Mobile-SDK-iOS/tree/master/Sample%20Code/SwiftSampleCode学习如何制作自己的 DJI SDK应用程序。希望这有帮助!

于 2017-01-20T05:12:45.110 回答