2011-12-08 52 views
9

यह अक्सर पूछे जाने वाले प्रश्न पर एक भिन्नता है लेकिन मुझे यह सटीक स्थिति दिखाई नहीं दे रही है, इसलिए मैं इसे वहां फेंक दूंगा।कैमरा पूर्वावलोकन कॉलबैक बफर का अभिविन्यास कैसे बदलें?

मेरे पास एक ऑनप्रूफ्रेम कॉलबैक सेट अप है। यह एक बाइट [] में एनवी 21 डेटा के साथ मिलता है। हम h.264 इसे एन्कोड करते हैं और इसे एक वीडियो स्ट्रीम के रूप में भेजते हैं। दूसरी तरफ, हम फोन के आधार पर वीडियो को 90 या 270 डिग्री सेल्सियस देखते हैं।

तो सवाल यह है कि डेटा कैसे घुमाएं, केवल पूर्वावलोकन छवि नहीं? कैमरा। पैरामीटर.सेट रोटेशन केवल तस्वीर लेने पर प्रभाव डालता है, वीडियो नहीं।

इस बाइट सरणी onPreviewFrame (बाइट [], कैमरा), जेपीईजी चित्र, या रिकॉर्ड किए गए वीडियो में पारित के आदेश को प्रभावित नहीं करता: Camera.setDisplayOrientation विशेष रूप से यह केवल प्रदर्शित पूर्वावलोकन, नहीं फ्रेम बाइट्स को प्रभावित करता है कहते हैं।

तो क्या किसी भी एपीआई स्तर पर बाइट सरणी के अभिविन्यास को बदलने के लिए कोई तरीका है? यह असफल हो रहा है, क्या आप एनवी 21 (वाईवीयू) प्रारूप को भी घुमा सकते हैं, जिसमें यह आ रहा है, या मुझे पहले आरजीबी की आवश्यकता है?

+2

शायद मैं याद कर रहा हूँ, लेकिन यह चल रहा है की एक अपेक्षाकृत सीधे आगे काम नहीं है - हम libyuv, एक बहुत ही सुविधाजनक समारोह है कि दोनों घूमता है और यह धर्मान्तरित जो का उपयोग कर समाप्त हो गया एक मैट्रिक्स के माध्यम से डेटा को घुमाने के लिए जिस तरह से आप चाहते हैं? संभवतः आप अपने पूर्वावलोकन की चौड़ाई और ऊंचाई को जानते हैं, इसलिए, आप केवल बाइट्स को एक नए बाइट सरणी में कॉपी करने में सक्षम होना चाहिए, जिसने उन्हें वांछित अभिविन्यास में क्रमबद्ध किया है, नहीं? मैंने यह नहीं किया है, इसलिए, शायद मैं बेस से दुखी हूँ। –

+0

नहीं, यह ऐसा करेगा, लेकिन प्रत्येक फ्रेम के लिए ऐसा करने के लिए, 5ps कहने पर, बहुत सारी प्रसंस्करण की तरह लगता है। लेकिन मुझे लगता है कि यह एकमात्र तरीका हो सकता है। – Hieronymus

उत्तर

1

बाहर कर देता है कि आप इसे बंद भेजने से पहले प्रत्येक फ्रेम अपने आप को बारी बारी से करने की आवश्यकता है। libyuv :: ConvertToI420

कुछ

https://code.google.com/p/libyuv/

0

मुझे लगता है कि आपको स्वयं तस्वीर को घुमाने की आवश्यकता होगी। मैंने इसे एनडीके और लेप्टनिका पुस्तकालय का उपयोग करने के बाद किया था। मेरे कोड पर एक नज़र आपको शुरू करनी चाहिए। सैमसंग गैलेक्सी एस 2 पर प्रदर्शन ठीक था (मुझे लगता है कि मुझे लगभग 15 फ्रेम मिल गए हैं)। चूंकि मैं परिणाम को ओपनजीएल बनावट में दबा रहा था, इसलिए मुझे रंग बाइट्स को चारों ओर घूमना पड़ा .. आप छवि को सीधे लूप में घुमाकर इसे तेज कर सकते हैं जो यूयू डेटा को डीकोड करता है ..

mPix32 और mPix8 थे पहले से परिवर्तित data.You धारण करने के लिए निश्चित रूप से अपनी स्वयं की छवि डेटा संरचना के साथ बदलने के लिए की आवश्यकता होगी आवंटित ..

jint Java_de_renard_ImageFilter_nativeProcessImage(JNIEnv *env, jobject javathis, jbyteArray frame) { 
    .... 
    jbyte *data_buffer = env->GetByteArrayElements(frame, NULL); 
    l_uint8 *byte_buffer = (l_uint8 *) data_buffer; 
    yuvToPixFast(byte_buffer, mPix32, mPix8); 
    env->ReleaseByteArrayElements(frame, data_buffer, JNI_ABORT); 
    .... 
} 

static inline void yuvToPixFast(unsigned char* pY, Pix* pix32, Pix* pix8) { 
    int i, j; 
    int nR, nG, nB; 
    int nY, nU, nV; 
    l_uint32* data = pixGetData(pix32); 
    l_uint32* data8 = pixGetData(pix8); 
    l_int32 height = pixGetHeight(pix32); 
    l_int32 width = pixGetWidth(pix32); 
    l_int32 wpl = pixGetWpl(pix32); 
    l_int32 wpl8 = pixGetWpl(pix8); 
    l_uint8 **lineptrs = pixSetupByteProcessing(pix8, NULL, NULL); 
    l_uint8* line8; 

    //memcpy(data8,pY,height*width); 

    unsigned char* pUV = pY + width * height; 

    for (i = 0; i < height; i++) { 
     nU = 0; 
     nV = 0; 
     unsigned char* uvp = pUV + (i >> 1) * width; 
     line8 = lineptrs[i]; 
     memcpy(line8, pY, wpl8 * 4); 

     for (j = 0; j < width; j++) { 

      if ((j & 1) == 0) { 
       nV = (0xff & *uvp++) - 128; 
       nU = (0xff & *uvp++) - 128; 
      } 
      // Yuv Convert 
      nY = *(pY++); 
      //*line8++ = (l_uint8) nY; 
      nY -= -16; 

      if (nY < 0) { 
       nY = 0; 
      } 
      int y1192 = nY * 1192; 

      /*double saturation to increase cartoon effect*/ 
      //nU<<=1; 
      //nV<<=1; 

      nB = y1192 + 2066 * nU; 
      nG = y1192 - 833 * nV - 400 * nU; 
      nR = y1192 + 1634 * nV; 

      if (nR < 0) { 
       nR = 0; 
      } else if (nR > 262143) { 
       nR = 262143; 
      } 
      if (nG < 0) { 
       nG = 0; 
      } else if (nG > 262143) { 
       nG = 262143; 
      } 
      if (nB < 0) { 
       nB = 0; 
      } else if (nB > 262143) { 
       nB = 262143; 
      } 
      //RGBA 
      //ABGR 
      *data++ = ((nR << 14) & 0xff000000) | ((nG << 6) & 0xff0000) | ((nB >> 2) & 0xff00) | (0xff); 
      //*data++ = (0x00 << 24) | (0xff<<16) | (0x00<<8) | (0xff) ; 
      //*data++ = (0xff << 24) | ((nB << 6) & 0xff0000) | ((nG >> 2) & 0xff00) | ((nR >> 10) & 0xff); 
     } 
    } 
    pixCleanupByteProcessing(pix8, lineptrs); 

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