2017-04-10 5 views
2

フレーム: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") 
} 

はあなたの助けをありがとう!

答えて

1

最終フレームをフラッシュするのにVTCompressionSessionCompleteFrames()を呼び出していますか?私はこのAPIを試したことはありませんが、その呼び出しはmentioned hereです。

+0

非常に良い推測! 私は実際にそれを最初に呼び出さずにすぐに追加しましたが、再チェックはしませんでした。これは明らかに問題の根源ではなかったので、これは私の「深い」問題を解決しませんでした。 これはフレームがどこに行くのかという問題を解決するので、これは間違いなく良い答えです。どうもありがとうございました! –

+1

あなたは大歓迎です!それは私が "flush"タイプのapiを探していたことは幸運でした。それは最も近いものでした。 –

関連する問題