问题标签 [python-gstreamer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
891 浏览

python - 带有 Gstreamer 管道的 Python

我正在开发一个 Udoo,试图让相机拍摄一张我可以在 Python 中操作的照片。

到目前为止,相机与

gst-launch-1.0 imxv4l2videosrc ! imxipuvideosink

我也可以用

gst-launch-1.0 imxv4l2videosrc num-buffers=1 ! video/x-raw ! jpegenc ! filesink location=output.jpg

这里开始,您似乎可以使用 OpenCV 直接从 Python 中的 gstreamer 流中读取数据。

这是我的python代码:

但是, ret 是False,而 image 什么都不是。

有些地方说这只适用于 OpenCV 3.0+,而另一些地方说 2.4.x,但我似乎无法找到它适用于哪个版本的实际答案。

如果我需要更新到 OpenCV 3.0,我需要更新哪一部分?我通过 python-opencv 包下的 apt 存储库下载了 OpenCV。那么我需要更新 Python 吗?我可以从源代码构建 OpenCV,Python 会自动使用最新版本吗?我很混乱。

0 投票
0 回答
1805 浏览

python - 使用 kivy 播放实时 h264 编码视频 RTSP 流

我有一个在 winapi 内核事件循环中使用的 c++ 程序,live555该程序将图像从相机传递到libopenh264然后用作 RTSP 流,使用ffmpeg. 可以使用VLC. 事件循环还记录到 avi 容器。

我想kivy使用下面的简单 kvlang 设置远程查看客户端:

窗口不显示Video对象,日志输出有以下错误

当我将流编码更改为 MJPEG 时,视频播放器会正确显示实时视频。此外,当我更改source为记录的 h264 编码 avi 文件的文件路径时,它可以正常播放。是否有可以提醒VideoGstplayer预期编码的配置?或者,我的流设置是否存在提供的 kivy 播放器无法正确读取的问题?也许我错过了一个 gstreamer dll,但该消息并没有提醒我诸如此类的任何事情。

这一切都是使用安装 python 依赖项的基本安装说明在 Windows 上执行的。kivy正在使用的版本是1.9.1. 我是新来的基维。

编辑:只是为了带来更多信息。即使image编解码器为MJPEG. 因此,显示问题似乎出在 gstremer 或 gstreamer 的实现中。

0 投票
3 回答
5157 浏览

python - 在 EOS 上用 Python 重启 GStreamer 管道

我正在研究在 RPi3 上运行的 Python 脚本,并使用 gstreamer 连接到我的 IP 摄像机的 RTSP 源,并将解码的 H264 帧提供给我的 Python 脚本。

这是用于从相机获取帧的 gstreamear 管道:

问题:由于相机的互联网连接速度较慢/不可靠,我时不时会丢帧,这会导致生成 EOS 信号。互联网连接带宽有时可能会导致流中断。

目标:在 EOS 信号上,我想重新启动管道,以便 gstreamer 可以继续为我的程序提供帧。

我尝试过的:我在总线上附加了一个回调函数,它通过使用监听消息

在“on_message”函数中,我能够成功确定消息是否是 EOS 信号。如果我检测到 EOS 信号,我会尝试通过执行以下操作重新启动管道:

不幸的是,这不起作用。一旦我的 scipt 尝试使用上面的代码片段重新启动管道,我就会在总线上出现以下错误。而且我知道相机在线,所以这不是问题。

如果问题出在 rtspsrc,我还尝试使用 filesrc 使用本地短视频,并使用 gstreamer 到达视频文件末尾时生成的 EOS 信号来测试我是否能够重新启动管道。这是我用来播放本地视频的示例管道:

如果成功,它应该再次开始播放视频,但没有运气......相反,我收到以下错误,这让我认为 filesrc 需要以某种方式重置。与 rtsp 示例相同,其中 rtspsrc 生成错误

任何人都可以阐明这个问题吗?谢谢!

0 投票
3 回答
6187 浏览

gstreamer - 文件接收器中的 Gstreamer EOS 消息处理以动态更改位置

试图即时切换输出文件,但无法处理 EOS。

http://gstreamer-devel.966125.n4.nabble.com/Dynamically-updating-filesink-location-at-run-time-on-the-fly-td4660569.html

引用:

假设您有一个如下所示的管道:
audiosrc --> encoder --> mux --> filesink

那么您需要将其更改为:
audiosrc --> encoder --> queue --> muxsink_bin
其中 muxsink_bin 是 bin
ghostpad --> mux --> filesink

那么程序是:
1 - 使用 gst_pad_set_blocked_async() 阻塞队列 srcpad
2 - 在阻塞的回调中:
2a - 使用 gst_pad_unlink() 取消链接 muxsink_bin
2b - 使用 gst_pad_send_event() 将 EOS 事件发送到 muxsink_bin sink pad
2b - 创建一个新的muxsink_bin
2c - 设置文件接收位置
2d - 使用 gst_bin_add() 将新 bin 添加到管道
2e - 使用 gst_element_sync_state_with_parent() 与父级同步
2f - 使用 gst_pad_link() 将其链接到队列 srcpad
2g -使用 gst_pad_set_blocked_async() 取消阻塞队列 srcpad . 当未阻止的回调发生时,您将再次录制并且没有数据丢失。畅通的回调中不需要任何操作

3 - 处理 EOS 并删除旧的 muxsink_bin。我在我的 bin_init() 函数中安装了一个 msg 处理程序,使用“gstbin_class->handle_message = GST_DEBUG_FUNCPTR(msg_handler)”& 在处理程序中:
3a - 使用 gst_element_set_locked_state() 锁定 bin 状态
3b - 使用 gst_element_set_state 将状态设置为 NULL ()
3c - 使用 gst_bin_remove() 从管道中删除它

而已。唯一需要注意的是,数据必须流经管道才能正常工作。

稻田

除了旧管道的最终确定外,主要序列工作。

困难在于第3点:我可以将EOS发送到ghostpad,并且filesink得到它。但是如何抓住那个 EOS 呢?

“使用”安装 msg 处理程序是什么意思gstbin_class->handle_message = GST_DEBUG_FUNCPTR(msg_handler)

0 投票
0 回答
265 浏览

python - 用 python 编写的 Gstreamer 应用程序的单元测试框架

我编写了一个 python 应用程序,它使用 python gstreamer 绑定(Gst1.0 模块)创建多个 udp 流管道。每个管道包含一个 udpsrc,可以包含多个 udpsink 元素,并且可以动态修改。用户可以在运行时通过 UI 动态添加/删除/修改源或接收器。它正在按预期工作。但是,我不确定如何对应用程序进行单元测试,因为它与 gst 模块耦合非常紧密。

任何人都可以建议一个单元测试框架或任何其他可能对我有帮助的技巧吗?

0 投票
1 回答
457 浏览

gstreamer - InterpolationControlSource 与 Gst.parse_launch()

我的应用程序(在 Python 中)加载 Gstreamer 库,解析并启动管道规范,该规范将 SRT 文件中的字幕合成到 MP4 文件中准备好的视频之上,然后创建一个与“alpha”属性绑定的控制源链接到字幕图像源的videomixer元素的 sink pad 。

首先,我写了一个小型的概念验证,它的工作原理就像一个冠军。如果您可以使用 X-windows 服务器(例如在 Unix 或 Linux 中)运行它,您将看到绿色背景上的黑色方块。一秒钟后,黑色方块在几秒钟内逐渐消失。

我的应用程序有一个更复杂的管道。以下是相关代码的摘要:

两个管道之间的一个区别是,在第一个示例中,videomixer pad 是request pad。但在真正的应用程序中,它们变成了静态垫。并且日志语句中只存在“sink_1”。

我不确定为什么会这样,或者它是否有所作为。

当我在 Web 服务器中运行应用程序并在浏览器中签入时,会出现字幕,但不会淡入或淡出。

我检查了时间戳,它们看起来不错。它们以纳秒 (10^9) 为单位。

那么,我还有什么石头没有翻过来?

0 投票
0 回答
370 浏览

gstreamer - 尝试使用 gstreamer 将 opus 编码的音频发送到服务器时出错

我正在使用一个Kaldi-Gstreamer-Server库,它使用 python gstreamer 绑定,用于实时语音识别应用程序。该库使用onlinegmmdecodefaster gstreamer 元素(包含在 Kaldi 库中)以及其他元素(decodedbin、audioconvert...)来接受音频并将其转录为 text 。该库要求在向服务器发送请求时,使用 GStreamer 1.0 大写格式指定内容类型查询参数并编码到请求 URL。

当通过将内容类型设置为一切正常并将原始音频发送到服务器时audio/x-raw,format=S16LE,channels=2,layout=interleaved,我从服务器获取转录文本。但是,为了低延迟,我正在尝试使用 opus 编码器对音频进行编码并发送到服务器。我将 content-type 请求参数设置为opusdec元素 pad 的 caps 格式,如下所示:

但是,当 gstreamer 尝试使用上述功能时,出现以下错误:

2017-03-15 13:53:26 - 信息:解码器 2:0578f66f-8474-48db-996b-ce401ed5c034:将上限设置为音频/x-opus,通道映射系列 =(int)[1, 255],通道=(int)[ 1, 255 ], 流计数=(int)[ 1, 255 ], 耦合计数=(int)[ 0, 255 ]

(python:1145):GStreamer-CRITICAL **:gst_event_new_caps:断言'gst_caps_is_fixed(caps)'失败

(python:1145):GStreamer-CRITICAL **:gst_pad_push_event:断言'GST_IS_EVENT(事件)'失败2017-03-15 13:53:27 - 错误:解码器2:(GLib.Error('内部数据流错误。', 'gst-stream-error-quark', 1), 'gstbasesrc.c(2933): gst_base_src_loop (): /GstPipeline:pipeline0/GstAppSrc:appsrc:\n流任务暂停,原因未协商 (-4)') 2017 -03-15 13:53:27 - 信息:解码器2:0578f66f-8474-48db-996b-ce401ed5c034:重置解码器状态

(python:1145):GStreamer-CRITICAL **:gst_event_new_caps:断言'gst_caps_is_fixed(caps)'失败

(python:1145):GStreamer-CRITICAL **:gst_pad_push_event:断言'GST_IS_EVENT(事件)'失败

(python:1145):GStreamer-CRITICAL **:gst_event_new_caps:断言'gst_caps_is_fixed(caps)'失败

(python:1145):GStreamer-CRITICAL **:gst_pad_push_event:断言'GST_IS_EVENT(事件)'失败2017-03-15 13:53:27 - 错误:解码器2:(GLib.Error('内部数据流错误。', 'gst-stream-error-quark', 1), 'gstbasesrc.c(2933): gst_base_src_loop (): /GstPipeline:pipeline0/GstAppSrc:appsrc:\n流式传输任务暂停,原因未协商 (-4)')

此错误的原因可能是什么?我该如何解决这个问题,以便我可以将 opus 编码的音频数据发送到服务器?

0 投票
0 回答
211 浏览

python - 如何实时创建 MPEG2 传输流?

我想编写实时生成音频并将其作为 MPEG2 传输流通过网络/互联网流式传输的软件。理想情况下,解决方案将使用 Python(尽管 Java 也可以)。

基本上我想得到与以下伪代码等效的代码:

我的问题是,这样做的最佳策略是什么?我应该使用 gstreamer,如果是,我是否必须编写自己的源插件(并且可以在 Python 中完成)?还是有基于 PyAudio 的解决方案?还有其他选择吗?

任何指针将不胜感激。

0 投票
0 回答
350 浏览

python - 注册一个 Gstreamer1.0 Python 元素?想要对总线元素消息做出反应

我是 Gstreamer 的新手,所以如果这个问题非常简单,我深表歉意,但我已经被困太久了。

我在树莓派上使用 Mopidy 通过扬声器播放音乐。当 Mopidy 播放时,我希望能够使一些灯光与低频段、中频和高频段同步。据我了解,Mopidy 在后端使用 Gstreamer,您可以通过指定来自定义管道

我需要在频谱和接收器之间放置一些东西,以分析“频谱”在总线上发布的元素消息(除非有人有更好的主意)。我正在尝试在 python 中编写一个简单的元素,它通过音频但有一个可以实现我的自定义逻辑的消息处理元素。但是,我什至无法从简单的在线示例开始,因为我不知道如何让注册的元素让 gstreamer 识别它。当我遵循https://github.com/GStreamer/gst-python/blob/master/examples/plugins/python/identity.py上的 gst-python identity.py 示例时,规定的说明不起作用。

我已经尝试了所有可以想象的 GST_PLUGIN_PATH,并尝试了我能找到的每个在线帖子中的所有内容,我可能只是错过了一些非常基本的东西,但我真的可以用手弄清楚我错过了什么!据我所知,这不应该这么复杂。

我的操作系统是 Ubuntu MATE 16.04,我所有的 gstreamer 包的版本都是 >1.6

0 投票
1 回答
1474 浏览

streaming - 如何使用 Python 和 Gstreamer 创建 MPEG2 传输流管道

在开发流式音频应用程序时,我使用了 gst-launch-1.0 命令行工具来生成用于测试的 MPEG 传输流。这按预期工作(我能够从一个简单的 http 服务器提供流并使用 VLC 媒体播放器听到它)。然后,我尝试在 Python gstreamer 代码中复制该流的编码部分。连接服务器的 Python 版本正常,但听不到声音。我试图理解为什么命令行实现有效,但 Python 没有。我正在使用 Mac OS 10.11 和 Python 2.7。

有效的命令行如下:

创建 gstreamer 管道的 Python 代码如下。它实例化没有产生任何错误,并成功连接到 http 服务器,但通过 VLC 听不到声音。我验证了 Python 代码中的 AppSrc 是否正常工作,方法是将它与直接播放音频的单独 gstreamer 管道一起使用。这工作得很好。

我的问题是,我在 Python 中实现的 gstreamer 管道与命令行管道有何不同?更一般地说,你如何调试这种事情?gstreamer 是否有任何“详细”模式?

谢谢。