Как я могу преобразовать 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)!