フレーム:VTCompressionSession最初スキップ私は次のコードでスイフト3にVTCompressionSessionとコードい
let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
let statusCode = VTCompressionSessionEncodeFrame(compressionSession!, pixelBuffer!, CMSampleBufferGetPresentationTimeStamp(sampleBuffer), CMSampleBufferGetDuration(sampleBuffer)/* CMTimeMake(counter, 1000), kCMTimeInvalid*/, nil, nil, nil)
if statusCode != noErr {
NSLog("VT Error!", statusCode)
}
pixelBuffer変数が出力AVCaptureSessionあります。このAVCaptureSessionのコールバックが上記のコードを呼び出します。 問題は、上のコードはn回呼び出されますが、VTCompressionSessionからのコールバックはn-10回だけ呼び出されるため、他のフレームがどこに行くのか不思議です。圧縮を改善するためにキューに格納されているだけですか、またはこの問題はありますか? 私の最後のh264ストリームは100%正確ではなく、これが問題に寄与しているかどうかはわかりません。
VTCompressionSessionは、次のコードで作成されます。
var error = VTCompressionSessionCreate(kCFAllocatorDefault,
270,
480,
kCMVideoCodecType_H264,
nil,
nil,
nil,
vtCallback,
selfPointer,
&tmpSession);
VTコールバックが定義されている次のように
let vtCallback : @convention(c) (UnsafeMutableRawPointer?, UnsafeMutableRawPointer?, OSStatus, VTEncodeInfoFlags, CMSampleBuffer?) -> Swift.Void =
{
(outputCallbackRefCon, sourceFrameRefCon, status, infoFlags, sampleBuffer) -> Swift.Void in
NSLog("vtCallback")
}
はあなたの助けをありがとう!
非常に良い推測! 私は実際にそれを最初に呼び出さずにすぐに追加しましたが、再チェックはしませんでした。これは明らかに問題の根源ではなかったので、これは私の「深い」問題を解決しませんでした。 これはフレームがどこに行くのかという問題を解決するので、これは間違いなく良い答えです。どうもありがとうございました! –
あなたは大歓迎です!それは私が "flush"タイプのapiを探していたことは幸運でした。それは最も近いものでした。 –