如何将视频(在磁盘上)转换为rtsp流 [英] How to convert a video (on disk) to a rtsp stream
问题描述
我的本地磁盘上有一个视频文件,我想从中创建一个rtsp流,我将在一个项目中使用它.一种方法是从vlc创建rtsp流,但我想用代码来完成(python会更好). 我已经尝试过像这样的opencv的VideoWritter
I have a video file on my local disk and i want to create an rtsp stream from it, which i am going to use in one of my project. One way is to create a rtsp stream from vlc but i want to do it with code (python would be better). I have tried opencv's VideoWritter like this
import cv2
_dir = "/path/to/video/file.mp4"
cap = cv2.VideoCapture(_dir)
framerate = 25.0
out = cv2.VideoWriter(
"appsrc ! videoconvert ! x264enc noise-reduction=10000 speed-preset=ultrafast tune=zerolatency ! rtph264pay config-interval=1 pt=96 ! tcpserversink host=127.0.0.1 port=5000 sync=false",
0,
framerate,
(1920, 1080),
)
counter = 0
while cap.isOpened():
ret, frame = cap.read()
if ret:
out.write(frame)
print(f"Read {counter} frames",sep='',end="\r",flush=True)
counter += 1
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
break
cap.release()
out.release()
但是当我像这样在vlc上流式传输
But when i stream it on vlc like this
vlc -v rtsp://127.0.0.1:5000 我正在
vlc -v rtsp://127.0.0.1:5000 I am getting
[00007fbb307a3e18] access_realrtsp access error: cannot connect to 127.0.0.1:5000
[00007fbb2c189f08] core input error: open of `rtsp://127.0.0.1:5000' failed
[00007fbb307a4278] live555 demux error: Failed to connect with rtsp://127.0.0.1:5000
Gstreamer是另一个选择,但是由于我从未使用过,所以如果有人将我指向正确的方向,那将很好.
Gstreamer is another option but as i have never used it, so would be nice if someone points me in the right direction.
推荐答案
您尝试公开 RTP 通过TCP服务器的协议,但请注意,RTP不是 RTSP ,并且RTP(和RTCP )只能是RTSP的一部分.
You tried to expose RTP protocol via TCP server but please note that RTP is not RTSP and that RTP (and RTCP) can only be part of RTSP.
Anyways, there is a way to create RTSP server with GStreamer and Python by using GStreamer's GstRtspServer and Python interface for Gstreamer (gi
package).
假设您已经在计算机上安装了Gstreamer,请首先安装gi python软件包,然后安装Gstreamer RTSP服务器(这不是标准Gstreamer安装的一部分).
Assuming that you already have Gstreamer on your machine, first install gi python package and then install Gstreamer RTSP server (which is not part of standard Gstreamer installation).
Python代码可通过简单的RTSP服务器公开mp4容器文件
#!/usr/bin/env python
import sys
import gi
gi.require_version('Gst', '1.0')
gi.require_version('GstRtspServer', '1.0')
from gi.repository import Gst, GstRtspServer, GObject, GLib
loop = GLib.MainLoop()
Gst.init(None)
class TestRtspMediaFactory(GstRtspServer.RTSPMediaFactory):
def __init__(self):
GstRtspServer.RTSPMediaFactory.__init__(self)
def do_create_element(self, url):
#set mp4 file path to filesrc's location property
src_demux = "filesrc location=/path/to/dir/test.mp4 ! qtdemux name=demux"
h264_transcode = "demux.video_0"
#uncomment following line if video transcoding is necessary
#h264_transcode = "demux.video_0 ! decodebin ! queue ! x264enc"
pipeline = "{0} {1} ! queue ! rtph264pay name=pay0 config-interval=1 pt=96".format(src_demux, h264_transcode)
print ("Element created: " + pipeline)
return Gst.parse_launch(pipeline)
class GstreamerRtspServer():
def __init__(self):
self.rtspServer = GstRtspServer.RTSPServer()
factory = TestRtspMediaFactory()
factory.set_shared(True)
mountPoints = self.rtspServer.get_mount_points()
mountPoints.add_factory("/stream1", factory)
self.rtspServer.attach(None)
if __name__ == '__main__':
s = GstreamerRtspServer()
loop.run()
请注意
- 此代码将在默认端口8554上公开名为
stream1
的RTSP流 - 我用
qtdemux
从MP4容器中获取视频.您也可以在管道上方扩展以提取音频(并通过RTSP服务器公开音频) - 要减少CPU处理,您只能提取视频,而无需对其进行解码并将其再次编码为H264.但是,如果需要转码,我会留下一条注释行来完成这项工作(但是这可能会阻塞功能较弱的CPU).
- this code will expose RTSP stream named
stream1
on default port 8554 - I used
qtdemux
to get video from MP4 container. You could extend above pipeline to extract audio too (and expose it too via RTSP server) - to decrease CPU processing you can only extract video without decoding it and encoding it again to H264. However, if transcoding is needed, I left one commented line that will do the job (but it might choke less powerful CPUs).
您可以使用VLC播放
vlc -v rtsp://127.0.0.1:8554/stream1
或使用Gstreamer
or with Gstreamer
gst-launch-1.0 playbin uri=rtsp://127.0.0.1:8554/stream1
但是,如果您实际上不需要RTSP,而只是端到端RTP ,请遵循Gstreamer管道(该管道利用
However, If you actually do not need RTSP but just end-to-end RTP following Gstreamer pipeline (that utilizes rtpbin) will do the job
gst-launch-1.0 -v rtpbin name=rtpbin \
filesrc location=test.mp4 ! qtdemux name=demux \
demux.video_0 ! decodebin ! x264enc ! rtph264pay config-interval=1 pt=96 ! rtpbin.send_rtp_sink_0 \
rtpbin.send_rtp_src_0 ! udpsink host=127.0.0.1 port=5000 sync=true async=false
并且VLC可以播放
vlc -v rtp://127.0.0.1:5000
这篇关于如何将视频(在磁盘上)转换为rtsp流的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!