리눅스에 flutter desktop을 사용하고 있습니다. MarkTextureFrameAvailable
엔진에 의해 다시 렌더링 될 텍스처를 표시해야하는 메소드를 호출 합니다. 비디오 플레이어를 프로그래밍하고 MarkTextureFrameAvailable
있으므로 플레이어의 스레드에서 전화해야합니다 . 문제는 엔진이 MarkTextureFrameAvailable
엔진을 생성 한 스레드에서 (및 다른 엔진 메소드)를 강제로 호출한다는 것 입니다.
엔진에 대한 모든 호출은 항상 셸에서 끝나며 호출을 생성 한 동일한 스레드에서 호출이 이루어 졌는지 항상 확인합니다.
task_runners_.GetPlatformTaskRunner()->RunsTasksOnCurrentThread()
( https://github.com/flutter/engine/blob/master/shell/common/shell.cc#L838 )
이것이 내가 flutter 엔진을 만드는 방법입니다.
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을 하고 그것을 호출하는 다른 스레드의 것 같습니다. 그게 어떻게 가능해? 내가 할 때, 치명적 오류가 발생하지만, 그는 작동하지만 작동합니까?
이 예제에서 어떤 스레드가 OnFrame을 호출하는지 알아 내려고 2 일을 보냈지 만 Google의 webrtc를 사용 하는 https://github.com/flutter-webrtc/libwebrtc 를 사용 하기 때문에 찾을 수 없었 습니다 : https://github.com/ OnFrame 이 어디에서 호출되는지 찾기에 너무 큰 JumpingYang001 / webrtc . 그러나 그것은 실에서 나와야합니다. 그게 어떻게 가능해?
flutter_controller.RunEventLoop()
다음 확실히, MarkTextureFrameAvailable
불가능해야 다른 스레드에서 호출되는되어야합니다!
OnRender
은 Flutter의 가상 재정의이므로 Flutter 스레드에 의해 호출됩니다.