2013-02-19 14 views
6

को संसाधित करने के लिए एंड्रॉइड असिंटास्क मैं कुछ लाइव वीडियो प्रोसेसिंग करने के प्रयास के लिए ओपनसीवी का उपयोग कर रहा हूं। चूंकि प्रसंस्करण काफी भारी है, इसलिए यह आउटपुट फ्रेम को काफी हद तक देरी करता है, जिससे लाइव स्ट्रीम चकाचौंध दिखती है।लाइव वीडियो फ्रेम

मैं कुछ प्रसंस्करण को AsyncTask में ऑफ़लोड करना चाहता हूं। मैंने कोशिश की है और यह वास्तव में वीडियो को बहुत आसान बनाता है। हालांकि, यह एक बार में बड़ी संख्या में कार्य शुरू होता है, और फिर वे धीरे-धीरे कुछ परिणामों के साथ वापस आना शुरू कर देंगे।

क्या इसे धीमा करने का कोई तरीका है, और परिणाम के लिए प्रतीक्षा करें, या तो सिंक्रनाइज़ कथन, या किसी अन्य विधि का उपयोग करके?

प्रत्येक कैमरा फ्रेम पर, मैं इन कार्यों में से एक शुरू करता हूं। DoImgProcessing लंबे प्रसंस्करण करता है और एक स्ट्रिंग परिणाम देता है।

private class LongOperation extends AsyncTask<Mat, Void, String> { 

    @Override 
    protected String doInBackground(Mat... params) { 
     Mat inputFrame = params[0]; 
     cropToCenter(inputFrame); 
     return doImgProcessing(inputFrame); 
    }  

    @Override 
    protected void onPostExecute(String result) { 
     Log.d(TAG, "on post execute: "+result); 

    } 

    @Override 
    protected void onPreExecute() { 
     Log.d(TAG, "on pre execute"); 
    } 
} 

public Mat onCameraFrame(Mat inputFrame) { 
    inputFrame.copyTo(mRgba);//this will be used for the live stream 
    LongOperation op = new LongOperation(); 
    op.execute(inputFrame); 
    return mRgba; 
} 
+0

मैं फ्रेम को डालने के लिए ब्लॉकिंगक्यू के साथ एक थ्रेड का उपयोग करता हूं। – njzk2

+0

मैंने इनमें से कोई भी कभी नहीं लिखा है, अगर आप थोड़ा सा नमूना कोड – Jameo

उत्तर

3

मैं ऐसा ही कुछ करना होगा।

यह रिसेप्शन और फ्रेम के उपचार को डीकोरलेट करता है। आप frames.size() का उपयोग कर कतार के विकास की निगरानी कर सकते हैं।

यह एक ठेठ निर्माता-उपभोक्ता उदाहरण है।

+0

बहुत बढ़िया उदाहरण। हालांकि, दो सवाल, पहले, यह बूलियन चलने वाले चर, क्या सैद्धांतिक रूप से पूरे गतिविधि में चल रहे हैं? साथ ही, क्या आप सुझाव देते हैं कि कतार में फ्रेम जोड़ते समय, मैं कुछ कहता हूं, अगर (frames.size() <4) {frames.put (inputFrame);} ?? – Jameo

+1

आमतौर पर, आपको स्टॉप स्थिति के लिए निर्णय लेना होगा। 'running = false' इसे संभालने का एक तेज़ और सरल तरीका है, लेकिन इसका मतलब है कि आप शेष कतार छोड़ देंगे (जो अपेक्षित व्यवहार हो सकता है या नहीं)। – njzk2

+1

कतार के आकार के लिए, आप एक निश्चित क्षमता कतार (कन्स्ट्रक्टर में सीमा जोड़ें) का उपयोग कर सकते हैं, और 'ऑफर (इनपुटफ्रेम)' का उपयोग कर सकते हैं, जो ऑब्जेक्ट डालने का प्रयास करेगा, और यदि कोई कमरा उपलब्ध न हो तो झूठी वापसी करें। इसका मतलब है कि आप फ्रेम छोड़ सकते हैं, लेकिन आपके पास रीयल-टाइम उपचार के करीब कुछ होगा। – njzk2

1

यदि आप प्रत्येक फ्रेम पर ऐसा कर रहे हैं, तो ऐसा लगता है कि आपको इसके बजाय थ्रेड की आवश्यकता है। एक AsyncTask तब होता है जब आप किसी अन्य थ्रेड पर एक-ऑफ गतिविधि करना चाहते हैं। यहां आप इसे बार-बार करना चाहते हैं। बस एक थ्रेड बनाएं, और जब यह फ्रेम समाप्त हो जाए तो यह यूआई थ्रेड पर पोस्ट चरण चलाने के लिए एक हैंडलर को एक संदेश पोस्ट करे। अगले फ्रेम के लिए तैयार होने के लिए यह अपने लूप के शीर्ष पर एक सेमफोर पर इंतजार कर सकता है।

// Example value for a timeout. 
private static final long TIMEOUT = 1000L; 

private BlockingQueue<Mat> frames = new LinkedBlockingQueue<Mat>(); 

Thread worker = new Thread() { 
    @Override 
    public void run() { 
     while (running) { 
      Mat inputFrame = frames.poll(TIMEOUT, TimeUnit.MILLISECONDS); 
      if (inputFrame == null) { 
       // timeout. Also, with a try {} catch block poll can be interrupted via Thread.interrupt() so not to wait for the timeout. 
       continue; 
      } 
      cropToCenter(inputFrame); 
      String result = doImgProcessing(inputFrame); 
     } 
    } 
}; 
worker.start(); 

public Mat onCameraFrame(Mat inputFrame) { 
    inputFrame.copyTo(mRgba);//this will be used for the live stream 
    frames.put(inputFrame); 
    return mRgba; 
} 

onCameraFrame कतार, क़तार से कार्यकर्ता धागा चुनाव पर फ्रेम कहते हैं:

+0

दे सकते हैं तो मैं आपके उत्तर को स्वीकार करने में प्रसन्न हूं, मैं देख सकता हूं कि यह कैसे काम कर सकता है । लेकिन वास्तव में एक AsyncTask वास्तव में सिर्फ एक धागा नहीं है? – Jameo

+0

क्या आपको लगता है कि एक समय में सिस्टम को एक से अधिक फ्रेम प्रोसेसिंग शुरू करने का लाभ है? – Jameo

+0

यह धागे पर चलता है, लेकिन धागा निकलता है। यदि आप कुछ भी कर रहे हैं, तो वास्तव में आप जो चाहते हैं उसका मुकाबला कर सकते हैं। 1 से अधिक के लिए- वास्तव में एक समय में 1 से अधिक एसिंक कार्य प्राप्त करना मुश्किल है, इसके लिए कुछ एंड्रॉइड संस्करणों पर विशेष कोड की आवश्यकता होती है। और यह केवल तभी उपयोगी होगा जब ओएस उन्हें विभिन्न कोरों पर चलाने के लिए स्मार्ट रोन है, जो मुझे संदेह है। –

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