Linux için flutter masaüstü kullanıyorum. MarkTextureFrameAvailable
Motor denen bir dokuyu işaretlemesi gereken bir yöntem arıyorum . Bir video oynatıcı programladığım için MarkTextureFrameAvailable
, oynatıcının iş parçacığından aramam gerekiyor . Sorun, motorun beni MarkTextureFrameAvailable
(ve diğer herhangi bir motor yöntemini) motoru oluşturan iplikten aramaya zorlamasıdır .
Motora yapılan tüm çağrıların, çağrıların çağrıyı oluşturan aynı iş parçacığından yapılıp yapılmadığını görmek için her zaman kontrol yapan kabukta olduğunu görebilirsiniz:
task_runners_.GetPlatformTaskRunner()->RunsTasksOnCurrentThread()
( https://github.com/flutter/engine/blob/master/shell/common/shell.cc#L838 )
Çırpınan motorunu şu şekilde yaratıyorum:
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;
}
gördüğünüz gibi, motoru oluşturan iş parçacığı tarafından engellenir flutter_controller.RunEventLoop();
tek şey ana olay iş parçacıkları yürütmek zorunda şeyler bir olay dağıtıcı koymak olabilir. Bu fikri sevmiyorum. Olsa da RunEventLoopWithTimeout
, bir zaman aşımı koymak ve MarkTextureFrameAvailable
aramalar için bir kuyruk kontrol etmeye devam etmeliyim . Bunun en uygun olduğunu düşünmüyorum.
Peki MarkTextureFrameAvailable
ana mesaj dizisini nasıl aramalıyım ?
MarkTextureFrameAvailable
Burada kullanım için bir örnek buldum : https://github.com/cloudwebrtc/flutter-webrtc/blob/desktop/common/src/flutter_video_renderer.cc#L90 ve onu çağıran başka bir iş parçacığı gibi görünüyor. Bu nasıl mümkün olaiblir? Yaptığımda, bir FATAL hatası alıyorum, ama öyle ve işe yarıyor mu?
Bu örnekte OnFrame'i hangi iş parçacığını çağırdığını anlamaya çalışırken iki gün geçirdim, ancak google'ın webrtc'sini kullanan https://github.com/flutter-webrtc/libwebrtc kullandığı için bulamadım: https://github.com/ OnFrame'in nereden çağrıldığını bulmak benim için çok büyük olan JumpingYang001 / webrtc . Ama bir iş parçacığından beni almalı. Bu nasıl mümkün olaiblir?
flutter_controller.RunEventLoop()
, o zaman kesin MarkTextureFrameAvailable
olarak imkansız olması gereken başka bir iplikten çağrılmalıdır!
OnRender
Flutter sanal bir geçersiz kılma olduğunu, bu yüzden Flutter iş parçacığı tarafından çağrılır.