我正在努力学习GStreamer。我使用的是macOS 10.13-x86_64 我开始研究this教程。
最初我安装了GStreamer .pkg 文件
GStreamer已安装在/Library/Frameworks/GStreamer.framework
中
我设法编译并运行教程,但我被要求使用sudo
来访问/Library/Frameworks/GStreamer.framework
目录。
后来我发现我可以通过自制软件安装GStreamer
因此,我手动删除/Library/Frameworks/GStreamer.framework
并运行以下命令:
brew install gstreamer gst-plugins-base gst-plugins-good gst-plugins-bad gst-plugins-ugly gst-libav
不幸的是,本教程现在抛出运行时错误。
./basic-1
[1] 1873 illegal hardware instruction ./basic-1
我尝试用lldb调试错误(我对lldb很新,几乎什么都没有)。
lldb basic-1
(lldb) target create "basic-1"
Current executable set to 'basic-1' (x86_64).
(lldb) run
Process 2129 launched: '/Users/aleksey/projects/media/gstreamer-dummy/basic-1' (x86_64)
Process 2129 stopped
* thread #14, stop reason = EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
frame #0: 0x00007fff3b0e3939 CoreFoundation`__CFRunLoopDeallocate + 537
CoreFoundation`__CFRunLoopDeallocate:
-> 0x7fff3b0e3939 <+537>: ud2
0x7fff3b0e393b <+539>: nopl (%rax,%rax)
CoreFoundation`__CFRunLoopCleanseSources:
0x7fff3b0e3940 <+0>: pushq %rbp
0x7fff3b0e3941 <+1>: movq %rsp, %rbp
Target 0: (basic-1) stopped.
而且我知道不要该怎么做。
我用
编译代码gcc -Wall basic-tutorial-1.c -o basic-1 $(pkg-config --cflags --libs gstreamer-1.0)
我有以下配置
$ pkg-config --cflags --libs gstreamer-1.0
-D_REENTRANT -I/usr/local/Cellar/gstreamer/1.12.3/include/gstreamer-1.0 -I/usr/local/Cellar/glib/2.54.1/include/glib-2.0 -I/usr/local/Cellar/glib/2.54.1/lib/glib-2.0/include -I/usr/local/opt/gettext/include -I/usr/local/Cellar/pcre/8.41/include -L/usr/local/Cellar/gstreamer/1.12.3/lib -L/usr/local/Cellar/glib/2.54.1/lib -L/usr/local/opt/gettext/lib -lgstreamer-1.0 -lgobject-2.0 -lglib-2.0 -lintl -Wl,-framework -Wl,CoreFoundation
你可以帮帮我吗?有什么问题?
答案 0 :(得分:1)
我遇到了同样的问题,我找到了一些答案here (https://bugzilla.gnome.org/show_bug.cgi?id=790242)。我正在等待一些额外的评论https://github.com/sdroege/gstreamer-rs/issues/58
总结:
<块引用>现在看来教程(至少是第一个教程)在 macOS 上已经有些年头了。
<块引用>[Sebastian Dröge (slomo) 2017-11-12 12:41:44 UTC]
参见 https://github.com/sdroege/gstreamer-rs/issues/58 ,同样适用于 C 教程。
问题是对于 osxvideosink 和 glimagesink 我们需要运行一个 macOS 主线程上的 NSRunLoop。我们打过补丁的 GLib 版本可以 当你运行一个 GMainLoop(上游 GLib 不会!),但是 示例仅使用 gst_bus_timed_pop_filtered() 以便也 没用。
使用 GMainLoop 会使教程更加丰富 复杂的,必须引入更多的 API,总会有 是回调等
不知道该怎么办!
可能的解决方案:
<块引用>[Kornel 2017-11-12 13:34:16 UTC]
通过运行示例,我设法使简单的示例工作 一个线程,并在主线程上调用 CFRunLoopRun()。这个需要 仅与foundation.framework 链接。
[更新 01] 我能够成功编译并运行 Basic tutorial 12: Streaming。
[更新 02]
<块引用>来自:Sebastian Dröge [2020 年 12 月 29 日上午 11:53 GMT+0100]
并不是你需要一个 GLib 主循环,而是 macOS 要求你 在主线程上运行一个 NSRunLoop 以便各种 macOS API 工作 正确。 GStreamer 视频接收器使用此类 API。 GLib 主循环 (来自 GStreamer 二进制文件附带的 GLib 版本!)运行一个 NSRunLoop 本身就是出于这个原因。这是 macOS 的限制 你必须以某种方式适应并且与 GStreamer 无关, 这可能应该在更突出的地方提到 GStreamer 文档。
更多信息:https://gitlab.freedesktop.org/gstreamer/gst-docs/-/issues/79