CMSampleBufferGetImageBuffer возвращает ноль
Я пытаюсь извлечь CVPixelBufferRef из CMSampleBufferRef, чтобы изменить CVPixelBufferRef для наложения водяного знака на лету.
я использую CMSampleBufferGetImageBuffer(sampleBuffer)
для того, чтобы достичь этого. Я печатаю результат возвращенного CVPixelBufferRef, но он всегда равен нулю.
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
NSLog(@"PixelBuffer %@",pixelBuffer);
...
}
Я там что-то пропускаю?
2 ответа
Решение
После нескольких часов отладки получается, что это может быть образец видео или аудио. Поэтому попытка получить CVPixelBufferRef из аудиобуфера возвращает ноль.
Я решил это, проверив тип образца, прежде чем продолжить. Так как я не заинтересован в аудиосэмплах, я просто возвращаюсь, когда это аудиосэмпл.
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CMFormatDescriptionRef formatDesc = CMSampleBufferGetFormatDescription(sampleBuffer);
CMMediaType mediaType = CMFormatDescriptionGetMediaType(formatDesc);
//Checking sample type before proceeding
if (mediaType == kCMMediaType_Audio)
{return;}
//Processing the sample...
}
Ответ Базеля Д.Д. в Swift 4.0. У меня это просто сработало
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
guard let formatDescription: CMFormatDescription = CMSampleBufferGetFormatDescription(sampleBuffer) else { return }
let mediaType: CMMediaType = CMFormatDescriptionGetMediaType(formatDescription)
if mediaType == kCMMediaType_Audio {
print("this was an audio sample....")
return
}
}