我使用以下代码在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")
}
感谢您的帮助!
答案 0 :(得分:1)
您是否正在调用VTCompressionSessionCompleteFrames()
来刷新这些最终帧?我从未尝试过此API,但该调用是mentioned here。