दूसरे धागे से फ़्लटर इंजन के तरीकों को कैसे कॉल करें


9

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

आप देख सकते हैं कि इंजन के सभी कॉल शेल में समाप्त होते हैं, जो हमेशा यह देखने के लिए जांच करते हैं कि क्या कॉल उसी थ्रेड से किए जा रहे हैं जिसने कॉल बनाया है:

task_runners_.GetPlatformTaskRunner()->RunsTasksOnCurrentThread()

( https://github.com/flutter/engine/blob/master/shell/common/shell.cc#L838 )

इस तरह से मैं स्पंदन इंजन बना रहा हूं:

int main(int argc, char **argv) {
  //..

  flutter::FlutterWindowController flutter_controller(icu_data_path);

  // Start the engine.
  if (!flutter_controller.CreateWindow(800, 600, "Flutter WebRTC Demo", assets_path,
                                       arguments)) {
    return EXIT_FAILURE;
  }

  // Register any native plugins.
  FlutterWebRTCPluginRegisterWithRegistrar(
      flutter_controller.GetRegistrarForPlugin("FlutterWebRTCPlugin"));

  // Run until the window is closed.
  flutter_controller.RunEventLoop();
  return EXIT_SUCCESS;
}

जैसा कि आप देख सकते हैं, इंजन बनाने वाला धागा अवरुद्ध हो जाता है flutter_controller.RunEventLoop();जिसके द्वारा एकमात्र स्थान है जो मैं एक इवेंट डिस्पैचर डाल सकता हूं जो मुख्य थ्रेड से निष्पादित होने वाली चीजों को मजबूर करता है। मुझे यह विचार पसंद नहीं है। हालांकि RunEventLoopWithTimeoutमौजूद होने के बावजूद , मुझे कॉलआउट के लिए एक कतार लगाने और एक कतार में जाँच करने की आवश्यकता है MarkTextureFrameAvailable। मुझे नहीं लगता कि यह इष्टतम है।

तो मुझे MarkTextureFrameAvailableमुख्य धागे से कैसे कॉल करना चाहिए ?

मुझे MarkTextureFrameAvailableयहाँ के उपयोग का एक उदाहरण मिला : https://github.com/cloudwebrtc/flutter-webrtc/blob/desktop/common/src/flutter_video_renderer.cc#L90 और ऐसा लगता है कि यह एक और धागा है जो इसे कहता है। यह कैसे संभव है? जब मैं करता हूं, मुझे एक FATAL त्रुटि मिलती है, लेकिन वह करता है और यह काम करता है?

मैंने दो दिन बिताने की कोशिश की कि कौन सा धागा इस उदाहरण पर OnFrame को कॉल करता है लेकिन यह पता नहीं लगा सका क्योंकि यह https://github.com/flutter-webrtc/libwebrtc का उपयोग करता है जो कि Google के webrtc का उपयोग करता है: https://github.com/ जंपयंग001 / वेब्रटेक जो मेरे लिए बहुत बड़ा है, जहां से ओनफ्रेम कहा जाता है। लेकिन यह मुझे एक धागे से होना चाहिए। यह कैसे संभव है?


यदि आप मुख्य रन-अप में आवधिक कार्यों को चलाने के लिए एक टाइमआउट का उपयोग करने का विकल्प चाहते हैं, तो आप एक आवरण के माध्यम से glfwPostEmptyEvent को उजागर करने के लिए एक फ़्लटर इंजन पीआर प्रस्तुत कर सकते हैं। मुख्य रनलूप को जगाने का एक तरीका GLFW एम्बेडिंग API के लिए एक उचित अतिरिक्त है।
सूंघा

@smagon मैं कोशिश करूँगा, लेकिन मैं इस उदाहरण पर चकित हूँ कि github.com/cloudwebrtc/flutter-webrtc/blob/desktop/common/src/… RunEventLoWWithTimeOut के बिना करता है। चूंकि वह मुख्य धागे को ब्लॉक करता है flutter_controller.RunEventLoop(), तो निश्चित MarkTextureFrameAvailableरूप से दूसरे धागे से बुलाया जाना चाहिए, जो असंभव होना चाहिए!
लुकास ज़नेला

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

जवाबों:


3

इस उत्तर के लिए चेतावनी के लिए मेरी टिप्पणी देखें। ऐसा प्रतीत होता है कि आपके द्वारा प्रदान की गई उदाहरण परियोजना एक सरल चाल के साथ इसे पूरा करती है। वे एक नया वर्ग बनाते हैं जो अन्य चीजों के बीच ओवरराइड करने वाले स्पंदन रेंडरर वर्ग को विरासत में मिला है OnFrame। जब उस ओवरराइड को फ़्लटर थ्रेड के संदर्भ में कहा जाता है और इसलिए यह अपेक्षित रूप से काम करता है।


मदद करने के आपके प्रयास से बहुत बहुत धन्यवाद! हालाँकि, Texture,फ़्लटर से वर्ग जो इसे उपवर्ग करता है जिसके पास ऑनफ्रेम विधि नहीं है। वह ऑनफ्रेम विधि वह है, RTCVideoRendererजिसका फ़्लटर से कोई लेना-देना नहीं है।
लुकास ज़ेनेला

देखें यहाँ । ऐसा लगता है कि वे स्पंदन को ओवरराइड करते हैं, और संभवतः एक समर्थित प्लगइन सिस्टम का उपयोग कर रहे हैं। मेरी सबसे अच्छी सलाह यह होगी कि आप फ्लटर डॉक्यूमेंटेशन पढ़ें। मैं शर्त लगाने के लिए तैयार रहूंगा यदि आपने बीपी को ऑनफ्रेम में रखा है तो यह उम्मीद के मुताबिक फ्लटर धागे के संदर्भ में होगा।
अचार रिक

मैं प्लगइन प्रणाली का उपयोग कर रहा हूँ और मैं प्रलेखन पढ़ा है, वहाँ कोई onFrame विधि है। FlutterVideoRenderer क्लास में Flutter से एकमात्र चीज़ बनावट है, जिसमें कोई ऑनफ्रेम विधि नहीं है। असल में मैं कहाँ onFrame परिभाषित किया गया है पाया, और जैसा कि आप यहाँ देख सकते हैं WebRTC पुस्तकालय से एक बात यह है github.com/JumpingYang001/webrtc/...
लुकास Zanella

@LucasZanella अचार रिक सही है, दो वर्गों से FlutterVideoRenderer विरासत में मिला है - Texture(लाइन 16) और RTCVideoRenderer<scoped_refptr<RTCVideoFrame>>(लाइन 17) (C ++ कई विरासत की अनुमति देता है) और फिर यह OnFrameविधि (लाइन 24) को ओवरराइड करता है । जब OnFrameघटना को निकाल दिया जाता है, तो इसे आपके मुख्य धागे के संदर्भ में निष्पादित किया जाता है।
4LegsDrivenCat

@ 4LegsDrivenCat लेकिन OnFrame Flutter से नहीं है, यह RTCVideoRenderer से है जो Flutter से नहीं है
Lucas Zanella
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.