VTCompressionSession会跳过第一帧

时间:2017-04-10 14:41:53

标签: swift avfoundation

我使用以下代码在Swift 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 个答案:

答案 0 :(得分:1)

您是否正在调用VTCompressionSessionCompleteFrames()来刷新这些最终帧?我从未尝试过此API,但该调用是mentioned here