在 Flutter 应用程序中使用带有 Gstreamer 的窗口

问题描述 投票:0回答:1

我正在 Flutter 应用程序中使用 Gstreamer,目前正在开发 MacOS 版本。

在桌面版本中,我想控制显示视频的窗口。我已经阅读了使用 GTK 和 QT 的 Gstreamer 示例,但 Flutter 似乎不像这些示例那么友好,我正在尝试使用另一个窗口库。当我引入 SDL 或 GLFW 并初始化这两个库中的任何一个时,libdispatch 会在初始化期间导致崩溃。

EXC_BREAKPOINT (code=1, subcode=0x18d046d0c)

libdispatch.dylib!_dispatch_assert_queue_fail (Unknown Source:0)
libdispatch.dylib!dispatch_assert_queue (Unknown Source:0)
HIToolbox!islGetInputSourceListWithAdditions (Unknown Source:0)
HIToolbox!isValidateInputSourceRef (Unknown Source:0)
HIToolbox!TSMGetInputSourceProperty (Unknown Source:0)
native_binding!_glfwPlatformInit (Unknown Source:0)
native_binding!glfwInit (Unknown Source:0)
native_binding!::SetupPipeline() (/Users/beng/experiments/upwork/rhub/flutter-app/fltgst-master/app/native_binding/src/native_binding.cpp:52)
[Unknown/Just-In-Time compiled code] (Unknown Source:0)
FlutterMacOS!dart::DartEntry::InvokeFunction(dart::Function const&, dart::Array const&, dart::Array const&) (Unknown Source:0)
FlutterMacOS!dart::DartLibraryCalls::HandleMessage(long long, dart::Instance const&) (Unknown Source:0)
FlutterMacOS!dart::IsolateMessageHandler::HandleMessage(std::_LIBCPP_ABI_NAMESPACE::unique_ptr<dart::Message, std::_LIBCPP_ABI_NAMESPACE::default_delete<dart::Message>>) (Unknown Source:0)
FlutterMacOS!dart::MessageHandler::HandleMessages(dart::MonitorLocker*, bool, bool) (Unknown Source:0)
FlutterMacOS!dart::MessageHandler::HandleNextMessage() (Unknown Source:0)
FlutterMacOS!Dart_HandleMessage (Unknown Source:0)
FlutterMacOS!tonic::DartMessageHandler::OnHandleMessage(tonic::DartState*) (Unknown Source:0)
FlutterMacOS!std::_LIBCPP_ABI_NAMESPACE::__function::__func<tonic::DartMessageHandler::OnMessage(tonic::DartState*)::$_0, std::_LIBCPP_ABI_NAMESPACE::allocator<tonic::DartMessageHandler::OnMessage(tonic::DartState*)::$_0>, void ()>::operator()() (Unknown Source:0)
FlutterMacOS!std::_LIBCPP_ABI_NAMESPACE::__function::__func<flutter::DartIsolate::SetMessageHandlingTaskRunner(fml::RefPtr<fml::TaskRunner> const&)::$_0::operator()(std::_LIBCPP_ABI_NAMESPACE::function<void ()>) const::'lambda'(), std::_LIBCPP_ABI_NAMESPACE::allocator<flutter::DartIsolate::SetMessageHandlingTaskRunner(fml::RefPtr<fml::TaskRunner> const&)::$_0::operator()(std::_LIBCPP_ABI_NAMESPACE::function<void ()>) const::'lambda'()>, void ()>::operator()() (Unknown Source:0)
FlutterMacOS!fml::MessageLoopImpl::FlushTasks(fml::FlushType) (Unknown Source:0)
FlutterMacOS!fml::MessageLoopDarwin::OnTimerFire(__CFRunLoopTimer*, fml::MessageLoopDarwin*) (Unknown Source:0)

我还想知道是否可以直接使用 GstGLWindow。我尝试过创建这样一个窗口:

GstGLDisplay *d = gst_gl_display_new_with_type(GST_GL_DISPLAY_TYPE_COCOA);
GstGLWindow *w = gst_gl_window_new(d);
gst_gl_window_show(w);
guintptr h = gst_gl_window_get_window_handle(w);

但没有出现窗口。我想知道是否有人对此有建议,您是否会推荐其他方法,或者我的方法是否完全错误。对于我缺乏图形库经验表示歉意。

flutter gstreamer sdl glfw ffi
1个回答
0
投票

问题是我正在调用

glfwInit()
大约 5 个线程深入应用程序。这是因为 Flutter 构建了一个 MacOS 应用程序,其中嵌入了 Flutter 内容(大约 5 个线程深)。相反,我必须打开 xcode 并将 GLFW 链接到 MacOS 应用程序,然后从 Swift 代码调用 init。

这很有启发: https://medium.com/@eibaan_54644/desktop-flutter-apps-8602dac54f68

© www.soinside.com 2019 - 2024. All rights reserved.