मैं इस के साथ पागल हो रहा हूं - हर जगह देखा है और कुछ भी और सब कुछ करने की कोशिश की है जिसे मैं सोच सकता हूं।AVCapture appendSampleBuffer
मैं एक आईफोन ऐप बना रहा हूं जो AVFoundation का उपयोग करता है - विशेष रूप से आईफोन कैमरा का उपयोग करके वीडियो कैप्चर करने के लिए AVCapture।
मुझे एक कस्टम छवि की आवश्यकता है जो रिकॉर्डिंग में शामिल वीडियो फ़ीड पर ओवरले किया गया हो।
अब तक मेरे पास AVCapture सत्र स्थापित है, फ़ीड प्रदर्शित कर सकता है, फ्रेम तक पहुंच सकता है, इसे UIImage के रूप में सहेज सकता है और उस पर ओवरले छवि को बड़ा कर सकता है। फिर इस नए UIImage को एक CVPixelBufferRef में कनवर्ट करें। दोबारा जांचने के लिए कि बफररफ काम कर रहा है, मैंने इसे वापस यूआईएममेज में परिवर्तित कर दिया है और यह अभी भी छवि को ठीक दिखाता है।
समस्या तब शुरू होती है जब मैं CVPixelBufferRef को CCampleampleBufferRef में परिवर्तित करने का प्रयास करता हूं ताकि AVCaptureSessions PropertyWriterInput में शामिल हो सके। जब मैं इसे बनाने का प्रयास करता हूं तो CMSampleBufferRef हमेशा NULL लौटता है। (शून्य) captureOutput समारोह
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
UIImage *botImage = [self imageFromSampleBuffer:sampleBuffer];
UIImage *wheel = [self imageFromView:wheelView];
UIImage *finalImage = [self overlaidImage:botImage :wheel];
//[previewImage setImage:finalImage]; <- works -- the image is being merged into one UIImage
CVPixelBufferRef pixelBuffer = NULL;
CGImageRef cgImage = CGImageCreateCopy(finalImage.CGImage);
CFDataRef image = CGDataProviderCopyData(CGImageGetDataProvider(cgImage));
int status = CVPixelBufferCreateWithBytes(NULL,
self.view.bounds.size.width,
self.view.bounds.size.height,
kCVPixelFormatType_32BGRA,
(void*)CFDataGetBytePtr(image),
CGImageGetBytesPerRow(cgImage),
NULL,
0,
NULL,
&pixelBuffer);
if(status == 0){
OSStatus result = 0;
CMVideoFormatDescriptionRef videoInfo = NULL;
result = CMVideoFormatDescriptionCreateForImageBuffer(NULL, pixelBuffer, &videoInfo);
NSParameterAssert(result == 0 && videoInfo != NULL);
CMSampleBufferRef myBuffer = NULL;
result = CMSampleBufferCreateForImageBuffer(kCFAllocatorDefault,
pixelBuffer, true, NULL, NULL, videoInfo, NULL, &myBuffer);
NSParameterAssert(result == 0 && myBuffer != NULL);//always null :S
NSLog(@"Trying to append");
if (!CMSampleBufferDataIsReady(myBuffer)){
NSLog(@"sampleBuffer data is not ready");
return;
}
if (![assetWriterInput isReadyForMoreMediaData]){
NSLog(@"Not ready for data :(");
return;
}
if (![assetWriterInput appendSampleBuffer:myBuffer]){
NSLog(@"Failed to append pixel buffer");
}
}
}
एक अन्य समाधान के बारे में मैं एक AVAssetWriterInputPixelBufferAdaptor जो गन्दा CMSampleBufferRef रैपिंग करने के लिए की आवश्यकता समाप्त उपयोग कर रहा है सुनवाई रखना -
यहाँ है। हालांकि मैंने स्टैक्ड और सेब डेवलपर फ़ोरम और डॉक्स को खराब कर दिया है और इसे सेट अप करने या इसका उपयोग करने के तरीके पर स्पष्ट विवरण या उदाहरण नहीं मिल रहा है। अगर किसी के पास इसका एक कामकाजी उदाहरण है तो कृपया मुझे दिखाएं या उपरोक्त मुद्दे को बाहर निकालने में मेरी मदद करें - एक सप्ताह के लिए इस गैर-स्टॉप पर काम कर रहे हैं और मैं अंत में हूं।
यदि आप पहले से किसी अन्य की जानकारी
धन्यवाद की जरूरत है मुझे जानते हैं,
माइकल
कोड स्वरूपण की कमी के लिए खेद है - यह पूर्वावलोकन में ठीक दिखाई दिया: एस –