Bir AVCaptureAudioDataOutputSampleBufferDelegate
içinde captureOutput tarafından döndürülen bir CMSampleBuffer kopyasını oluşturmaya çalışıyorum.Ses CMSampleBuffer Kopyası
Sorun şu ki, 'da uzun süre tutulduktan sonra çerçevelerim captureOutput:didOutputSampleBuffer:fromConnection:
delege yönteminden geliyor.
Açıkçası, daha fazla işlem için gelen arabelleklerin derin kopyalarını oluşturmam gerekiyor. Ayrıca CMSampleBufferCreateCopy
'un sadece sığ kopya oluşturduğunu biliyorum.
birkaç ilişkili sorular SO üzerinde istendi vardır:
- Pulling data from a CMSampleBuffer in order to create a deep copy
- Creating copy of CMSampleBuffer in Swift returns OSStatus -12743 (Invalid Media Format)
- Deep Copy of CMImageBuffer or CVImageBuffer
Ama bunların hiçbiri 12 parametreleri ile doğru CMSampleBufferCreate fonksiyonu kullanmak için bana yardımcı olur:
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);
}
Ses CMSampleBuffer'ı nasıl kopyalıyorsunuz? Cevaplarınızda herhangi bir dili (hızlı/objektif-c) kullanmaktan çekinmeyin.
Derin bir kopyasına ihtiyacınız olduğu aşikar mı? 'CMSampleBufferCreateCopy' kullandığınızda ne olur? CMSampleBufferCopySampleBufferForRange, size derin bir kopyasını verebilir mi? Daha fazla işlem için gerçekten CMSampleBuffer'a ihtiyacınız var mı? Kendi işleminizi yapıyorsanız, length + işaretçisi daha uygun olabilir. –
@RhythmicFistman Evet, 'CMSampleBufferCreateCopy' kullanırsam ve kopyalanan örneği 'CFArray' içinde 1 saniyeden fazla tutarsa, didOutputSampleBuffer 'çağrılmayı durdurur. Bu [soru] ile kolayca çoğaltabilirsiniz (https://stackoverflow.com/questions/30850676/avcaptureoutput-didoutputsamplebuffer-stops-getting-called). Davranışı "CMSampleBufferCopySampleBufferForRange" ile kontrol edip sizi güncellerim. –
Ah, tamam, bu arabellekleri temsilci geri aramalarını engeller önemli bilgilerdir. Yukarıdaki kodun çalıştırılabilir sürümüne bir bağlantınız var mı? –