CMSampleBufferGetImageBuffer возвращает ноль

Я пытаюсь получить CVPixelBufferRef из CMSampleBufferRef, чтобы изменить CVPixelBufferRef для наложения водяного знака на лету.

Я использую CMSampleBufferGetImageBuffer(sampleBuffer) для этого. Я печатаю результат возвращенного CVPixelBufferRef, но он всегда равен нулю.

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {

    CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

    NSLog(@"PixelBuffer %@",pixelBuffer);
...

}

Я что-то упускаю?


person Basel JD    schedule 26.07.2016    source источник


Ответы (2)


После нескольких часов отладки выясняется, что образец может быть образцом видео или аудио. Таким образом, попытка получить CVPixelBufferRef из аудиобуфера возвращает null.

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

- (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...

}
person Basel JD    schedule 27.07.2016

Ответ Basel JD в 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
    }

}
person Chrishon Wyllie    schedule 09.07.2018