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
    }

}
Другие вопросы по тегам