Linuxのフラッターデスクトップを使用しています。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を呼び出すスレッドを見つけるために2日間費やしましたが、googleのwebrtcを使用するhttps://github.com/flutter-webrtc/libwebrtcを使用しているため、見つけることができませんでした:https : //github.com/ JumpingYang001 / webrtcは、OnFrameの呼び出し元を見つけるには大きすぎます。しかし、それは糸から私でなければなりません。どのように可能ですか?
flutter_controller.RunEventLoop()
、確かにMarkTextureFrameAvailable
別のスレッドから呼び出されている必要があり、これは不可能です!
OnRender
はFlutterの仮想オーバーライドであるため、Flutterスレッドによって呼び出されます。