2017-04-14 66 views
0

我目前正在通过DJI Bridge App教程。我正在使用Swift和导入VideoPreviewer的桥头。应用程序编译得很好。我可以连接到产品。我可以注册。桥接应用程序工作正常。但是我被视频流困住了。你有什么想法吗?DJI Bridge App教程Swift中没有视频流 - Phantom 4 Pro

方法

“FUNC videoFeed(_ videoFeed:DJIVideoFeed,didUpdateVideoData可视数据:数据)

正确调用当从数据对象中读取字节我收到一些值比发送这些值的。 VidePreviewer作为

FUNC videoFeed(_ videoFeed:DJIVideoFeed,didUpdateVideoData可视数据:数据){

var result = videoData.withUnsafeBytes { (pointer: UnsafePointer<UInt8>) -> UInt8 in 
     return pointer.pointee 
    } 

    print (result) 


    print("Stream info:\(VideoPreviewer.instance().currentStreamInfo.frameRate)") 
    VideoPreviewer.instance().push(&result, length: Int32(videoData.count)) 

     print(VideoPreviewer.instance().isDefaultPreviewer) 




}" 

但是,这是正确的? DJIVideoStreamBasicInfo(frameSize:(0.0,0.0),frameRate:15,encoderType:1)。打印(结果)返回值 -----但frameSize为0.0,0.0这可能是问题吗?----- 结果是视频预览器的视图始终为黑色。下面是整个DJICameraViewController.swift整个Swift文件的代码,编译并运行。

进口的UIKit 进口DJISDK

类DJICameraViewController:UIViewController中,DJISDKManagerDelegate,DJICameraDelegate,DJIBaseProductDelegate,DJIVideoFeedListener {

var camera: DJICamera! 
@IBOutlet weak var fpvPreviewView: UIView! 

@IBOutlet weak var recordBtn: UIButton! 

@IBOutlet weak var changeWorkModeSegmentControl: UISegmentedControl! 


override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    self.registerApp() 
    VideoPreviewer.instance().setView(self.fpvPreviewView) 



} 

override func viewWillDisappear(_ animated: Bool){ 
    super.viewWillDisappear(animated) 
    VideoPreviewer.instance().setView(nil) 
    DJISDKManager.videoFeeder()?.primaryVideoFeed.remove(self) 
} 

func registerApp(){ 

    DJISDKManager.registerApp(with: self) 

} 


func appRegisteredWithError(_ error:Error?) 
{ 
    var message: String = "Application is registered." 

    if (error != nil) { 
     message = "Register App Failed!" 
    } else { 
     message = "Application is registered." 
     DJISDKManager.enableBridgeMode(withBridgeAppIP: "192.168.2.2") 
     DJISDKManager.startConnectionToProduct() 
     VideoPreviewer.instance().start() 


    } 

    DispatchQueue.main.async { 

     let alert = UIAlertController(title: "Alert", message: message, preferredStyle: UIAlertControllerStyle.alert) 
     alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil)) 
     self.present(alert, animated: true, completion: nil) 

    } 

} 

/* after product is recognized. FetchCamera method is called by method productConnected */ 

func fetchCamera() -> DJICamera? { 

    if ((DJISDKManager.product()) == nil){ 

     return nil 
    } 

    if (DJISDKManager.product()!.isKind(of: DJIAircraft.self)){ 

     print("Have UAV") 
     return ((DJISDKManager.product() as? DJIAircraft)?.camera)! 
    } 

    return nil 
} 



/* DJIBaseProductDelegate method called when product is recognized */ 

func productConnected(_ product: DJIBaseProduct?) { 
    print("Product recognized") 
    if ((product) != nil) { 
     product?.delegate = self 

     camera = self.fetchCamera() 
     if (camera != nil) { 
      camera.delegate = self 
      DJISDKManager.videoFeeder()?.primaryVideoFeed.add(self, with: nil) 
     } 
    } 
} 



func videoFeed(_ videoFeed: DJIVideoFeed, didUpdateVideoData videoData: Data) { 


    var result = videoData.withUnsafeBytes { (pointer: UnsafePointer<UInt8>) -> UInt8 in 
     return pointer.pointee 
    } 

    print (result) 



    print("Stream info:\(VideoPreviewer.instance().currentStreamInfo.frameRate)") 
    VideoPreviewer.instance().push(&result, length: Int32(videoData.count)) 

     print(VideoPreviewer.instance().isDefaultPreviewer) 



} 

}

从Xcode控制台中执行以下

代码打印输出
`print("Stream info:\(videoPreview.currentStreamInfo.frameRate)") 
    VideoPreviewer.instance().push(&result, length: Int32(videoData.count)) 
     print(videoPreview.currentStreamInfo) 
     print(videoPreview.isDefaultPreviewer)` 

输出通过上述打印代码印刷:

开始:

Stream info:0 
DJIVideoStreamBasicInfo(frameSize: (0.0, 0.0), frameRate: 0, encoderType: 0) 
true 
136 

第二:

Stream info:0 
[h264 @ 0x102024210] sps_id 32 out of range 
VUI timing infomation not present, set to default:29.97fps 
[h264 @ 0x102024210] sps_id 32 out of range 
VUI timing infomation not present, set to default:29.97fps 
[h264 @ 0x102024210] missing picture in access unit with size 958351 
DJIVideoStreamBasicInfo(frameSize: (0.0, 0.0), frameRate: 0, encoderType: 0) 
true 
65 

第三:

Stream info:15 
DJIVideoStreamBasicInfo(frameSize: (0.0, 0.0), frameRate: 15, encoderType: 1) 
true 
119 

有时弹出:

Stream info:15 
[h264 @ 0x102024210] SEI type 103 size 1712 truncated at 288 
[h264 @ 0x102024210] sps_id 32 out of range 
VUI timing infomation not present, set to default:29.97fps 
[h264 @ 0x102024210] missing picture in access unit with size 111113 
DJIVideoStreamBasicInfo(frameSize: (0.0, 0.0), frameRate: 15, encoderType: 
[h264 @ 0x102024810] SEI type 103 size 1712 truncated at 279 

等次弹出式:

Stream info:15 
DJIVideoStreamBasicInfo(frameSize: (0.0, 0.0), frameRate: 15, encoderType: 1) 
[h264 @ 0x102024810] sps_id 32 out of range 
true 
[h264 @ 0x102024810] sps_id 32 out of range 
[h264 @ 0x102024810] sps_id 32 out of range 
[h264 @ 0x102024810] sps_id 32 out of range 
[h264 @ 0x102024810] sps_id 32 out of range 
0[h264 @ 0x102024810] 
sps_id 32 out of range 

回答

1

你应该尝试设置VideoPreview.instance()为让方便的地方,并使用它。

此外,确保在向视频馈送添加侦听器时提供有效的队列。

试试这些,让我知道它是否有帮助。

+0

谢谢Arnaud。我添加了 –

+0

谢谢Arnaud。我添加了让videoPreview:VideoPreviewer = VideoPreviewer.instance()并使用它。但不幸的是没有改变。此外,它需要一段时间,直到应用程序接收帧率15fps。和之前一样。我用控制台的更多信息扩展了我的问题 –