GStreamer非法硬件指令

时间:2017-10-16 15:00:21

标签: macos clang homebrew gstreamer

我正在努力学习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
你可以帮帮我吗?有什么问题?

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,我找到了一些答案here (https://bugzilla.gnome.org/show_bug.cgi?id=790242)。我正在等待一些额外的评论https://github.com/sdroege/gstreamer-rs/issues/58

总结:

<块引用>

Remi Achard Apr 11, 2020; 7:55pmRe: Illegal hardware instructions when running basic-tutorial-1 on mac OS 10.15.2 / brew installation

现在看来教程(至少是第一个教程)在 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


其他相关帖子134