我想通过RTP发送多媒体数据.我想知道的是如何使用Python发送和接收RTP数据包.我找到了python类DPKT.但无法找到一个很好的参考,可视化如何在RTP中生成每个字段.
如果有人可以帮助我在服务器上生成和接收rtp数据包,我将不胜感激.
我正在研究gstreamer作为从列表中选择视频设备以将其提供给opencv脚本的方法.
我绝对不明白如何在Windows中使用gstreamer与python.我从gstreamer官方网站安装了Windows gstreamer 1.07二进制文件.但是,我无法在python中导入和模块.pygstgst
>>> import pygst
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
import pygst
ImportError: No module named pygst
>>>
Run Code Online (Sandbox Code Playgroud)
我检查了gstreamer安装,似乎没有pygst.py提供.但是,有一个名为的文件gst-env包含环境变量的路径(在安装时未添加到系统变量中.我检查过.
关于同一问题的其他问题在这里和这里,例如,都使用gstreamer 的winbuild版本.为什么会这样?
我完全迷失在这一个.
好吧,我使用SDK for Gstreamer 0.10(其中有一个pygst.py)管理它,但是没有办法使用Gstreamer 1.0系列,因为0.10是"寿命终止"?
有人可以显示最新的 webrtcbin 管道吗?目前我使用这些管道,但它们不起作用。
发送:
gst-launch-1.0 webrtcbin bundle-policy=max-bundle name=sendrecv stun-server=stun://stun.l.google.com:19302 audiotestsrc is-live=true wave=red-noise ! audioconvert ! audioresample ! queue ! opusenc ! rtpopuspay ! application/x-rtp,media=audio,encoding-name=OPUS,payload=97 ! sendrecv.
Run Code Online (Sandbox Code Playgroud)
收到:
gst-launch-1.0 webrtcbin bundle-policy=max-bundle name=sendrecv stun-server=stun://stun.l.google.com:19302 ! rtpopusdepay ! opusdec ! audioconvert ! autoaudiosink async=false
Run Code Online (Sandbox Code Playgroud)
谢谢!!!
我有一个用gst-python为GStreamer 0.10编写的应用程序,我试图移植到GStreamer 1.0.
在我的应用程序中,我有一些用Python编写的自定义元素(gst.BaseSrc和的子类gst.BaseTransform).每个python-element都有自己的文件,放在/usr/lib/gstreamer-0.10/python那里,gst-launch然后gst-inspect可以拾取它们(他们这样做).
这非常方便,因为它使我可以直接在命令行上试验不同的管道.
现在我正在尝试移植我的应用程序(根据本指南https://wiki.ubuntu.com/Novacut/GStreamer1.0)看起来即使它仍然可以用PyGI编写python-elements,看起来好像将它们存储在单独的文件中并将它们集成到GStreamer中的可能性已经一去不复返了.
我找到的所有示例都讨论了如何将元素放在您正在编写的程序中,然后通过调用注册它们Gst.Element.register,但如果我这样做,则只能直接从该程序访问我的自定义元素,我希望它们能够独立工作(使用gst-launch),无需在程序中编写我的过滤器链.
那么有人知道GStreamer 1.0是否仍然可以实现这一目标吗?
我想原型化一种新型的音频滤波器.目前我使用GStreamer返回我的音频缓冲区,并使用Cython将滤镜应用于它.然后我将结果发送回GStreamer.
一切都包含在python主代码中,GStreamer访问使用pygst完成.使用Cython进行原型设计非常棒,因为它在运行代码时会自动重新编译,并且非常高效.
但是我觉得如果我可以使用我的Cython文件生成GStreamer本机插件(那些是用C编写的)会更好.
您对如何实现这一目标有所了解吗?
我试图在命令提示符下运行某些管道来播放视频,并且经常收到这些错误/消息/警告:
WARNING: erroneous pipeline: no element "qtdemux"
WARNING: erroneous pipeline: no element "playbin2"
WARNING: erroneous pipeline: no element "decodebin2"
ERROR: pipeline could not be constructed: no element "playbin".
Run Code Online (Sandbox Code Playgroud)
以下是管道:
gst-launch filesrc location=path to the mp4 file ! playbin2 ! queue ! ffmpegcolorspace ! autovideosink
Run Code Online (Sandbox Code Playgroud)
或者
gst-launch -v filesrc location=path to the mp4 file ! qtdemux name=demuxer ! { queue ! decodebin ! sdlvideosink } { demuxer. ! queue ! decodebin ! alsasink }
Run Code Online (Sandbox Code Playgroud)
或者
gst-launch -v playbin uri=path to the …Run Code Online (Sandbox Code Playgroud) 我试图从 a 中获取 28 个通道jackaudiosrc,但是一旦我连接了一个deinterleave元素,源就会回退到无需任何通道掩码即可工作的 2 通道设置。我设置通道掩码的尝试是徒劳的。
发生的情况如下:
potential caps: audio/x-raw-float, endianness=(int)1234, width=(int)32, rate=(int)48000, channels=(int)[ 1, 28 ]
filter caps: audio/x-raw-float, channels=(int)28, channel-positions=(GstAudioChannelPosition)< GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE >
actual caps: audio/x-raw-float, endianness=(int)1234, width=(int)32, rate=(int)48000, channels=(int)2, channel-positions=(GstAudioChannelPosition)< GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT >
Run Code Online (Sandbox Code Playgroud)
下面是生成该输出的 Python 代码:
potential caps: audio/x-raw-float, endianness=(int)1234, width=(int)32, rate=(int)48000, channels=(int)[ 1, 28 ] …Run Code Online (Sandbox Code Playgroud) 今天我决定将我的基于 的小脚本转换gst-launch为真正的Python/GStreamer 应用程序,以添加一些功能。
我开发了一个小程序,它将音频从我的麦克风发送到 Icecast ( shout2send) 和本地存储 ( filesink),这要归功于tee.
有时shout2send会因网络问题而停止。我想每 N 秒重新启动一次此元素,直到连接恢复,而不停止管道,因为本地音频文件不应受到网络条件的影响。
这是我尝试过的:
tee,将shout2send状态设置为NULL并将其从管道中删除(结果:GStreamer 严重错误,例如Trying to dispose element ... but it is in PLAYING instead of the NULL state)我应该怎么办?
我的代码如下所示:
import gi
gi.require_version("Gst", "1.0")
from gi.repository import GLib
from gi.repository import Gst
# [...]
def message_handler(bus, message):
if message.type == Gst.MessageType.ERROR:
if message.src == shout2send:
pass # TODO: restart …Run Code Online (Sandbox Code Playgroud) 当两个队列在将管道设置为 之前链接在一起时,该脚本运行良好PLAYING,但我很难理解 Gstreamer 动态管道及其实现。此外,缺乏 gstreamer 1.0 python 的文档/示例也没有帮助。
这是使用 tee 录制到文件并流式传输到 RTMP 服务器的工作脚本
import gi
import time
from gi.repository import GObject, Gst
gi.require_version('Gst', '1.0')
Gst.init(None)
Gst.debug_set_active(True)
Gst.debug_set_default_threshold(3)
pipeline = Gst.Pipeline()
rpicamsrc = Gst.ElementFactory.make("rpicamsrc", "rpicam")
rpicamsrc.set_property("bitrate", 500000)
rpicaps = Gst.caps_from_string('video/x-h264,width=360,height=240,framerate=10/1')
rCamCapsFilt = Gst.ElementFactory.make("capsfilter", "rCamCapsFilt")
rCamCapsFilt.set_property("caps", rpicaps)
h264parse = Gst.ElementFactory.make("h264parse", "h264")
h264parse2 = Gst.ElementFactory.make("h264parse", "enh2642")
flvmux = Gst.ElementFactory.make("flvmux", "flv")
mp4mux = Gst.ElementFactory.make("mp4mux", "mp4")
filesink = Gst.ElementFactory.make("filesink", "fsink")
filesink.set_property("location", "specific2.mp4")
rtmpsink = Gst.ElementFactory.make("rtmpsink", "rsink")
rtmpsink.set_property("location", "rtmp://<server>/live/test")
tee = Gst.ElementFactory.make("tee", "tee") …Run Code Online (Sandbox Code Playgroud) python gstreamer python-gstreamer raspberry-pi gstreamer-1.0
我在多个操作系统上用 Python 枚举相机时遇到一些问题。
以下是我尝试过的一些方法:
import cv2 as cv
num = 0
while 1:
cap = cv.VideoCapture(num)
if cap.isOpened():
# working capture
num += 1
else:
break
Run Code Online (Sandbox Code Playgroud)
使用 Opencv 的缺点是 Opencv 不提供任何友好的显示名称。此外,枚举相机的速度很慢,因为您需要实际打开和关闭相机来检查它是否是有效的相机。
我还尝试过使用 PyPylon 和 pyuvc 等库。它们有效,但仅适用于特定品牌。
我对堆栈溢出做了一些研究,有些人建议将 python 的 gstreamer 绑定作为可能的独立于操作系统的解决方案。这是我到目前为止所拥有的。
import pgi
pgi.require_version("Gtk", "3.0")
pgi.require_version("Gst", "1.0")
pgi.require_version("GstVideo", "1.0")
from pgi.repository import Gtk, GObject, Gst, GstVideo
Gst.init("")
dm = Gst.DeviceMonitor()
dm.set_show_all_devices(True)
dm.start()
print("Displaying devices.")
for device in dm.get_devices():
print(device.get_display_name())
print("Displaying providers.")
for provider in dm.get_providers():
print(provider)
dm.stop()
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出:
Displaying devices. …Run Code Online (Sandbox Code Playgroud) gstreamer ×10
python-gstreamer ×10
python ×8
audio ×1
cython ×1
opencv ×1
qtgstreamer ×1
raspberry-pi ×1
rtp ×1
webrtc ×1
windows ×1