2017-01-15 12 views
0

Я следил за демонстрационным примером панорамы и подключился к беспилотнику. Я получаю DJIAircraft с правильной моделью, а также DJICamera, но видео никогда не запускается (изображение & didReceiveVideoData никогда не вызывается). Если я переключусь на приложение DJI GO 4, я могу видеть видео в реальном времени. Есть идеи?Подключен к Phantom 4 Pro, но не получает видео

// 
// 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)") 
    } 
} 
+0

У меня такая же проблема, как вы ее нашли? –

+0

Да, просто перезапустите пульт дистанционного управления, мостовое устройство и устройство разработки, и оно должно работать. –

ответ

-1

В DJI в IOS PanoDemo написано в Objective-C, я попробовал его на Phantom 4 Pro, демо-приложение может показать в прямом эфире видео успешно. Похоже, вы пишете свое приложение DJI SDK с помощью Swift.

В приведенном выше коде, я думаю, вы не зарегистрировали приложение успешно. В весе вы передаете «******************» в методе DJISDKManager.registerApp(), что неверно, вы должны создать ключ приложения, используя свой Xcode идентификатор пакета на веб-сайте Центра разработчиков DJI: https://developer.dji.com/user/apps/, затем вставьте его в метод registerApp().

Для получения дополнительной информации вы можете ознакомиться с образцом кода DJI Swift на Github: https://github.com/dji-sdk/Mobile-SDK-iOS/tree/master/Sample%20Code/SwiftSampleCode, чтобы узнать, как создать собственное приложение DJI SDK. Надеюсь, эта помощь!

+2

Конечно, потому что каждый отправляет свой ключ API в StackOverflow. Очевидно, я использовал зарегистрированный ключ приложения вместо ******************. –

0

Я знаю его очень поздно, но мы столкнулись с аналогичной проблемой в нашем приложении, проблема в том, что DJO drone подключен, и в то же время мы не получаем экземпляр камеры во время соединения. Добавьте задержку в 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 

}) 

Надеюсь, это вам поможет.

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") 
}