मैं AVCaptureAudioDataOutputSampleBufferDelegate
में कैप्चरऑटपुट द्वारा लौटाए गए एक CMSampleBuffer की एक प्रति बनाने की कोशिश कर रहा हूं।ऑडियो CMSampleBuffer की गहरी प्रतिलिपि
मेरी समस्या यह है कि मेरे फ्रेम captureOutput:didOutputSampleBuffer:fromConnection:
से आने वाले बाद में CFArray
में उन्हें बनाए रखने के बाद गिराए जा रहे हैं।
जाहिर है, मुझे आगे की प्रक्रिया के लिए आने वाले बफर की गहरी प्रतियां बनाने की आवश्यकता है। मुझे यह भी पता है कि CMSampleBufferCreateCopy
केवल उथले प्रतियां बनाता है।
इतने पर पूछा गया कुछ संबंधित प्रश्नों के होते हैं:
- 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
लेकिन उनमें से कोई भी 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 की गहरी प्रतिलिपि कैसे बनाते हैं? अपने उत्तरों में किसी भी भाषा (स्विफ्ट/उद्देश्य-सी) का उपयोग करने के लिए स्वतंत्र महसूस करें।
क्या यह स्पष्ट है कि आपको एक गहरी प्रतिलिपि की आवश्यकता है? जब आप 'CMSampleBufferCreateCopy' का उपयोग करते हैं तो क्या होता है? क्या 'CMSampleBufferCopySampleBufferForRange' आपको एक गहरी प्रतिलिपि देगा? क्या आपको वास्तव में आगे की प्रक्रिया के लिए 'सीएमएसएमएल बफर' की आवश्यकता है? यदि आप अपनी खुद की प्रसंस्करण कर रहे हैं, तो लंबाई + सूचक अधिक सुविधाजनक हो सकता है। –
@ रिथमिक फ़िस्टमैन हां, यह स्पष्ट है कि मुझे गहरी प्रतिलिपि की आवश्यकता है, अगर मैं 'CMSampleBufferCreateCopy' का उपयोग करता हूं और फिर 1 से अधिक से अधिक 'CFArray' में कॉपी किए गए नमूना को बनाए रखता हूं,' didOutputSampleBuffer' कॉल हो रहा है। आप आसानी से इसे [प्रश्न] (https://stackoverflow.com/questions/30850676/avcaptureoutput-didoutputsamplebuffer-stops-getting-called) के साथ पुन: उत्पन्न कर सकते हैं। मैं 'CMSampleBufferCopySampleBufferForRange' के साथ व्यवहार की जांच करूंगा और आपको अपडेट कर दूंगा। –
आह, ठीक है, बफर को बनाए रखने वाले बफर आपके प्रतिनिधि कॉलबैक महत्वपूर्ण जानकारी हैं। क्या आपके पास उपरोक्त कोड के एक चलने योग्य संस्करण का लिंक है? –