Не удается добавить CMSampleBuffer к AVAssertWriterInput (ошибка -12780)

Я вручную декодирую поток RTSP h264, используя ffmpeg, и пытаюсь сохранить несжатые кадры, используя AVAssertWriter и AVAssertWriterInput.

Я получаю следующую ошибку при вызове AVAssetWriterInput appendBuffer -

Домен ошибки = AVFoundationErrorDomain Code = -11800 "Операция не может быть завершена" UserInfo = {NSUnderlyingError = 0x170059530 {Домен ошибки = NSOSStatusErrorDomain Code = -12780 "(null)"}, NSLocalizedFailureReason = Произошла неизвестная ошибка (-12780), NSLocalizedDescription =Операция не может быть завершена}

CMSampleBuffer содержит кадры BGRA и выглядит так:

CMSampleBuffer 0x159d12900 retainCount: 1 allocator: 0x1b3aa3bb8
invalid = NO
dataReady = YES
makeDataReadyCallback = 0x0
makeDataReadyRefcon = 0x0
formatDescription = <CMVideoFormatDescription 0x17405bd50 [0x1b3aa3bb8]> {
    mediaType:'vide' 
    mediaSubType:'BGRA' 
    mediaSpecific: {
        codecType: 'BGRA'
        dimensions: 720 x 1280 
    } 
    extensions: {<CFBasicHash 0x1742652c0 [0x1b3aa3bb8]>{type = immutable dict, count = 4,
        entries =>
        0 : <CFString 0x1addb17c8 [0x1b3aa3bb8]>{contents = "CVImageBufferYCbCrMatrix"} = <CFString 0x1addb1808 [0x1b3aa3bb8]>{contents = "ITU_R_601_4"}
        1 : <CFString 0x1addb1928 [0x1b3aa3bb8]>{contents = "CVImageBufferTransferFunction"} = <CFString 0x1addb17e8 [0x1b3aa3bb8]>{contents = "ITU_R_709_2"}
        2 : <CFString 0x1adde3800 [0x1b3aa3bb8]>{contents = "CVBytesPerRow"} = <CFNumber 0xb00000000000b402 [0x1b3aa3bb8]>{value = +2880, type = kCFNumberSInt32Type}
        3 : <CFString 0x1adde3880 [0x1b3aa3bb8]>{contents = "Version"} = <CFNumber 0xb000000000000022 [0x1b3aa3bb8]>{value = +2, type = kCFNumberSInt32Type}
        }
    }
}
sbufToTrackReadiness = 0x0
numSamples = 1
sampleTimingArray[1] = {
    {PTS = {3000/90000 = 0.033}, DTS = {INVALID}, duration = {INVALID}},
}
imageBuffer = 0x17413ebe0

Я просмотрел следующий вопрос и ответы, но, похоже, он не объясняет проблему, с которой я столкнулся (формат, который я использовал, является поддерживаемым форматом пикселей): Почему AVFoundation не принимает мои плоские пиксельные буферы на устройстве iOS?

Любая помощь будет признательна!

К сведению: когда я сохраняю BGRA CMSampleBuffers, я получаю их с камеры iPhone, они просто работают, при необходимости я также могу вставить пример CMSampleBuffer.


person Nimrod Gutman    schedule 03.07.2017    source источник
comment
Как вы устанавливаете временные метки презентации?   -  person Rhythmic Fistman    schedule 05.07.2017


Ответы (1)


Я отвечу себе, как я нашел проблему -

CMSampleBuffer не было IOSurface поддержки. Я использовал CVPixelBufferCreateWithBytes, который создал CVPixelBuffer без поддержки IOSurface, как только я использовал CVPixelBufferCreate и передал ключ kCVPixelBufferIOSurfacePropertiesKey, все заработало.

https://developer.apple.com/library/content/qa/qa1781/_index.html содержит всю информацию о создании CVPixelBuffers на основе IOSurface.

person Nimrod Gutman    schedule 16.07.2017