我正在尝试创建一个由 captureOutput 返回的 CMSampleBuffer 的副本AVCaptureAudioDataOutputSampleBufferDelegate
。
我遇到的问题是我的来自委托方法的帧在我长时间captureOutput:didOutputSampleBuffer:fromConnection:
保留它们后被丢弃。CFArray
显然,我需要创建传入缓冲区的深层副本以进行进一步处理。我也知道这CMSampleBufferCreateCopy
只会创建浅拷贝。
在 SO 上提出的相关问题很少:
- 从 CMSampleBuffer 中提取数据以创建深层副本
- 在 Swift 中创建 CMSampleBuffer 的副本返回 OSStatus -12743(无效的媒体格式)
- CMImageBuffer 或 CVImageBuffer 的深拷贝
但是它们都不能帮助我正确使用具有 12 个参数的CMSampleBufferCreate函数:
CMSampleBufferRef copyBuffer;
CMBlockBufferRef data = CMSampleBufferGetDataBuffer(sampleBuffer);
CMFormatDescriptionRef formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer);
CMItemCount itemCount = CMSampleBufferGetNumSamples(sampleBuffer);
CMTime duration = CMSampleBufferGetDuration(sampleBuffer);
CMTime presentationStamp = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
CMSampleTimingInfo timingInfo;
timingInfo.duration = duration;
timingInfo.presentationTimeStamp = presentationStamp;
timingInfo.decodeTimeStamp = CMSampleBufferGetDecodeTimeStamp(sampleBuffer);
size_t sampleSize = CMBlockBufferGetDataLength(data);
CMBlockBufferRef sampleData;
if (CMBlockBufferCopyDataBytes(data, 0, sampleSize, &sampleData) != kCMBlockBufferNoErr) {
VLog(@"error during copying sample buffer");
}
// Here I tried data and sampleData CMBlockBuffer instance, but no success
OSStatus status = CMSampleBufferCreate(kCFAllocatorDefault, data, isDataReady, nil, nil, formatDescription, itemCount, 1, &timingInfo, 1, &sampleSize, ©Buffer);
if (!self.sampleBufferArray) {
self.sampleBufferArray = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
//EXC_BAD_ACCESS crash when trying to add sampleBuffer to the array
CFArrayAppendValue(self.sampleBufferArray, copyBuffer);
} else {
CFArrayAppendValue(self.sampleBufferArray, copyBuffer);
}
你如何深拷贝音频 CMSampleBuffer?随意在您的答案中使用任何语言(swift/objective-c)。