Попытка преобразовать CMSampleBuffer
в H264
закодированные данные
aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
- (void) encode:(CMSampleBufferRef )sampleBuffer
{
dispatch_sync(aQueue, ^{
self->frameCount++;
CVImageBufferRef imageBuffer = (CVImageBufferRef)CMSampleBufferGetImageBuffer(sampleBuffer);
CMTime presentationTimeStamp = CMTimeMake(self->frameCount, 1);
VTEncodeInfoFlags flags;
OSStatus statusCode = VTCompressionSessionEncodeFrame(self->EncodingSession,
imageBuffer,
presentationTimeStamp,
kCMTimeInvalid,
NULL, NULL, &flags);
if (statusCode != noErr) {
self->error = @"H264: VTCompressionSessionEncodeFrame failed ";
VTCompressionSessionInvalidate(self->EncodingSession);
self->EncodingSession = NULL;
self->error = NULL;
return;
}
});
}
Вышеуказанный метод вызывается непрерывно.Кажется, бросить EXC_BAD_ACCESS
.
Я пытался использовать NSZombie
объекты, но все еще не мог понять, что его вызывает.
Я попытался создать копию CMSampleBufferRef
и передать ее, чтобы убедиться, что она не освобождается.Все еще EXC_BAD_ACCESS
брошен.
Может кто-нибудь помочь мне выяснить, что происходит?
PS - CMSampleBuffer
создан из CVPixelBuffer
var sampleBfr:CMSampleBuffer?
let scale = CMTimeScale(USEC_PER_SEC)
let pts = CMTime(value: CMTimeValue(NSDate().timeIntervalSince1970 * Double(scale)), timescale: scale)
var timingInfo = CMSampleTimingInfo(duration: CMTime.invalid,
presentationTimeStamp: pts,
decodeTimeStamp: CMTime.invalid)
var videoDesc:CMVideoFormatDescription? = nil
let _:OSStatus = CMVideoFormatDescriptionCreateForImageBuffer(allocator: kCFAllocatorDefault, imageBuffer: pxBuffer!, formatDescriptionOut: &videoDesc)
let _:OSStatus = CMSampleBufferCreateReadyWithImageBuffer(allocator: kCFAllocatorDefault, imageBuffer: pxBuffer!, formatDescription: videoDesc!, sampleTiming: &timingInfo, sampleBufferOut: &sampleBfr)