Python Gstreamer播放rtsp视频流(海康IPCAM)

Python Gstreamer播放rtsp视频流(海康IPCAM)

播放思路:

图解:
在这里插入图片描述

1.首先通过IPCAM的ip与用户等信息获得rtsp码:

  海康新版IPCAM的rtsp地址规则为:rtsp://用户名:密码@设备IP地址/Streaming/Channels/通道号及编码类型。
如:rtsp://admin:[email protected]:554/Streaming/Channels/101,这里101代表第一个通道的主码流。
而rtsp://admin:[email protected]:554/Streaming/Channels/2602,这里2602代表第26个通道的子码流。
  当然海康2012年之前的设备采用的是老的地址规则,这里自行搜索吧。
  主码流和次码流的区别:
  海康威视首家提出了主码流与子码流这样的概念。选择主码流时,画质高,对带宽要求也高,适合用于本地存储,若直接传输播放容易卡顿。子码流画质低,适用于图像在低带宽网络上传输。我们这里使用子码流来提高流畅性。

2.使用Gstreamer播放rtsp视频流思路:

播放过程:

  简单来说整个过程是:选用src元件,依次连接解协议元件depay,解码元件decode,以及接收元件sink,然后设置管道播放。

选择元件:

  由于可能不清楚视频流或音频流中的编码方式,所以选择元件的主要难度在于depay元件的选择。这里借助VLC软件获得编码方式,具体获得方式请自行百度,最后结果如下图:
在这里插入图片描述
  可以看到这里视频的编码格式为H.264,音频的编码方式为PCMA。
  这里我们打开终端,使用gst-inspect-1.0 | grep rtp 来查看相关元件来选择所需元件,最后选择出的视频流depay元件为rtph264depay,音频流为rtppcmadepay(当然这里并没有音频流的播放,不过不久之后我会补充)。(咋选出来的?不要问,问就是经验)

Python Gstreamer 代码:

import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GObject, GLib

Gst.init(None)
a = 0

#rtspsrc的srcpad是随机衬垫,这里使用回调函数来连接衬垫。
def on_pad_added( src, pad, des):
    vpad = des.get_static_pad("sink")
    pad.link(vpad)

pipe = Gst.Pipeline.new("test")
src = Gst.ElementFactory.make("rtspsrc", "src")
depay = Gst.ElementFactory.make("rtph264depay", "depay")
queuev1 = Gst.ElementFactory.make("queue2", "queue")
src.connect("pad-added", on_pad_added, queuev1)
#过滤
vfilter = Gst.ElementFactory.make("capsfilter", "flt")
caps = Gst.Caps.from_string("video/x-h264, width=(int)1280, height=(int)720")
vfilter.set_property("caps", caps)

conv = Gst.ElementFactory.make("videoconvert", "conv")
sink = Gst.ElementFactory.make("xvimagesink", "sink")

decodebin = Gst.ElementFactory.make("avdec_h264", "decodea")

rstp = 'rtsp://admin:*********@*******/Streaming/channels/402'
src.set_property("location", rstp)
pipe.add(src)
pipe.add(depay)

pipe.add(queuev1)
pipe.add(vfilter)
pipe.add(conv)
pipe.add(sink)
pipe.add(decodebin)

queuev1.link(depay)
depay.link(vfilter)
vfilter.link(decodebin)
decodebin.link(conv)
conv.link(sink)

pipe.set_state(Gst.State.PLAYING)

mainloop = GLib.MainLoop()
mainloop.run()
发布了30 篇原创文章 · 获赞 37 · 访问量 4086

猜你喜欢

转载自blog.csdn.net/qq_32188669/article/details/95098823
今日推荐