2

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 のサイトで関連性のあるものを見つけることができません。

4

1 に答える 1

2

その答えは、ストリームの解像度が 1920x1080 よりも大きいということでした。これは、iPad がサポートする最大値です。これは、その解像度を超える解像度をサポートするシミュレーターとの明らかな違いです (おそらく、iOS のライブラリーをシミュレートするのではなく、Mac の VideoToolbox ライブラリーを使用するだけです)。

ストリームを 1080p より少ないピクセルに減らすと、問題は解決しました。

これは、私を正しい方向に向けた Apple スタッフのメンバーからの応答です: https://forums.developer.apple.com/thread/11637

適切な VideoToolbox リファレンスについては、まだ価値のあるものは何も存在せず、これは大きな欠点です。チュートリアルの作成者が最初にどのようにして情報を入手したのか疑問に思います。

編集: iOS 10 は 1080p を超えるストリームをサポートするようになりました。

于 2016-08-05T16:19:44.700 に答える