- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试捆绑这个极其简单的 python 脚本(player.py):
#!/usr/bin/env python
import sys, os
import gobject, glib
import pygst
pygst.require("0.10")
import gst
class Player(object):
def __init__(self):
self.player = gst.element_factory_make("playbin2", "player")
fakesink = gst.element_factory_make("fakesink", "fakesink")
self.player.set_property("video-sink", fakesink)
bus = self.player.get_bus()
bus.add_signal_watch()
bus.connect("message", self.on_message)
def play(self, url):
self.player.set_state(gst.STATE_NULL)
self.player.set_property("uri", url)
self.player.set_state(gst.STATE_PLAYING)
def on_message(self, bus, message):
t = message.type
if t == gst.MESSAGE_EOS:
global loop
loop.quit()
elif t == gst.MESSAGE_ERROR:
self.player.set_state(gst.STATE_NULL)
err, debug = message.parse_error()
print "Error: %s" % err, debug
p = Player()
p.play("file:///path/to/something.mp3")
gobject.threads_init()
loop = glib.MainLoop()
loop.run()
使用 pyinstaller (2.1.0-dev) 进入 OSX(我的机器运行 Mountain Lion)应用程序。
我的目标是创建一个可以轻松分发的 .app bundle 。我还可以要求最终用户安装 GStreamer SDK,尽管独立的应用程序将是我的主要目标。
规范文件如下(player.spec):
# -*- mode: python -*-
import pygst
pygst.require('0.10')
a = Analysis(['player.py'],
pathex=['/Users/mymy/devel/t/simple'],
hiddenimports=[],
hookspath=None,
runtime_hooks=None)
pyz = PYZ(a.pure)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='player',
debug=False,
strip=None,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=None,
upx=True,
name='player')
到目前为止,我尝试了两种策略:
在这两种情况下我都可以成功运行脚本。
但是,当我尝试运行捆绑的可执行文件时,我得到以下信息:
显示部分 GST 调试日志:
~/devel/t/simple/dist/player > GST_DEBUG=4 ./player
[..]
0:00:00.113260000 8313 0x1001b1a00 DEBUG GST_REGISTRY gstregistrychunks.c:573:gboolean gst_registry_chunks_load_feature(GstRegistry *, gchar **, gchar *, GstPlugin *): Plugin 'playback' feature 'playbin2' typename : 'GstElementFactory'
0:00:00.113286000 8313 0x1001b1a00 DEBUG GST_REGISTRY gstregistrychunks.c:621:gboolean gst_registry_chunks_load_feature(GstRegistry *, gchar **, gchar *, GstPlugin *): Element factory : 'Player Bin 2' with npadtemplates=0
0:00:00.113300000 8313 0x1001b1a00 DEBUG GST_REGISTRY gstregistrychunks.c:649:gboolean gst_registry_chunks_load_feature(GstRegistry *, gchar **, gchar *, GstPlugin *): Reading 2 Interfaces at address 0x101971191
0:00:00.113318000 8313 0x1001b1a00 DEBUG GST_REGISTRY gstregistry.c:558:gboolean gst_registry_add_feature(GstRegistry *, GstPluginFeature *):<registry0> adding feature 0x10097da20 (playbin2)
0:00:00.113332000 8313 0x1001b1a00 DEBUG GST_REFCOUNTING gstobject.c:844:gboolean gst_object_set_parent(GstObject *, GstObject *):<playbin2> set parent (ref and sink)
0:00:00.113346000 8313 0x1001b1a00 DEBUG GST_REGISTRY gstregistrychunks.c:709:gboolean gst_registry_chunks_load_feature(GstRegistry *, gchar **, gchar *, GstPlugin *): Added feature playbin2, plugin 0x100975be0 playback
[..]
0:00:00.242584000 8297 0x1001b1a00 DEBUG GST_PLUGIN_LOADING gstpluginfeature.c:106:GstPluginFeature *gst_plugin_feature_load(GstPluginFeature *): loading plugin for feature 0x10097da20; 'playbin2'
0:00:00.242620000 8297 0x1001b1a00 DEBUG GST_PLUGIN_LOADING gstpluginfeature.c:110:GstPluginFeature *gst_plugin_feature_load(GstPluginFeature *): loading plugin playback
0:00:00.242632000 8297 0x1001b1a00 DEBUG GST_PLUGIN_LOADING gstplugin.c:1293:GstPlugin *gst_plugin_load_by_name(const gchar *): looking up plugin playback in default registry
0:00:00.242662000 8297 0x1001b1a00 DEBUG GST_PLUGIN_LOADING gstplugin.c:1296:GstPlugin *gst_plugin_load_by_name(const gchar *): loading plugin playback from file /opt/local/lib/gstreamer-0.10/libgstplaybin.so
0:00:00.242677000 8297 0x1001b1a00 DEBUG GST_PLUGIN_LOADING gstplugin.c:737:GstPlugin *gst_plugin_load_file(const gchar *, GError **): attempt to load plugin "/opt/local/lib/gstreamer-0.10/libgstplaybin.so"
0:00:00.248338000 8297 0x1001b1a00 INFO GST_PLUGIN_LOADING gstplugin.c:859:GstPlugin *gst_plugin_load_file(const gchar *, GError **): plugin "/opt/local/lib/gstreamer-0.10/libgstplaybin.so" loaded
0:00:00.248374000 8297 0x1001b1a00 DEBUG GST_PLUGIN_LOADING gstpluginfeature.c:115:GstPluginFeature *gst_plugin_feature_load(GstPluginFeature *): loaded plugin playback
0:00:00.248390000 8297 0x1001b1a00 INFO GST_PLUGIN_LOADING gstpluginfeature.c:145:GstPluginFeature *gst_plugin_feature_load(GstPluginFeature *): Tried to load plugin containing feature 'playbin2', but feature was not found.
0:00:00.248402000 8297 0x1001b1a00 WARN GST_ELEMENT_FACTORY gstelementfactory.c:410:GstElement *gst_element_factory_create(GstElementFactory *, const gchar *):<playbin2> loading plugin containing feature player returned NULL!
0:00:00.248412000 8297 0x1001b1a00 INFO GST_ELEMENT_FACTORY gstelementfactory.c:472:GstElement *gst_element_factory_make(const gchar *, const gchar *):<playbin2> couldn't create instance!
Traceback (most recent call last):
File "<string>", line 33, in <module>
File "<string>", line 11, in __init__
gst.ElementNotFoundError: playbin2
获得相同的预挂结果:GST_PLUGIN_PATH=/opt/local/lib/gstreamer-0.10/
我尝试将插件及其依赖项复制到 dist/player 文件夹中,编写一个疯狂的 install_name_tool 修改脚本以更正 dylib 的路径,但结果也没有改变。
(PYTHONPATH=/Library/Frameworks/GStreamer.framework/Versions/0.10/lib/python2.7/site-packages/)
~/devel/t/simple/dist/player > ./player
** Message: pygobject_register_sinkfunc is deprecated (GstObject)
player.py:11: Warning: cannot register existing type `GstObject'
player.py:11: Warning: g_once_init_leave: assertion `result != 0' failed
player.py:11: Warning: gtype.c:2720: You forgot to call g_type_init()
它卡在这里。如果我通过事件监视器对过程进行采样,我会得到以下结果:
[..]
_wrap_gst_element_factory_make (in gst._gst.so)
gst_element_factory_make (in libgstreamer-0.10.0.dylib)
gst_element_factory_create (in libgstreamer-0.10.0.dylib)
gst_plugin_feature_load (in libgstreamer-0.10.0.dylib)
gst_plugin_load_by_name (in libgstreamer-0.10.0.dylib)
gst_plugin_load_file (in libgstreamer-0.10.0.dylib)
gst_plugin_register_func (in libgstreamer-0.10.0.dylib)
plugin_init (in libgstplaybin.so)
gst_play_bin2_plugin_init (in libgstplaybin.so)
gst_pipeline_get_type (in libgstreamer-0.10.0.dylib)
gst_bin_get_type (in libgstreamer-0.10.0.dylib)
gst_child_proxy_get_type (in libgstreamer-0.10.0.dylib)
gst_object_get_type (in libgstreamer-0.10.0.dylib)
g_once_init_enter (in libglib-2.0.0.dylib)
g_cond_wait (in libglib-2.0.0.dylib)
_pthread_cond_wait (in libsystem_c.dylib)
__psynch_cvwait (in libsystem_kernel.dylib)
如果有任何提示,我们将不胜感激!
最佳答案
我终于为以下设置找到了一个可行的解决方案:
# -*- mode: python -*-
import os
import pygst
pygst.require('0.10')
a = Analysis(['rthook.py', 'player.py'],
pathex=[os.curdir],
hiddenimports=[],
hookspath=None,
runtime_hooks=None)
pyz = PYZ(a.pure)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='player',
debug=False,
strip=None,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=None,
upx=True,
name='player')
我为 gst 创建了一个非常原始的钩子(Hook)。我尝试将其放入本地目录中,通过 Analysis 对象的 hookspath 参数引用它,但我无法弄清楚为什么 pyinstaller 忽略它。因此,我将其移至 /path/to/pyinstaller/PyInstaller/hooks 文件夹:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
GST_PLUGINS = '/opt/local/lib/gstreamer-0.10/'
def hook(mod):
for f in [so for so in os.listdir(GST_PLUGINS) if so[-3:].lower() == '.so']:
mod.binaries.append((os.path.join('gst-plugins', f),
os.path.join(GST_PLUGINS, f),
'BINARY'))
return mod
pyinstaller 负责计算插件的依赖关系树,将 .sos 以及依赖的 dylib 复制到位,最后修改两者的 mach'o header 。
我还创建了一个空文件 /path/to/pyinstaller/PyInstaller/hooks/hook-gst.py 来阻止 pyinstaller 提示缺少父 Hook 。而且,无论如何, Hook 代码可以直接转到 hook-gst.py。
最后,我添加了一个在 Analysis 对象上引用的运行时 Hook 文件,该文件设置了帮助 gstreamer 查找插件的环境变量。此代码在 player.py 之前在捆绑的可执行文件上执行(按照 Kivy 设置 pyinstaller 的方式并感谢他们的宝贵提示):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
if hasattr(sys, '_MEIPASS'):
# PyInstaller >= 1.6
root = sys._MEIPASS
elif '_MEIPASS2' in environ:
# PyInstaller < 1.6 (tested on 1.5 only)
root = os.environ['_MEIPASS2']
else:
root = os.path.dirname(sys.argv[0])
os.chdir(root)
os.environ['GST_REGISTRY_FORK'] = 'no'
os.environ['GST_PLUGIN_PATH'] = os.path.join(root, 'gst-plugins')
似乎禁用GST_REGISTRY_FORK是取得工作成果的唯一途径。一旦扫描到第一个插件,保留默认设置(事件)就会导致段错误。
pyinstaller 可以通过以下方式调用:
$ /path/to/pyinstaller/pyinstaller.py player.spec
关于python - OSX 下的 pygst + pyinstaller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16618390/
我正在运行 python 2.6 和 PyGST(最新可用于 Python 2.6)。我已经安装了所有插件 - 好的、坏的和丑陋的。 我有以下代码: import sys, os import pyg
我在 Ubuntu 14.04 和 Python 2.7.13 上使用 virtualenv,我正在尝试让 import pygst 工作(我是一个完整的 Python 菜鸟)。 我下载了: http
我目前正在尝试捆绑这个极其简单的 python 脚本(player.py): #!/usr/bin/env python import sys, os import gobject, glib imp
我正在使用 Ubuntu 13.04 并安装了 python 2.7 和 3.3.2。我最近开始使用 python 3,但是当我尝试导入“pygst”gstreamer 模块时,出现错误: Impor
我有一个基于 gstreamer 和 dbus 的 python 音频播放器 http://sourceforge.net/p/autoradiobc/code/210/tree/trunk/auto
我是一名优秀的程序员,十分优秀!