Предварительный просмотр видео DJI Osmo Mobile - PullRequest
0 голосов
/ 30 мая 2018

Я хочу создать пример приложения для DJI Osmo Mobile2, но когда я пытался выбрать камеру с DJIHandheld, это всегда было nil.Как я могу использовать родную камеру?Я пытался сопоставить CMSampleBuffer из AVCaptureVideoDataOutputSampleBufferDelegate с UnsafeMutablePointer<UInt8> в captureOutput методе делегата, но предварительный просмотр всегда был черным.

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {

    let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!

    CVPixelBufferLockBaseAddress(pixelBuffer, CVPixelBufferLockFlags(rawValue: 0))
    let lumaBaseAddress = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0)
    let chromaBaseAddress = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 1)

    let width = CVPixelBufferGetWidth(pixelBuffer)
    let height = CVPixelBufferGetHeight(pixelBuffer)

    let lumaBytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 0)
    let chromaBytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 1)
    let lumaBuffer = lumaBaseAddress?.assumingMemoryBound(to: UInt8.self)
    let chromaBuffer = chromaBaseAddress?.assumingMemoryBound(to: UInt8.self)

    var rgbaImage = [UInt8](repeating: 0, count: 4*width*height)
    for x in 0 ..< width {
        for y in 0 ..< height {
            let lumaIndex = x+y*lumaBytesPerRow
            let chromaIndex = (y/2)*chromaBytesPerRow+(x/2)*2
            let yp = lumaBuffer?[lumaIndex]
            let cb = chromaBuffer?[chromaIndex]
            let cr = chromaBuffer?[chromaIndex+1]

            let ri = Double(yp!)                                + 1.402   * (Double(cr!) - 128)
            let gi = Double(yp!) - 0.34414 * (Double(cb!) - 128) - 0.71414 * (Double(cr!) - 128)
            let bi = Double(yp!) + 1.772   * (Double(cb!) - 128)

            let r = UInt8(min(max(ri,0), 255))
            let g = UInt8(min(max(gi,0), 255))
            let b = UInt8(min(max(bi,0), 255))

            rgbaImage[(x + y * width) * 4] = b
            rgbaImage[(x + y * width) * 4 + 1] = g
            rgbaImage[(x + y * width) * 4 + 2] = r
            rgbaImage[(x + y * width) * 4 + 3] = 255
        }
    }

    let data = NSData(bytes: &rgbaImage, length: rgbaImage.count)
    let videoBuffer = UnsafeMutablePointer<UInt8>.allocate(capacity: data.length)
    data.getBytes(videoBuffer, length: data.length)
    VideoPreviewer.instance().push(videoBuffer, length: Int32(data.length))

}

Я не знаю, правильно ли это.

PS: VideoPreviewer основан на ffmpeg.

1 Ответ

0 голосов
/ 01 июня 2018

Osmo Mobile 2 не поставляется со своей собственной камерой, поэтому SDK не собирается возвращать экземпляр камеры - это отличается от других версий Osmos с камерой.Вам нужно будет создать свой код для взаимодействия непосредственно с вашим устройством iOS, а не через Osmo Mobile 2.

...