7

मैं एक वीडियो गैलरी बनाने की कोशिश कर रहा हूं।AVAssetImageGenerator प्रदर्शन समस्या

वीडियो प्रदर्शित करने के लिए मैं UICollectionView का उपयोग कर रहा हूं। प्रत्येक UICollectionViewCell में वीडियो थंबनेल वाला पृष्ठभूमि है।

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:url options:nil]; 

AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; 

generator.appliesPreferredTrackTransform = YES; 

CMTime time = CMTimeMakeWithSeconds(0,15); 

AVAssetImageGeneratorCompletionHandler handler = ^(CMTime timeRequested, CGImageRef image, CMTime timeActual, AVAssetImageGeneratorResult result, NSError *error) 
{ 
    NSLog(@"handler^()"); 

    if (result == AVAssetImageGeneratorSucceeded) 
    { 
     thumbnail = [UIImage imageWithCGImage: image]; 

     success(thumbnail); 
    } 

    else 
    { 
     failure(error); 
    } 
}; 

CGSize maximumSize = CGSizeMake(CLIPBOARD_COLLECTION_VIEW_CELL_WIDTH, CLIPBOARD_COLLECTION_VIEW_CELL_HEIGHT); 

generator.maximumSize = maximumSize; 

NSLog(@"generateCGImagesAsynchronouslyForTimes:"); 
[generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:time]] completionHandler:handler]; 

मैं देखा है कि generateCGImagesAsynchronouslyForTimes पूरी तरह से एसिंक्रोनस रूप से काम नहीं करता है: एक वीडियो थंबनेल मैं तर्क के साथ एक विधि का उपयोग कर रहा उत्पन्न करने के लिए। इस विधि कॉल के बीच एक समय स्थान है। जब मैं तालिका दृश्य कक्ष लोड कर रहा हूं, तो यह एक बड़ा अंतराल का कारण बनता है। अगर मैं [generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:time]] completionHandler:handler] पर टिप्पणी करता हूं तो कोई दृश्यमान अंतराल नहीं है (न ही छवियां)।

मैं इस प्रदर्शन समस्या को कैसे हल कर सकता हूं?

+0

क्या आप निर्दिष्ट कर सकते हैं कि वास्तव में क्या है? क्या स्क्रॉलिंग प्रदर्शन पीड़ित है या क्या अनुरोध के बीच और लंबे समय तक हैंडलर कहलाता है? क्या आप टाइम प्रोफाइलर उपकरण के परिणाम जोड़ सकते हैं? – jszumski

+0

'GenerCGImagesAsynchronouslyForTimes' कॉल के बीच समय रिक्त स्थान हैं ... –

+0

@TomKortney क्या आपको कोई समाधान मिला? एक ही समस्या का सामना करना पड़ रहा है – Sam

उत्तर

3

AVAssetImageGeneratorCompletionHandler ब्लॉक मुख्य थ्रेड पर कहा जा इसकी गारंटी नहीं है:

ब्लॉक के ए वी फाउंडेशन आमंत्रण, कुंजी-मान पर्यवेक्षकों से ए वी फाउंडेशन

कॉल आउट के साथ समवर्ती प्रोग्रामिंग, और अधिसूचना हैंडलर-किसी विशेष धागे या कतार पर होने की गारंटी नहीं है। इसके बजाए, एवी फाउंडेशन इन हैंडलरों को धागे या कतारों पर आमंत्रित करता है जिस पर यह अपने आंतरिक कार्यों को करता है। परीक्षण के लिए आप ज़िम्मेदार हैं कि थ्रेड या कतार जिस पर हैंडलर लगाया जाता है, उन कार्यों के लिए उपयुक्त है जिन्हें आप करना चाहते हैं। यदि यह नहीं है (उदाहरण के लिए, यदि आप उपयोगकर्ता इंटरफ़ेस को अपडेट करना चाहते हैं और कॉलआउट मुख्य थ्रेड पर नहीं है), तो आपको अपने कार्यों के निष्पादन को एक सुरक्षित थ्रेड या कतार में रीडायरेक्ट करना होगा जिसे आप पहचानते हैं, या आप इसे बनाने के लिए बनाते हैं उद्देश्य।

success और failuredispatch_async साथ बुला मुद्दे को ठीक करता है?

dispatch_async(dispatch_get_main_queue(), ^{ 
    if (success) { 
     success(); 
    } 
)}; 
+1

'dispatch_async' जोड़ना इस प्रदर्शन समस्या को हल नहीं करता है। मैं अभी भी 'dispatch_asinc' के साथ, झूठ बोल रहा हूँ। –

0

तरीके, उनमें से एक एक और धागा करने के लिए अतुल्यकालिक छवि पीढ़ी अनुरोध को रीडायरेक्ट करने समारोह की कैप्सूलीकरण जा रहा है के भीतर एक NSBlockOperation उसके अंतर्निहित कतार क्या सबसे उपयुक्त है करने के लिए सेट के साथ एक NSOperationQueue को जोड़ा गया के एक जोड़े हैं आपके ऐप के लिए

सबसे उपयुक्त कतार अनुमान लगाना अपेक्षाकृत आसान होना चाहिए, अगर आपको पता नहीं है, क्योंकि वहां केवल कुछ विकल्प हैं।

संबंधित मुद्दे