2017-04-10 77 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

不客气!很幸运,我正在寻找一个“同花顺”类型的API,这是最接近的事情。 –