Code Block extension MultipeerVideoDataOutput: AVCaptureVideoDataOutputSampleBufferDelegate {| func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) { guard let cgImage = cgImageFromSampleBuffer(sampleBuffer, videoOrientation: connection.videoOrientation) else { return } var error = kvImageNoError var sourceBuffer = vImage_Buffer() |
| defer { sourceBuffer.free() } |
| error = vImageBuffer_InitWithCGImage(&sourceBuffer, &imageFormat, nil, cgImage, vImage_Flags(kvImageNoFlags)) |
| guard error == kvImageNoError else { return } var destinationBuffer = vImage_Buffer() |
| error = vImageBuffer_Init(&destinationBuffer, vImagePixelCount(Constants.imageSize.height), vImagePixelCount(Constants.imageSize.width), Constants.bitsPerPixel, vImage_Flags(kvImageNoFlags)) |
| guard error == kvImageNoError else { return } error = vImageScale_ARGB8888(&sourceBuffer, &destinationBuffer, nil, vImage_Flags(kvImageHighQualityResampling)) |
| guard error == kvImageNoError else { return } guard let resizedImage = vImageCreateCGImageFromBuffer(&destinationBuffer, &imageFormat, nil, nil, vImage_Flags(kvImageNoAllocate), &error)?.takeRetainedValue(), error == kvImageNoError else { return } DispatchQueue.main.async { [weak self] in |
| let image = UIImage(cgImage: resizedImage) |
| let jpegData = image.jpegData(compressionQuality: 0) guard let connectedPeer = self?.connectedPeer, let data = jpegData else { return } |
| try? self?.session.send(data, toPeers: [connectedPeer], with: .reliable) |
| } |
| } private func cgImageFromSampleBuffer(_ sampleBuffer: CMSampleBuffer, videoOrientation: AVCaptureVideoOrientation) -> CGImage? { |
| if let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) { |
| let context = CIContext() |
| var ciImage = CIImage(cvPixelBuffer: imageBuffer) ciImage = ciImage.oriented(forExifOrientation: 1) return context.createCGImage(ciImage, from: ciImage.extent) |
| } return nil |
| } |
| } |
Code Block func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {| DispatchQueue.main.async(execute: { [self] in |
| semaphore.wait() |
| if let image = UIImage(data: data) { |
| DispatchQueue.main.async { [weak self] in |
| self?.delegate?.didReceive(image, fromPeer: peerID) |
| } |
| } |
| semaphore.signal() |
| }) |
| } |
So im using MultiPeer Connectivity to send video camera data from the iphone to the ipad but the problem that im having is at times the image on the ipad becomes choppy and gets so far behind real life. I have fallen behind 10 minutes from whats happening on the iphone camera and whats showing on the ipad. Anyone have any ideas on what i can do to improve that? Or does anyone know of a way other then MultiPeer Connectivity to do this?