-
2021-12-15 17:38:58
前面是 使用 ffmpeg rtmp 协议推流,局域网延迟在6~8s 之间,无法忍受,这不 最近不太忙,那就继续搞。
查询了一圈发现 rtsp 比较快 那就试验一下
首先 rtmp 是与 nginx 的结合,rtsp 与 ZLMediaKit结合
服务器是centos 8 ,所以在centos 上搭建ZLMediaKit
要求
1、gcc -v
2、cmake -version
3、ffmpeg -version 必须安装ffmpeg
安装链接 centos在CentOS 8上安装FFmpeg_智识帮的博客-CSDN博客_centos8安装ffmpeg
搭建
git clone --depth https://gitee.com/xia-chu/ZLMediaKit
cd ZLMediaKit/
git submodule update --init
mkdir linux_build
ln -s linux_build/ build
cd build/
cmake ..
make -j4
cd Downloads/ZLMediaKit/release/linux/Debug/
./MediaServer
客户端推流
ffmpeg -f dshow -i video="Integrated Webcam" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -rtsp_transport tcp -f rtsp rtsp://192.168.22.70:554/live/home
vlc 播放
rtsp rtsp://192.168.22.70:554/live/home
延迟在1~2s 之间
更多相关内容 -
live555_555_rtsp推流_RTSP推流源码_rtsp_live555
2021-09-11 08:37:47live555源码,测试demo,可以推流,学习rtsp协议必备 -
RTSP 推流demo
2019-01-18 17:03:26这个是基于Realtek底层芯片的RTSP推流demo,可在局域网下实现直播功能,纯C,无需任何第三方库 -
andriod rtsp push stream(安卓rtsp推流)
2018-03-12 09:37:43andriod rtsp push stream(安卓抓屏,然后rtsp推流) -
Android rtmp rtsp 推流客户端.zip
2019-10-10 03:50:39Android rtmp rtsp 推流客户端.zip,用于Android的RTMP和RTSP流媒体库。Java中的所有代码 -
Android代码-Android rtmp rtsp 推流客户端
2019-08-06 04:04:32rtmp-rtsp-stream-client-java Library for stream in RTMP and RTSP. All code in Java. If you need a player see this project: https://github.com/pedroSG94/vlc-example-streamplayer Wiki ... -
RTMP/RTSP推流组件推送H265到EasyDarwin
2018-12-03 16:45:08介绍一个基于C++开发的RTSP/RTMP推流组件PushStream,PushStream推流基础组件是一款推送流媒体音/视频流给标准RTSP流媒体服务器 (如EasyDarwin、Wowza) 或者RTMP流媒体服务器 (如Nginx) 的流媒体推送库 -
RTMP/RTSP推流组件推送H264到EasyDarwin_2
2018-12-09 22:34:34介绍一个基于C++开发的RTSP/RTMP推流组件PushStream,PushStream推流基础组件是一款推送流媒体音/视频流给标准RTSP流媒体服务器 (如EasyDarwin、Wowza) 或者RTMP流媒体服务器 (如Nginx) 的流媒体推送库 -
rtsp推流rtmp(命令行+demo+nginxconf+flvjs).rar
2019-07-17 14:30:24这是我《记录RTSP通过FFmpeg+nginx发布成rtmp和http-flv》中附带的代码和工具,包括rtmp推流的FFmpeg命令、rtmp推流的demo源码(使用FFmpegAPI)、nginx的配置conf、flv.js等。 -
RTSP推流
2022-04-05 21:13:06rtsp协议推流流程随着直播行业越来越火,rtmp等之类的直播协议也开始走入更多开发者的屏幕,原因是rtmp可以推流,解决了直播中媒体源如何发布到服务端的问题,除了rtmp还有没有什么更靠谱的、更标准的推流协议呢?有,RTSP,今天我们分享一下rtsp是如何推流的。
先看一句命令
.\ffmpeg.exe -re -i .\aiqinggongyu.mp4 -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://192.168.0.200/live/test
这句命令的作用是把aiqinggongyu.mp4文件以rtsp方式推送到流媒体服务器上,服务器以“rtsp://192.168.0.200/live/test”为url为其他rtsp客户端提供媒体流。
我们都知道rtsp的几个核心信令,分别是OPTIONS DESCRIBE SETUP PLAY PAUSE TEARDOWN GET_PARAMETER SET_PARAMETER,这几个信令可以完成的工作是客户端从服务器端获取视频流。而如果要实现推流的话,发送流的顺序肯定是从客户端到服务器端,与我们常见的方式相反,那么rtsp是如何做到推流的呢?
其实,rtsp除了上面几个常见的信令外,还有ANNOUNCE RECORD等信令,只是这些信令我们不常见,所以很多人不知道,rtsp的推流工作就是通过ANNOUNCE RECORD等信令完成的。
上栗(例)子
客户端(ffmpeg):192.168.0.92
服务端(zlmediakit):192.168.0.200
我们用上面的命令把媒体流通过客户端推送到服务端,看看其信令是如何交互的。
如上图所示,推流流程与拉流流程很相似,区别是推流将拉流的 DESCRIBE信令换成了ANNOUNCE,将PLAY信令换成了RECORD。具体的协商过程与拉流类似,只是结果刚好相反,媒体流由原来的服务端到客户端变为客户端到服务端。
补充:rtsp信令(摘自rfc2326)
-
RTMP/RTSP推流组件推送H264+AAC到EasyDarwin
2018-12-03 16:18:50介绍一个基于C++开发的RTSP/RTMP推流组件PushStream,PushStream推流基础组件是一款推送流媒体音/视频流给标准RTSP流媒体服务器 (如EasyDarwin、Wowza) 或者RTMP流媒体服务器 (如Nginx) 的流媒体推送库 -
rtsp推流
2021-11-03 16:20:29代码: ... # 导入opencv import cv2 as cv ...rtspUrl = 'rtsp://localhost/test' #将处理后的帧传入管道推流到该地址 def face_detect_demo(img): gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) face_detec.代码:
# 导入opencv import cv2 as cv import subprocess as sp rtspUrl = 'rtsp://localhost/test' #将处理后的帧传入管道推流到该地址 def face_detect_demo(img): gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) face_detect = cv.CascadeClassifier('haarcascade_frontalface_alt2.xml') # 主要是调整参数 face = face_detect.detectMultiScale(gray) for x, y, w, h in face: cv.rectangle(img, (x, y), (x+w, y+h), color=(0, 0, 255), thickness=2) # 读取实时流 cap = cv.VideoCapture('rtsp://192.168.1.118/190647.sdp') #此处写easypusher在easydarwin的播放地址 # 视频属性 size = (int(cap.get(cv.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))) sizeStr = str(size[0]) + 'x' + str(size[1]) fps = cap.get(cv.CAP_PROP_FPS) # 30p/self # 直播管道输出 # ffmpeg推送RTSP重点:通过管道共享数据的方式 command = ['ffmpeg', '-y', '-f', 'rawvideo', '-vcodec','rawvideo', '-pix_fmt', 'bgr24', '-s', sizeStr, '-r', str(fps), '-i', '-', '-c:v', 'libx264', '-pix_fmt', 'yuv420p', '-preset', 'ultrafast', '-f', 'rtsp', rtspUrl] #管道特性配置 pipe = sp.Popen(command, stdin=sp.PIPE) #,shell=False # 循环读取 while cap.isOpened(): flag, frame = cap.read() if not flag: break face_detect_demo(frame) pipe.stdin.write(frame.tobytes()) # 存入管道用于直播 pass # 释放摄像头 cap.release()
测试:
1、Windows配置ffmpeg
Windows安装配置ffmpeg_Simple的博客-CSDN博客
2、使用EasyDarwin做服务器
Releases · EasyDarwin/EasyDarwin · GitHub
下载解压后,点击EasyDarwin.exe,复制地址到浏览器中
使用手机测试:
一台设备安装EasyPusher
代码中cap地址写EasyDarwin中的播放地址
另一台设备安装EasyPlayer:
运行代码后,
复制推流的播放地址到easyplayer中:rtsp://localhost/test
-
rk板子,opencv Mat硬件编码264 RTSP推流.zip
2020-08-25 08:54:12这个例子可以参考在rk板子上怎么把opencv::Mat硬件编码为H264,然后live555推流出去,教程可看https://blog.csdn.net/sac761/article/details/105349370 -
libstreaming 录屏rtsp推流到rtsp流媒体服务
2017-07-21 14:47:11libstreaming 录屏rtsp推流到rtsp流媒体服务 -
h264裸流,可用于rtmp和rtsp推流测试
2016-10-21 14:00:31h264裸流,可用于rtmp和rtsp推流测试,分辨率800*,608,绝对可用 -
VLC RTSP推流
2018-11-01 14:33:07Qt环境下用VLC开发库实现RTSP网络推流;只含源码,不包含VLC库文件,搭建环境请参加博文https://blog.csdn.net/JellyLi2091/article/details/83616216 -
rtsp转rtmp推流工具
2021-07-27 10:52:08pyqt实现rtsp拉转推rtmp -
ffmpeg实现H264编、解码,RTSP推流,RTSP解码
2021-06-18 08:47:41本课程主要描述利用QT+FFMPEG,实现H264解码、编码,推流RTSP,解码RTSP的实现过程。 源码开源,学员可以直接利用源码进行二次开发设计 -
基于VLC实现RTSP推流视频
2021-02-08 17:49:45基于VLC实现RTSP推流视频一、添加VLC头文件和库文件二、封装RTSPServer推流类三、测试代码 不清楚推流大概原理的小伙伴,参考《设置VLC播放器进行RTSP推流视频》 一、添加VLC头文件和库文件 我们创建一个测试工程...基于VLC实现RTSP推流视频
不清楚推流大概原理的小伙伴,参考《设置VLC播放器进行RTSP推流视频》
这里以VLC 2.2.4版本为例,我们下载VLC播放器,其中带有VLC的SDK,下载地址:
http://download.videolan.org/vlc/2.2.4/win64/vlc-2.2.4-win64.7z
一、添加VLC头文件和库文件
我们创建一个测试工程RSTPVideo,在pro文件中添加如下内容:
win32 { # VLC相关库 LIBS += -L$$PWD/../VLC/lib -llibvlc -llibvlccore # VLC头文件目录 INCLUDEPATH += $$PWD/../VLC/include }
二、封装RTSPServer推流类
封装一个RSTPServer类,实现推流视频的主要逻辑代码。
RTSPServer.h
#ifndef RTSPSERVER_H #define RTSPSERVER_H #include <QString> #include <vlc/vlc.h> class RTSPServer { public: RTSPServer(); ~RTSPServer(); // 使用VLC实现RTSP推流。将视频文件转码后,推流到指定ip的端口上,协议一般为udp。 // 在VLC播放器中输入rtsp://xx.xx.xx.xx:端口/,即可播放推流的视频 // 推流到本地时,如rtsp://127.0.0.1:8554/,即可播放推流的视频 bool pushVideo(const QString& ip, int port, const QString& filePath); private: libvlc_instance_t *instance; }; #endif // RTSPSERVER_H
RTSPServer.cpp
#include "RTSPServer.h" #include <QDir> #define VIDEO_MEDIA_NAME "Video" RTSPServer::RTSPServer() { // 创建VLC实例 instance = libvlc_new (0, nullptr); } RTSPServer::~RTSPServer() { // 停止推流 libvlc_vlm_stop_media(instance, VIDEO_MEDIA_NAME); // 释放VLC实例 libvlc_vlm_release(instance); instance = nullptr; } bool RTSPServer::pushVideo(const QString &ip, int port, const QString &filePath) { // 转码参数:#transcode{vcodec=h264,acodec=mpga,ab=128,channels=2,samplerate=44100,scodec=none} QString convertPara = "#transcode{vcodec=h264,acodec=mpga,ab=128,channels=2,samplerate=44100,scodec=none}"; // 网络参数:rtp{sdp=rtsp://xx.xx.xx.xx:yyyy/} // 表示本机ip时,可省略ip,只写端口,如rtp{sdp=rtsp://:8554/} QString netPara = "rtp{sdp=rtsp://" + ip + ":" + QString::number(port) + "/}"; // 如sout = "#transcode{vcodec=h264,acodec=mpga,ab=128,channels=2,samplerate=44100,scodec=none}:rtp{sdp=rtsp://127.0.0.1:8554/}" QString sout = convertPara + ":" + netPara; // 将推流视频路径转换为本地系统风格,win下"a\\b\\c",linux下"a/b/c" QString path = QDir::toNativeSeparators(filePath); // 添加名为VIDEO_MEDIA_NAME的广播 int ret = libvlc_vlm_add_broadcast(instance, VIDEO_MEDIA_NAME, path.toStdString().c_str(), sout.toStdString().c_str(), 0, nullptr, true, false); if (ret != 0) { return false; } // 播放该广播 ret = libvlc_vlm_play_media(instance, VIDEO_MEDIA_NAME); return (ret == 0); }
三、测试代码
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "RTSPServer.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void on_pushButton_clicked(); private: Ui::MainWindow *ui; RTSPServer rtspServer; }; #endif // MAINWINDOW_H
mainwindow.cpp
void MainWindow::on_pushButton_clicked() { bool ret = rtspServer.pushVideo("127.0.0.1", 8554, qApp->applicationDirPath() + "/video.mp4"); if (ret) { QMessageBox::information(nullptr, "Info", "Push streaming video successfully"); } else { QMessageBox::information(nullptr, "Info", "Failed to push streaming video"); } ui->pushButton->setEnabled(false); }
代码非常简单,将程序所在目录下的video.mp4视频文件,推流到127.0.0.1,8554端口上。
注意:运行时,依赖的动态库有,libvlc.dll、libvlccore.dll、plugins插件,如下:
程序启动后,点击“Push Video”按钮启动推流;然后在VLC播放器中,打开如下串流地址
rtsp://127.0.0.1:8554/
运行效果如下:
左边播放器正常播放推流视频。
本文涉及工程代码:
https://gitee.com/bailiyang/cdemo/tree/master/Qt/63VLCTest/RTSPVideo
若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!
同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。
-
音视频学习之rtsp推拉流学习2(流媒体服务器ZLMediaKit)
2022-01-13 17:51:03公司项目需要实现一个只是rtsp推流和rtsp拉流的业务机制,据说ZLMediaKit能满足rtsp推拉流的相关业务。 对ZLMediaKit流媒体服务器进行安装以及了解。 0:从开源库Readme中对其功能进行了解 简单认识ZLMediaKit,了解... -
设置VLC播放器进行RTSP推流视频
2021-02-08 15:39:12设置VLC播放器进行RTSP推流视频一、推流与拉流概念二、设置推流端三、设置拉流端(播放端) 一、推流与拉流概念 首先,做几个名词解释。 推流,指的是把采集阶段封包好的内容传输到服务器的过程。 拉流,这个指的是... -
rtsp推流桌面,vlc拉流
2021-08-24 10:47:04rtsp推流桌面,vlc拉流 首先去vlc下载官网:https://www.videolan.org/ 下载vlc播放器。 1.vlc下载完成之后打开vlc,点击媒体—>流 2.在捕获模式选择‘桌面’,帧率选择30帧/秒;然后选择串流并点击 3.点击下... -
GStreamer与opencv实现rtsp推流
2021-07-19 16:01:06最近的一个任务是实现rtsp实时推流,即通过gstream管道实时把摄像头输入,通过rtsp推流。 一、代码 不多说什么直接上代码,想了解Gstreamer的小伙伴可以自行了解一下。 import cv2 import gi import sys import ... -
live555_555_rtsp推流_RTSP推流源码_rtsp_live555.zip
2021-10-11 23:12:04live555_555_rtsp推流_RTSP推流源码_rtsp_live555.zip -
gSoap-2.8.63实现RTSP推流
2018-03-25 20:04:38gSoap-2.8.63实现RTSP推流,利用live555做mediaServer,包含完整代码,直接make就行 -
rtsp服务器以及rtsp推流/拉流/转发
2021-03-10 21:11:50rtsp服务器 1、live555 2、ZLMediaKit 3、ffserver 4、gst-rtsp-server 5、feng 6、rtspd 1)live555 proxyServer live555库文件编译 https://www.cnblogs.com/dong1/p/5861624.html 源码 live/proxy... -
windows 10 rtsp 推流
2021-06-19 17:41:59推流命令 ffmpeg -re -stream_loop -1 -i D:\视频\WIN_20210619_17_17_34_Pro.mp4 -rtsp_transport tcp -f rtsp rtsp://127.0.0.1/test ffmpeg 下载 安装:https://www.pianshen.com/article/58141610762/ 播放路径... -
音视频学习之rtsp推流学习1(rtspserver开源库example运行及流程梳理)
2022-01-13 00:34:58建立在个人对rtsp推流流程有一定理解的基础上,本文目的是通过开源库rtspserver实现推流,了解一下这个库,运行该库下相关demo,对理论做实践。 1:搭建环境 # git clone git@github.com:ImSjt/RtspServer.git #这里...