You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用GStreamer向RTSP服务器推流(含UDP/TCP备选方案)

GStreamer 向RTSP/UDP/TCP推流方案及参数详解

一、RTSP推流(推荐,支持VLC/浏览器间接访问)

要实现RTSP推流,首先得搭个RTSP服务器。GStreamer自带的rtsp-server模块就能用,先装对应依赖(比如Debian/Ubuntu上跑sudo apt install gstreamer1.0-rtsp-server)。

推流命令(摄像头→RTSP服务器)

gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! x264enc tune=zerolatency ! rtph264pay ! rtspclientsink location=rtsp://<你的服务器IP>:8554/my_stream

逐个拆解参数:

  • v4l2src device=/dev/video0:从本地摄像头设备(/dev/video0是默认摄像头,多个摄像头的话换video1/video2)抓取原始视频流
  • videoconvert:自动转换视频格式,解决v4l2src输出格式和后续编码器不兼容的问题,是格式转换的“万能胶”
  • x264enc tune=zerolatency:用x264编码器把原始视频压缩成H.264格式,tune=zerolatency是关键参数——关闭了一些耗时的压缩优化,优先保证实时性,适合直播推流
  • rtph264pay:把H.264编码后的视频打包成RTP(实时传输协议)包,这是RTSP流的标准传输单元
  • rtspclientsink location=rtsp://<你的服务器IP>:8554/my_stream:作为RTSP客户端,把RTP流发送到指定服务器地址。location里填服务器的公网/局域网IP,8554是RTSP默认端口,my_stream是你给流起的名字

服务器端启动(可选,用官方示例)

如果没现成的RTSP服务器,用GStreamer自带的test-launch示例程序启动一个:

test-launch "v4l2src device=/dev/video0 ! x264enc tune=zerolatency ! rtph264pay name=pay0 pt=96"

这个命令直接把摄像头流通过RTSP服务器发布,你也可以把里面的v4l2src部分换成接收推流的逻辑,不过上面的客户端推流命令已经能直接发往第三方RTSP服务器了。

访问方式

  • VLC:打开VLC→媒体→打开网络串流,输入rtsp://<服务器IP>:8554/my_stream即可播放
  • 浏览器:主流浏览器不原生支持RTSP,需要转成HLS/HTTP-FLV流。可以在服务器端用GStreamer把RTSP流转成HLS,再用HTML5的<video>标签访问。

二、UDP推流(最简单,适合VLC访问)

UDP不需要专门服务器,直接把流扔到指定IP和端口,接收端用VLC就能抓,适合局域网内快速测试。

推流命令

gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! x264enc tune=zerolatency ! rtph264pay ! udpsink host=<接收端IP> port=5000

参数补充解释:

  • 前半部分和RTSP推流完全一样,最后换成udpsink
    • host=<接收端IP>:填要接收流的设备IP(比如自己的本机IP,或者另一台电脑的局域网IP)
    • port=5000:自定义的UDP端口,只要没被占用就行

访问方式

  • VLC:输入udp://@<接收端IP>:5000@表示监听该IP下的指定端口),直接播放
  • 浏览器:需要在接收端加个转码环节,把UDP流转成HLS流放到HTTP服务器上:
gst-launch-1.0 udpsrc port=5000 ! application/x-rtp,media=video,encoding-name=H264,payload=96 ! rtph264depay ! h264parse ! hlssink location=/var/www/html/stream_%05d.ts target-duration=1

/var/www/html设成HTTP服务器(比如nginx)的根目录,浏览器访问http://<接收端IP>/stream.m3u8就能看。

三、TCP推流(可靠传输,适合网络不稳定场景)

TCP是可靠传输,不会丢包,但延迟比UDP略高,适合网络波动大的环境。

推流命令

gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! x264enc tune=zerolatency ! rtph264pay ! tcpsink host=<接收端IP> port=5001

参数解释:

  • 前半部分不变,最后换成tcpsink:指定接收端IP和端口即可,TCP会自动保证数据不丢失

访问方式

  • VLC:输入tcp://@<接收端IP>:5001直接播放
  • 浏览器:和UDP一样,转成HLS流后用HTTP访问,把转码命令里的udpsrc换成tcpsrc port=5001就行

关键注意事项

  • 插件安装:确保装了gstreamer1.0-plugins-good(包含videoconvertx264enc等核心插件)、gstreamer1.0-plugins-ugly(如果x264enc不在good包里的话)
  • 防火墙:开放对应的端口(RTSP 8554、UDP/TCP 5000/5001等),不然流传不过去
  • 摄像头格式:如果推流报错,大概率是格式不兼容,videoconvert一定要加,它能自动适配前后元素的格式需求

内容的提问来源于stack exchange,提问作者msalaz03

火山引擎 最新活动