实时流协议(RTSP)是一种网络应用协议,专为娱乐和通信系统使用,以控制流媒体服务器。该协议用于创建和控制终端之间的媒体会话。媒体服务器的客户端发布VCR命令,例如播放,录制和暂停,以便实时控制服务器到客户端或客户端到服务器的媒体流。
最近对接海康录像机设备,需要获取摄像头的实时画面,而通过接口返回的URL是一个RTSP地址,而RTSP地址是无法通过html里的video标签直接播放的,所以必须先将rtsp流转换成html可播放的格式。
本次实践采取的思路是:
1、使用VLC 播放器发送 RTSP流
2、使用nginx搭建RTMP服务器
3、使用ffmepg进行推流
4、网页播放rtmp推流
1、使用VLC 播放器发送 RTSP流
为了方便测试,我需要通过VLC在本地生成RTSP流的视频地址。VLC是一款强大的多媒体播放器,它能够直接播放RTSP流的视频,也能选择本地视频文件生成RTSP流。
VLC官网下载地址:https://www.videolan.org/
1)、下载并安装VLC播放器后,打开 VLC Media Player 播放器,进入界面,在上方菜单栏中点击"媒体"——"流"选项,如图
2)、弹出"打开媒体"对话框,如图,点击右侧的"添加"按钮,选择用于测试的 ts 或 mp4 格式文件,然后点击"串流",如果此处显示的不是串流,可以点击下拉菜单进行切换
3)、直接点击"下一个"按钮
4)、进入如下界面,点击下拉菜单,选择"RTSP",然后点击右侧的"添加"按钮;另外建议勾选"在本地显示",以便后面发流时可在本地同步看到视频内容
5)、点击上步骤的添加后,可自行设置RTSP流的端口号和路径,也可以不改,接着点击"下一个"按钮
6)、取消激活转码
7)、直接点击"流",即可发出 rtsp 流;
8)、如果你之前勾选了"在本地显示",则 VLC 会显示正在发送的视频内容和进度
9)、VLC播放器也可以直接播放RTSP流,所以现在新建一个VLC播放器窗口,在菜单栏中点击"媒体"——"打开网络串流"
10)、在打开媒体的窗口中,选择“网络”,然后输入刚刚创建的RTSP流地址:rtsp://localhost:8554/,点击播放
11)、能正常播放,则表示RTSP流发送成功
2、使用nginx搭建RTMP服务器
1)、nginx安装rtmp模块
...
2)、编辑nginx.conf,加入rtmp模块内容(与http同级)
http{ ... } rtmp { server { listen 1935; chunk_size 4096; application hls { #hls的地址 live on; hls on; hls_path html/hls; hls_fragment 1s; } application vod { play /html/hls; #//视频文件存放位置。 } application live { #rtmp的地址 live on; } } }
3)、重启nginx
4)、telnet一下rtmp服务是否已启动,1935端口
3、使用ffmepg进行推流
1)、ffmepg安装
centos安装教程:https://tytrock.com/topics/328
2)、使用ffmepg将RTSP流转成HLS
ffmpeg -re -i rtsp://192.168.1.188:8554/ -vcodec copy -f flv rtmp://localhost:1935/hls/movie
-re: 代表按照帧率发送,如果不加ffmpeg会一股脑地按最高的效率发送数据
-i: 后面是rtsp地址
-vcodec copy: 强制使用codec编解码方式,要加,否则ffmpeg会重新编码输入的H.264裸流
-f :强制转换为什么格式,后接格式
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>前端播放m3u8格式视频</title> <link href="https://vjs.zencdn.net/7.4.1/video-js.css" rel="stylesheet"> <script src='https://vjs.zencdn.net/7.4.1/video.js'></script> <!-- videojs-contrib-hls 用于在电脑端播放 如果只需手机播放可以不引入 --> <script src="https://cdn.bootcdn.net/ajax/libs/videojs-contrib-hls/5.15.0/videojs-contrib-hls.min.js"></script> </head> <body> <style> .video-js .vjs-tech {position: relative !important;} </style> <div> <video id="myVideo" class="video-js vjs-default-skin vjs-big-play-centered" controls preload="auto" data-setup='{}' style='width: 60%;height: auto'> <source id="source" src="http://localhost/hls/movie.m3u8" type="application/x-mpegURL"></source> </video> </div> <div style="width:100px;height: 100px;background: red;margin:0 auto;line-height: 100px;color:#fff;text-align: center">切换视频</div> </body> <script> // videojs 简单使用 var myVideo = videojs('myVideo', { bigPlayButton: true, textTrackDisplay: false, posterImage: false, errorDisplay: false, }) myVideo.play()// 视频播放 myVideo.pause() // 视频暂停 var changeVideo = function (vdoSrc) { if (/\.m3u8$/.test(vdoSrc)) { //判断视频源是否是m3u8的格式 myVideo.src({ src: vdoSrc, type: 'application/x-mpegURL' //在重新添加视频源的时候需要给新的type的值 }) } else { myVideo.src(vdoSrc) } myVideo.load(); myVideo.play(); } var src = 'http://localhost/hls/movie.m3u8'; document.querySelector('.qiehuan').addEventListener('click', function () { changeVideo(src); }) </script> </html>
https://tech.wmzhe.com/article/14251.html
https://blog.csdn.net/cat_of_ming/article/details/120058450
https://www.jianshu.com/p/a9f51e0f18f6
https://www.jb51.net/article/249100.htm