如何将视频(在磁盘上)转换为rtsp流 [英] How to convert a video (on disk) to a rtsp stream

查看:1493
本文介绍了如何将视频(在磁盘上)转换为rtsp流的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的本​​地磁盘上有一个视频文件,我想从中创建一个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.

无论如何,有一种方法可以使用GStreamer的

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆