Nginx+FFmpeg NVR实现rtsp转flv实时预览+录像回放

1.工具准备

FFmpeg,推流工具Nginx,想实现Flv还需要安装模块nginx-http-flv-module。

网友提供了编译好的版本,csdn上下载,Flv.js,网页播放所需的文件,

2. 实时预览FFmpeg命令格式

ffmpeg -rtsp_transport tcp -i rtsp://user:password@ip:port/Streaming/channels/101 -c copy -f flv rtmp://127.0.0.1:1935/live/mystream
参数解析
-rtsp_transport tcp: 固定写法
user:用户名
password:密码
ip:摄像头或NVR的IP地址
port:摄像头或NVR的RTSP端口,默认是554,具体的RTSP取流规则可以百度
-c copy: 输出直接复制,不转换格式
-f flv:转成flv
rtmp://127.0.0.1:1935/live/mystream:根据Nginx配置文件生成
摄像头默认参数配置是h264则不会报错。

如果出现如下报错,是因为摄像头是h265,FFmpeg是无法直接转成flv的。

[flv @ 000002b1c6a1d680] Video codec hevc not compatible with flv Could not write header for output file #0 (incorrect codec parameters ?): Function not implemented
这种情况下需要将转码,将h265先转成h264,再转成flv,

具体指令如下:ffmpeg -rtsp_transport tcp -i rtsp://user:password@ip:port/Streaming/channels/101 -c:v libx264 -f flv rtmp://127.0.0.1:1935/live/mystream


实时预览有两种播放选择:

直接使用子码流播放,就不需要再进行h264的转换,这样的响应速度会更快,但是画质会差点;

用主码流播放则需要进行h264的转换,响应速度会慢2、3秒,画质不影响

3. 录像回放正常的RTSP取流规则如下:

rtsp://user:password@ip:port/Streaming/tracks/101?starttime=20200422t093812z&endtime=20200422t101003z


根据实时回放的FFmpeg规则,很容易想到将录像rtsp取流的url放到指令中

ffmpeg -rtsp_transport tcp -i rtsp://user:password@ip:port/Streaming/tracks/101?starttime=20200422t093812z&endtime=20200422t101003z -c copy -f flv rtmp://127.0.0.1:1935/live/mystream
直接在命令行中输入回车,会出现如下:


问题1:[tcp @ 00000216b1c116c0] Port missing in uri
rtsp://user:password@ip:port/Streaming/tracks/101?starttime=20200422t093812z: Invalid argument
'endtime' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
去掉rtsp取流url中的‘&endtime=20200422t101003z’,至于没有了结束时间怎么停止播放目前未找到好办法。ffmpeg -rtsp_transport tcp -i rtsp://user:password@ip:port/Streaming/tracks/101?starttime=20200422t093812z -c copy -f flv rtmp://127.0.0.1:1935/live/mystream
再次报错
问题2:

[flv @ 000001f285f01bc0] Video codec hevc not compatible with flvCould not write header for output file #0 (incorrect codec parameters ?): Function not implemented
这次出现的报错和实时预览中的一样,是因为摄像头h265的原因,不同的是实时预览可以选择子码流播放不转码,但是回放中只要主码流,所以只能进行转码操作ffmpeg -rtsp_transport tcp -i rtsp://user:password@ip:port/Streaming/tracks/101?starttime=20200422t093812z -c:v libx264 -f flv rtmp://127.0.0.1:1935/live/mystream
在命令行中输入回车,会出现如下


问题3:Input #0, rtsp, from 'rtsp://WSdun:WSdun@123@172.16.2.200:554/Streaming/tracks/201?starttime=20200422t093812z':
Metadata:
title : HIK Media Server V3.4.93
comment : HIK Media Server Session Description : standard
Duration: -187967:-4:-22.-32, start: 0.040000, bitrate: N/A
Stream #0:0: Video: hevc (Main), yuvj420p(pc, bt709), 1920x1080, 25 fps, 25 tbr, 90k tbn, 90k tbc
Stream #0:1: Audio: none, 16000 Hz, mono
Stream mapping:
Stream #0:0 -> #0:0 (hevc (native) -> h264 (libx264))
Stream #0:1 -> #0:1 (? (?) -> mp3 (libmp3lame))
Decoder (codec none) not found for input stream #0:1
通过rtsp回放拉流的话会同时拉取2个流音频流、视频流,就是上面中出现的Stream #0:0和Stram #0:1,

上面的报错是找不到音频流的编码方式,无法解码,实时预览拉流只会拉取视频流所以不会报错。通过查看FFmpeg的参数发现有个参数-an表示去除音频,将它放入到指令中ffmpeg -rtsp_transport tcp -i rtsp://user:password@ip:port/Streaming/tracks/101?starttime=20200422t093812z -c:v libx264 -an -f flv rtmp://127.0.0.1:1935/live/mystream
OK,能够正常播放录像拉。

但是到这里还不是最完美的解决了问题,你肯定发现播放速度非常慢,从输入ffmpeg指令到flv输出至少要等6~8秒。再问题3中,除了直接报错不能运行了外,其实在控制台上方还有个告警[rtsp @ 000001d6cf7108c0] Could not find codec parameters for stream 1 (Audio: none, 16000 Hz, 1 channels): unknown codec
Consider increasing the value for the 'analyzeduration' and 'probesize' options
Guessed Channel Layout for Input Stream #0.1 : mono
还是问题3中提到的找不到音频参数。

FFmpeg拉流的时候会检查视频流参数和音频流参数,视频流参数一直找不到,这中间有个超时时间。当时能想到的是能不能在拉流的时候和实施预览一样只拉视频流,上百度,找到了这个参数-allowed_media_types video(只取音频流的话就填audio),将它代入指令中,这时候可以去掉-an参数,没有音频流也就没有所谓的去除音频ffmpeg -rtsp_transport tcp -i rtsp://user:password@ip:port/Streaming/tracks/101?starttime=20200422t093812z -c:v libx264 -f flv rtmp://127.0.0.1:1935/live/mystream
。录像回放速度就和视频预览一样了。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
你可以通过以下步骤来实现Java与RTSPFFmpeg、HTML和Nginx的结合来实现视频实时播放的监控系统: 1. 首先,你需要使用Java来创建一个监控系统的后端服务。你可以使用Java的网络编程库来监听RTSP流并将其解码。可以使用开源的库,例如JRTSP或者Xuggler来处理RTSP流,并将其换为可供播放的视频流。 2. 接下来,你需要使用FFmpeg来处理视频流。FFmpeg是一个强大的多媒体处理工具,可以用于码、解码、编码等操作。你可以使用FFmpeg来解码RTSP流,并将其换为HTML5支持的视频格式,例如HLS(HTTP Live Streaming)或者MPEG-DASH(Dynamic Adaptive Streaming over HTTP)。 3. 在前端方面,你可以使用HTML和JavaScript来创建一个简单的视频播放器。你可以使用HTML5的<video>标签来嵌入视频,并使用JavaScript来控制视频的播放、暂停等操作。你可以使用一些开源的视频播放器库,例如video.js或者plyr来简化开发过程。 4. 最后,你可以使用Nginx作为反向代理服务器来提供视频流的分发和缓存功能。Nginx可以将视频流从后端服务器发给前端浏览器,并且可以缓存视频文件以提高性能和可靠性。你可以配置Nginx来支持HLS或者MPEG-DASH协议,并且可以使用Nginx的HTTP模块来进行性能优化和安全加固。 综上所述,通过将Java、RTSPFFmpeg、HTML和Nginx结合起来,你可以实现一个监控视频的实时播放系统。这个系统可以从RTSP流中提取视频数据,经过FFmpeg处理后,通过HTML和JavaScript在浏览器中进行播放,并且可以使用Nginx提供性能优化和缓存支持。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

akai9898

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值