Как я могу преобразовать CMSampleBuffer с данными изображения в формат, подходящий для отправки по сетевому соединению?

Я хочу отправить кадры видеопотока по сетевому соединению, поэтому я реализовал функцию AVCaptureVideoDataOutputSampleBufferDelegate:

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

Как мне преобразовать CMSampleBuffer в Data как функцию NWConnection:

func send(content: Data?, contentContext: NWConnection.ContentContext = default, isComplete: Bool = default, completion: NWConnection.SendCompletion)

что я использую для сети, ожидает данных для его параметра содержимого?

2 ответа

Предположительно, вы хотите сжать видеокадры перед их отправкой по сети, поскольку для несжатых видеокадров может потребоваться более высокая пропускная способность, чем у вас есть. И вы захотите использовать аппаратный компрессор для скорости.

Вы можете получить доступ к аппаратному компрессору и декомпрессору, используя платформу VideoToolbox.

Вам следует посмотреть сеанс 513 WWDC 2014 "Прямой доступ к кодированию и декодированию видео". Вот цитата из введения:

И в дополнение к этому, есть случай, когда у вас есть поток изображений, поступающих с камеры или из другого места, и вы хотели бы сжать их, но получить прямой доступ к этим сжатым буферам семплов, чтобы вы могли отправлять их по сети или делай с ними что хочешь.

Вы можете найти стенограмму сессии в ASCIIwwdc.

Пожалуйста, попробуйте. Он у меня работает.

              guard let cvBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
        return
    }
    
    //get a CIImage out of the CVImageBuffer
    let ciImage = CIImage(cvImageBuffer: cvBuffer)
    
    //get UIImage out of CIImage
    let uiImage = UIImage(ciImage: ciImage)

    //get frames which is image data format
    let frames = uiImage.jpegData(compressionQuality: 0.5)!
Другие вопросы по тегам