Intereting Posts
कस्टम UIButton छवि इंटरफ़ेस बिल्डर में क्यों नहीं बदलती? टैप इशारे पहचानकर्ता – जो ऑब्जेक्ट टेप किया गया था? आईओएस – सेटआइटिंग और / या ऐप खरीदारी प्रतिसाद में कभी नहीं आता है यदि Xcode संग्रहित उपयोगिता सत्यापन के लिए गलत ऐप दिखाती है, तो क्या करें? आईफोन पर डिबगिंग करते समय एनएसएलॉग कचरा के रूप में यूनिकोड वर्णों को आउटपुट करता है I NSXMLParser सीडीएटीए की उपेक्षा नहीं करता है NSFetchedResultsController को पहले नाम या अंतिम नाम से क्रमबद्ध करें ऐप में टाइमर चलाएं और जब ऐप पृष्ठभूमि में है स्विफ्ट: कैसे UITableViewCell में एक UIView क्लिक करने योग्य बनाने के लिए? UIWindow RootViewController SWIFT में परिवर्तन करते समय एक ईवेंट / विधि ट्रिगर करें आईओएस के लिए फेसबुक ग्राफ़ एपीआई कॉल काम नहीं कर रहा है फ्लश आईओएस अनुदेश कैश iCloud – कस्टम ऑब्जेक्ट के सरणी युक्त संग्रह को कैसे सहेजना है जटिल लिखने के लिए फायरबेज कमिट / रोलबैक

AVSampleBufferDisplayLayer AVCaptureVideoDataOutput प्रतिनिधि से लिया CMSampleBuffers दिखाना बंद क्यों करता है?

मैं कुछ CMSampleBuffer को AVSampleBufferDisplayLayer के साथ प्रदर्शित करना चाहता हूं, लेकिन यह पहला नमूना दिखाने के बाद फ्रीज करता है।

मैं AVCaptureVideoDataOutputSampleBuffer प्रतिनिधि से नमूना बफर प्राप्त करता हूं:

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { CFRetain(sampleBuffer); [self imageToBuffer:sampleBuffer]; CFRelease(sampleBuffer); } 

उन्हें एक सदिश में डाल दिया

 -(void) imageToBuffer: (CMSampleBufferRef )source{ //buffers is defined as: std::vector<CMSampleBufferRef> buffers; CMSampleBufferRef newRef; CMSampleBufferCreateCopy(kCFAllocatorDefault, source, &newRef); buffers.push_back(newRef); } 

फिर उन्हें AVSampleBufferDisplayLayer (एक अन्य ViewController में) के माध्यम से दिखाने का प्रयास करें

 AVSampleBufferDisplayLayer * displayLayer = [[AVSampleBufferDisplayLayer alloc] init]; displayLayer.bounds = self.view.bounds; displayLayer.position = CGPointMake(CGRectGetMidX(self.displayOnMe.bounds), CGRectGetMidY(self.displayOnMe.bounds)); displayLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; displayLayer.backgroundColor = [[UIColor greenColor] CGColor]; [self.view.layer addSublayer:displayLayer]; self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; dispatch_queue_t queue = dispatch_queue_create("My queue", DISPATCH_QUEUE_SERIAL); [displayLayer setNeedsDisplay]; [displayLayer requestMediaDataWhenReadyOnQueue:queue usingBlock:^{ while ([displayLayer isReadyForMoreMediaData]) { if (samplesKey < buffers.size()) { CMSampleBufferRef buf = buffers[samplesKey]; [displayLayer enqueueSampleBuffer:buffers[samplesKey]]; samplesKey++; }else { [displayLayer stopRequestingMediaData]; break; } } }]; 

लेकिन यह पहले नमूने को दिखाता है तो जमा देता है, और कुछ भी नहीं करता है।

और मेरे वीडियो डेटा आउटपुट सेटिंग्स इस प्रकार हैं:

 //set up our output self.videoDataOutput = [[AVCaptureVideoDataOutput alloc] init]; dispatch_queue_t queue = dispatch_queue_create("VideoQueue", DISPATCH_QUEUE_SERIAL); [_videoDataOutput setSampleBufferDelegate:self queue:queue]; [_videoDataOutput setVideoSettings:[NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:kCVPixelFormatType_32BGRA],(id)kCVPixelBufferPixelFormatTypeKey, nil]]; 

Solutions Collecting From Web of "AVSampleBufferDisplayLayer AVCaptureVideoDataOutput प्रतिनिधि से लिया CMSampleBuffers दिखाना बंद क्यों करता है?"

मैं इसी समस्या में इसी संदर्भ में आया, जो कि AVCaptureVideoDataOutput से आउटपुट लेने की कोशिश करता है और इसे AVSampleDisplay परत में प्रदर्शित करता है।

यदि आपके फ्रेम प्रदर्शन क्रम में बाहर आते हैं, तो ठीक बहुत आसान है, बस CMSampleBufferRef पर तत्काल ध्वज प्रदर्शित करें

प्रतिनिधि द्वारा वापस नमूना बफर प्राप्त करें और फिर …

 CFArrayRef attachments = CMSampleBufferGetSampleAttachmentsArray(sampleBuffer, YES); CFMutableDictionaryRef dict = (CFMutableDictionaryRef)CFArrayGetValueAtIndex(attachments, 0); CFDictionarySetValue(dict, kCMSampleAttachmentKey_DisplayImmediately, kCFBooleanTrue); 

यदि आपके फ़्रेम एन्कोडर ऑर्डर में प्रदर्शित होते हैं (ऑर्डर प्रदर्शित नहीं करते हैं), तो CMSampleBuffer पर टाइम स्टैम्प को शून्य पक्षपाती होने की आवश्यकता है और इस तरह पुनरारंभ होता है कि पहली फ्रेम टाइमस्टैम्प समय 0 के बराबर हो।

  double pts = CMTimeGetSeconds(CMSampleBufferGetPresentationTimeStamp(sampleBuffer)); // ptsStart is equal to the first frames presentationTimeStamp so playback starts from time 0. CMTime presentationTimeStamp = CMTimeMake((pts-ptsStart)*1000000,1000000); CMSampleBufferSetOutputPresentationTimeStamp(sampleBuffer, presentationTimeStamp); 

अद्यतन करें:

मैं ऐसी स्थिति में गया जहां कुछ वीडियो अभी भी आसानी से नहीं खेल रहे थे जब मैंने शून्य पूर्वाग्रह विधि का इस्तेमाल किया और मैंने आगे की जांच की। सही जवाब पीटीएस का प्रयोग पहले फ्रेम से करते हुए लगता है जो आप खेलते हैं

मेरा जवाब यहां है, लेकिन मैं इसे यहां पोस्ट भी कर दूंगा।

दर सेट करें जिस पर AVSampleBufferDisplayLayer नमूना बफ़र्स प्रदान करता है

टाइमबेस को पहले फ्रेम के प्रस्तुतीकरण समय स्टैंप (पीटी) में सेट करना होगा, जिसे आप डीकोड करना चाहते हैं। मैं पहले फ्रेम के अंक को 0 के बाद के सभी अंकों से आरंभिक अंक घटाकर 0 से टाइमबेस को सेट करके अनुक्रमणित कर रहा था। जो भी कारण से, कुछ वीडियो के साथ काम नहीं किया।

आप ऐसा कुछ चाहते हैं (डिकोड करने के लिए कॉल करने से पहले कहा जाता है):

 CMTimebaseRef controlTimebase; CMTimebaseCreateWithMasterClock( CFAllocatorGetDefault(), CMClockGetHostTimeClock(), &controlTimebase ); displayLayer.controlTimebase = controlTimebase; // Set the timebase to the initial pts here CMTimebaseSetTime(displayLayer.controlTimebase, CMTimeMake(ptsInitial, 1)); CMTimebaseSetRate(displayLayer.controlTimebase, 1.0); 

CMSampleBuffer के लिए PTS सेट करें …

 CMSampleBufferSetOutputPresentationTimeStamp(sampleBuffer, presentationTimeStamp); 

और शायद यह सुनिश्चित करें कि प्रदर्शन तुरंत सेट नहीं है ….

 CFDictionarySetValue(dict, kCMSampleAttachmentKey_DisplayImmediately, kCFBooleanFalse); 

यह WWDC 2014 सत्र 513 में बहुत संक्षिप्त रूप से कवर किया गया है।