2016-09-13 4 views
6

मैं एंड्रॉइड से फेसबुक पर लाइव स्ट्रीम करना चाहता हूं। मैं एफबी में स्ट्रीमिंग के लिए एक मौजूदा उदाहरण को अनुकूलित करने में सक्षम था।javaCV एंड्रॉइड, rtmp सर्वर पर स्ट्रीमिंग करते समय ओवरले पर अजीब रंग

पहला कदम कम या ज्यादा काम करता है (ऑडियो अभी भी एक समस्या है, लेकिन उसे दायरे में नहीं)। मैं एफबी को स्ट्रीम कर सकता हूं।

अब मैं एक पारदर्शी पीएनजी छवि के साथ स्ट्रीम ओवरले करना चाहता हूं।

मैं द्वारा शुरू पर एक FFmpegFrameFilter बनाने हूँ:

try{ 
    filter = new FFmpegFrameFilter("movie="+path+"/image.png [logo];[in][logo]overlay=0:0:format=rgb [out]",imageWidth, imageHeight); 
    filter.start(); 
}catch (FrameFilter.Exception e){ 
    Log.e(CLASS_LABEL,"Error while starting filter: "+e.getMessage()); 
    e.printStackTrace(); 
} 

और प्रत्येक फ्रेम पर मैं निम्नलिखित है:

filter.push(yuvImage); 

Frame frame; 
while ((frame = filter.pull()) != null) { 
    recorder.record(frame,avutil.AV_PIX_FMT_NV21); 
} 
समस्या

मैं पता नहीं है कि जो पिक्सेल प्रारूप मैं चाहिए है उपयोग। मेरे ओवरले छवि आरजीबी रंग (https://postimg.org/image/f1ri3vj43/)

ऊपर पिक्सेल प्रारूप मैं कुछ इस तरह मिल के साथ

है: https://postimg.org/image/45ha64q9z/

मैं बहुत निराश के बाद से मैं पहले से ही कई पिक्सेल प्रारूपों की कोशिश की है। सभी एक अलग आउटपुट के साथ, कभी-कभी लोगो कई बार प्रकट होता है।

क्या यह पता लगाने का कोई तरीका है कि मुझे avutil.java संभावनाओं से कौन सा चयन करना चाहिए?

संपादित करें: आप पर https://github.com/y4nnick/android_streaming/blob/master/app/src/main/java/com/example/yannick/olay1/RecordActivity.java

संपादित पूरे कोड पा सकते हैं: मैं allready की कोशिश की निम्न स्वरूपों:

// AV_PIX_FMT_ARGB --> 4 at once, all black/white 
// AV_PIX_FMT_0RGB --> 4 at once, all black/white 
// AV_PIX_FMT_BGR8 --> 1 a bit to big, strange colors 
// AV_PIX_FMT_BGR4_BYTE --> 1 a bit to big, stranger blue tint 
// AV_PIX_FMT_YUVA422P_LIBAV --> error: Cannot initialize the conversion context. 
// AV_PIX_FMT_FLAG_ALPHA --> error: Cannot initialize the conversion context. 
// AV_PIX_FMT_FLAG_PLANAR --> error: Cannot initialize the conversion context. 
// AV_PIX_FMT_RGB4 --> error: Cannot initialize the conversion context. 
// AV_PIX_FMT_RGB32_1 --> 4 at a time, all black/white 
// AV_PIX_FMT_0BGR --> 4 at a time, all black/white 
// AV_PIX_FMT_YVYU422 --> 2 side by side, gruen, purple tint 
// AV_PIX_FMT_YUVJ422P --> Fatal signal 11 (SIGSEGV) at 0x61f7xf000 (code=1), thread 18401 (e.yannick.olay1) 
// AV_PIX_FMT_BAYER_BGGR8 --> 1 a bit to big, black/white 
// AV_PIX_FMT_BAYER_GBRG8 --> 1 a bit to big, black/white 
// AV_PIX_FMT_FLAG_RGB --> 2 a bit to big, black/white 
// AV_PIX_FMT_RGB555LE --> 2 a bit to big, strange colors 
// AV_PIX_FMT_RGB555BE --> 2 a bit to big, strange colors 
// AV_PIX_FMT_RGB555 --> 2 a bit to big, strange colors 
// AV_PIX_FMT_RGB4_BYTE --> 1 a bit to big, orange tint 
// AV_PIX_FMT_RGBA64 --> 8 side by side, black/white 
// AV_PIX_FMT_RGB24 --> 3 side by side, red tint 
+0

चूंकि आप फ़िल्टर पर "प्रारूप = आरजीबी [आउट]" निर्दिष्ट करते हैं, इसलिए आपके द्वारा खींचे गए फ्रेम शायद RGB24 होने जा रहे हैं, इसलिए मैं AV_PIX_FMT_NV21 के बजाय AV_PIX_FMT_RGB24 का प्रयास करूंगा। –

+0

आपकी मदद के लिए धन्यवाद। दुर्भाग्यवश मुझे एक लाल रंग के साथ तीन बार एक तरफ लोगो मिलता है। https://postimg.org/image/he7rq0pev/। – schw4ndi

+0

AV_PIX_FMT_BGR24 के साथ मुझे यह मिलता है: https://postimg.org/image/bf08l4egh/। रंग अभी है, लेकिन मुझे तीन लोगो मिलते हैं, और मूल कैमव काली काला/सफेद है। क्या यह हो सकता है कि मुझे फ्रेम पर चैनल नंबर, या FFmpegFrameRecorder पर पिक्सेल प्रारूप को बदलना है? – schw4ndi

उत्तर

1

मैं यह पता लगा:

  1. जो प्रारूप जानकारी प्राप्त करें आपका एंड्रॉइड कैमरा

    mCamera = Camera.open(); 
    Camera.Parameters params = mCamera.getParameters(); 
    for(int i: params.getSupportedPreviewFormats()) { 
        Log.e(TAG, "preview format supported are = "+i); 
    } 
    
    चलाकर समर्थन करता है

    आपको इंटेजर्स की एक सूची मिल जाएगी। मेरे मामले में 17 और 8420 9 4169. मैं 8420 9 4169 (वाईवी 12) के साथ जाऊंगा। तो बुला

    mCamera.getParameters().setPreviewFormat(ImageFormat.YV12); 
    
  2. गोटो https://developer.android.com/reference/android/graphics/ImageFormat.html द्वारा कि के लिए अपने कैमरे सेट और जाँच कैसे अपने समर्थित स्वरूपों वास्तव में परिभाषित कर रहे हैं।

  3. गोटो https://ffmpeg.org/ffmpeg-filters.html#overlay-1 है और अपने फिल्टर जो आप उपयोग करना चाहते के लिए जाँच, मेरा ओवरले फिल्टर है। यह फ़िल्टर 'प्रारूप' नामक पैरामीटर प्रदान करता है, इसे अपने कैमरे से प्राप्त निकटतम (YV12 सूची में नहीं है) पर सेट करें। मेरे मामले में 'yuv420'। फिल्टर अब इस तरह दिखता है:

    filter = new FFmpegFrameFilter("movie="+path+"/image.png [logo];[in][logo]overlay=0:0:format=yuv420 [out]",imageWidth, imageHeight); 
    
  4. फ्रेम रिकॉर्डिंग करते समय सही पिक्सेल प्रारूप सेट करें:

    Frame frame; 
    while ((frame = filter.pull()) != null) { 
        Log.i(LOG_TAG,"In record-pull"); 
        recorder.record(frame,avutil.AV_PIX_FMT_YUV420P); 
    } 
    

सच है कि आप एक ही करने के लिए अपने सभी pixelformats सेट करना चाहिए।यह सभी साइटों को फेंकने के लिए खोजना थोड़ा मुश्किल है, जो आपके सभी 'घटक' समर्थन को प्रारूपित करने के लिए है।

एक सुझाया गया वैकल्पिकता कैमरे से आरजीबी छवि में वाईयूवी छवि को परिवर्तित करना होगा। देखें Converting YUV->RGB(Image processing)->YUV during onPreviewFrame in android?

मैंने यह कोशिश नहीं की क्योंकि मैंने सिखाया कि यह धीमा होना और पहले एक आसान समाधान की कोशिश करना होगा।

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