解码H264:VTDecompressionSessionCreate失败,错误代码为-12910(kVTVideoDecoderUnsupportedDataFormatErr)

时间:2016-08-03 16:28:46

标签: ios swift h.264 video-toolbox

我在iPad上运行代码时使用VTDecompressionSessionCreate收到错误-12910(kVTVideoDecoderUnsupportedDataFormatErr),但不在sim 上。我正在使用Avios(https://github.com/tidwall/Avios),这是相关部分:

private func initVideoSession() throws {
    formatDescription = nil
    var _formatDescription : CMFormatDescription?
    let parameterSetPointers : [UnsafePointer<UInt8>] = [ pps!.buffer.baseAddress, sps!.buffer.baseAddress ]
    let parameterSetSizes : [Int] = [ pps!.buffer.count, sps!.buffer.count ]
    var status = CMVideoFormatDescriptionCreateFromH264ParameterSets(kCFAllocatorDefault, 2, parameterSetPointers, parameterSetSizes, 4, &_formatDescription);
    if status != noErr {
        throw H264Error.CMVideoFormatDescriptionCreateFromH264ParameterSets(status)
    }
    formatDescription = _formatDescription!

    if videoSession != nil {
        VTDecompressionSessionInvalidate(videoSession)
        videoSession = nil
    }
    var videoSessionM : VTDecompressionSession?

    let decoderParameters = NSMutableDictionary()
    let destinationPixelBufferAttributes = NSMutableDictionary()
    destinationPixelBufferAttributes.setValue(NSNumber(unsignedInt: kCVPixelFormatType_32BGRA), forKey: kCVPixelBufferPixelFormatTypeKey as String)

    var outputCallback = VTDecompressionOutputCallbackRecord()
    outputCallback.decompressionOutputCallback = callback
    outputCallback.decompressionOutputRefCon = UnsafeMutablePointer<Void>(unsafeAddressOf(self))

    status = VTDecompressionSessionCreate(nil, formatDescription, decoderParameters, destinationPixelBufferAttributes, &outputCallback, &videoSessionM)
    if status != noErr {
        throw H264Error.VTDecompressionSessionCreate(status)
    }
    self.videoSession = videoSessionM;
}

此处ppssps是包含PPS和SPS帧的缓冲区。

如上所述,奇怪的是它在模拟器上完全正常,但在实际设备上却没有。两者都在iOS 9.3上,我正在模拟与设备相同的硬​​件。

什么可能导致此错误?

而且,更一般地说,我在哪里可以获取VideoToolbox的API参考和错误文档?真的在Apple网站上找不到任何相关内容。

1 个答案:

答案 0 :(得分:2)

答案结果是流分辨率大于1920x1080,这是iPad支持的最大值。这与支持超出该分辨率的模拟器有明显区别(可能它只使用Mac VideoToolbox库而不是模拟iOS)。

将流减少到比1080p更少的像素解决了这个问题。

这是苹果员工的回应,它指出了我正确的方向:https://forums.developer.apple.com/thread/11637

至于正确的VideoToolbox引用 - 仍然没有任何有价值的东西,这是一个巨大的劣势。人们想知道教程编写者是如何首先获得他们的信息的。

修改:iOS 10现在似乎支持大于1080p的流。