मैं लिनक्स के लिए स्पंदन डेस्कटॉप का उपयोग कर रहा हूं। मैं एक विधि कह रहा हूं जिसे 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 / वेब्रटेक जो मेरे लिए बहुत बड़ा है, जहां से ओनफ्रेम कहा जाता है। लेकिन यह मुझे एक धागे से होना चाहिए। यह कैसे संभव है?
flutter_controller.RunEventLoop()
, तो निश्चित MarkTextureFrameAvailable
रूप से दूसरे धागे से बुलाया जाना चाहिए, जो असंभव होना चाहिए!
OnRender
फ्लटर के एक आभासी ओवरराइड हैं इसलिए यह फ्लटर धागे द्वारा आह्वान किया जाता है।