海康威视rtsp转rtmp(java稳定版)
1、测试的目标
将海康威视摄像头产生的rtsp视频流,通过java代码转换后,以rtmp的形式推送到nginx服务器,实现远程访问。推流程序需要和设备在同一个局域网下(否则获取不到视频流),nginx可以在本地服务器,也可以是云服务器。
2、工具和环境
eclipse、maven、jdk1.8、javacv-1.5.1、nginx1.17.1、VLC media player、iVMS-4200客户端
3、相关说明
(1)不同版本的javacv的包,有些类的位置有不同,下面是我用的包的maven地址
<dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.1</version>
</dependency>
(2)iVMS-4200客户端是用来设置摄像头IP的,设备的账号密码等信息,由设备厂家提供,摄像头的rtsp地址:
rtsp://{username}:{password}@{ip}/h264/1/main/av_stream
(3)nginx在window上部署可以直接下载到包含rtmp的包,linux上需要下载插件包自行编译,需要的可以给我留言
(4)VLC media player是用来预览rtmp视频流的,也可以用web页面访问,参考代码(ezuikit.js官方demo中有):
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta charset="UTF-8">
</head>
<script src="jquery-1.11.3.min.js"></script>
<script src="ezuikit.js"></script>
<script>
$(function () {var player08 = new EZUIPlayer('myPlayer08');player08.play();
})
</script><body><div style="border:1px solid red"><div><video id="myPlayer08" controls playsInline webkit-playsinline width="800" height="600"><source src="rtmp://{ip}:{port}/{name}" type="rtmp/flv" /></video></div></div>
</body><style>
div{display:inline-block;padding:0;margin:0;
}
</style>
</html>
4、Java代码
import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;public class TestClass {public static void main(String[] args) throws Exception{final int captureWidth = 1280;final int captureHeight = 720;final FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("{rtspUrl}");grabber.setImageWidth(captureWidth);grabber.setImageHeight(captureHeight);// rtsp格式一般添加TCP配置,否则丢帧会比较严重// Brick在测试过程发现,该参数改成udp可以解决部分电脑出现的下列报警,但是丢帧比较严重// av_interleaved_write_frame() error -22 while writing interleaved video packet.grabber.setOption("rtsp_transport", "tcp");grabber.start();// 最后一个参数是AudioChannels,建议通过grabber获取final FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("{rtmpUrl}", captureWidth, captureHeight, 1);recorder.setInterleaved(true);// 降低编码延时recorder.setVideoOption("tune", "zerolatency");// 提升编码速度recorder.setVideoOption("preset", "ultrafast");// 视频质量参数(详见 https://trac.ffmpeg.org/wiki/Encode/H.264)recorder.setVideoOption("crf", "28");// 分辨率recorder.setVideoBitrate(2000000);// 视频编码格式recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);// 视频格式recorder.setFormat("flv");// 视频帧率recorder.setFrameRate(15);recorder.setGopSize(60);recorder.setAudioOption("crf", "0");recorder.setAudioQuality(0);recorder.setAudioBitrate(192000);recorder.setSampleRate(44100);// 建议从grabber获取AudioChannelsrecorder.setAudioChannels(1);recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);recorder.start();// 解决音视频同步导致的延时问题Field field = recorder.getClass().getDeclaredField("oc");field.setAccessible(true);AVFormatContext oc = (AVFormatContext)field.get(recorder);oc.max_interleave_delta(100);// 用来测试的frame窗口final CanvasFrame cFrame = new CanvasFrame("frame");Frame capturedFrame = null;// 有些时候,程序执行回报下列错误,本次进行了代码优化// av_interleaved_write_frame() error -22 while writing interleaved video packet.int oldFrameNumber = Integer.MIN_VALUE;long oldTimestamp = Long.MIN_VALUE;while ((capturedFrame = grabber.grab()) != null) {if (cFrame.isVisible()) {cFrame.showImage(capturedFrame);}int newFrameNumber = grabber.getFrameNumber();long newTimestamp = capturedFrame.timestamp;if (newFrameNumber < oldFrameNumber) {continue;} else if (newFrameNumber > oldFrameNumber) {oldTimestamp = Long.MIN_VALUE;}if (newTimestamp < oldTimestamp) {continue;}oldFrameNumber = newFrameNumber;oldTimestamp = newTimestamp;System.out.println(newFrameNumber + "--" + newTimestamp);recorder.setTimestamp(capturedFrame.timestamp);recorder.record(capturedFrame);}cFrame.dispose();recorder.close();grabber.close();}
}
5、rtsp视频流地址(地址正确可以在vlc中播放)
rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream
username: 用户名;password: 密码;ip: 设备IP;port:设备端口,默认554时可略; codec:h264等;channel: 通道号;
subtype: 码流类型,主码流为main,辅码流为sub
例(DS-IPC-E22H-1W型) rtsp://admin:HikQTXVLV@192.168.0.100/h264/1/main/av_stream
补充:地址也可以是rtsp://[username]:[password]@[ip]:[port]/live.sdp
例(DS-IPC-E22H-1W型) rtsp://admin:HikQTXVLV@192.168.0.100/live.sdp
6、rtmp视频流地址(地址正确可以在vlc中播放)
rtmp://[ip]:[port]/[rtmp-addr]/[camera-name]
ip: nginx服务器IP;port:nginx的rtmp端口;rtmp-addr:配置的rtmp地址;camera-name:推流摄像头地址名称
例 rtmp://192.168.100.10:1935/hls/test01
7、附上测试时候用的nginx的配置文件
(1) 考虑hls(延时会比较高,但是可以不依赖flash)worker_processes 1;error_log logs/error.log notice;events {worker_connections 1024;
}rtmp { server {listen 8012;application myapp {live on; } application hls { live on; hls on; hls_path /usr/local/nginx/temp/hls; hls_fragment 1s;hls_playlist_length 3s; } }
}http {server {listen 8011;location / {root html;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}location /hls {types {application/vnd.apple.mpegurl m3u8;video/mp2t ts;}alias /usr/local/nginx/temp/hls;expires -1;}}
}(2) 不用hls(延时会比较第,但是需要依赖flash)worker_processes 1;error_log logs/error.log notice;events {worker_connections 1024;
}rtmp { server {listen 8012;application hls { live on; } }
}http {server {listen 8011;location / {root html;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}
}
8、补充
(1)recorder的参数,有些需要根据设备和实际需求变化一下
(2)使用recorder.setTimestamp(grabber.getTimestamp())执行一段时间之后就会报 -10054的错误
(3)实际使用中要关闭grabber和recorder,先使用release,再使用close,否则会导致服务停止
(4)最终测试结果:使用vlc播放有5-8s延时,使用web播放延时仅为1s左右
海康威视rtsp转rtmp(java稳定版)相关推荐
- 海康威视rtsp转rtmp
工具,继承了推流nginx工具https://pan.baidu.com/s/1EjfxsR3SPasnwVadbxeGrA cmd输入:ffmpeg -re -rtsp_transport tcp ...
- 关于海康威视RTSP转RTMP直播的操作方法
记录日期:2018-11-03 第一步:下载工具:nginx github 地址:https://github.com/illuspas/nginx-rtmp-win ...
- java实现rtsp转rtmp
RTSP转RTMP有多种实现方式,原理差不多. 最简单的可以用ffmpeg来实现: ffmpeg -i "rtsp流路径" -vcodec copy -acodec copy -f ...
- java中rtsp转m3u8_NGINX+ffmpeg 实现 大华摄像头视屏转流RTSP转RTMP或M3U8
一.准备 1.环境: windows 2.开发工具: ffmpeg.nginx(代理服务器)nginx-rmtp-module(nginx服务器的流媒体插件).vlc(兼容性播放器) 3.原理: ng ...
- 华为海康大华摄像头编译RTSP转RTMP和HTTPFLV
华为海康大华摄像头编译RTSP转RTMP和HTTPFLV 项目需求要看摄像头实时画面谷歌浏览器不支持RTSP流直接展示 方案一 通过Java+nginx+rtsp转rtmp流 方案二 通过Java+ ...
- 视频流RTSP转RTMP与RTSP转M3U8实战
一.环境 1.开发环境:windows 2.开发工具:FFmpeg.nginx.nginx-rmtp-module (链接 rtsp转u3m8提取码:fyc2 ) 3.简介:Nginx是一款轻量级的 ...
- 重磅消息:Redis 6.0.0 稳定版发布
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://www.sohu.com/a/ ...
- python3最新稳定版本-python3稳定版
广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 美国时间6月27日晚8点,python 3. 7. 0 经过多轮测试,终 ...
- Hello World -- Java Web版(Java Web 入门教程)
在阅读本文之前,你一定知道如何用Java语言写出"Hello, World!"了.那么,用Java语言如何写出Web版的"Hello, World!",使之显示 ...
- IDEA 2020.2 稳定版发布,带来了不少新功能...
IntelliJ IDEA 2020.2 稳定版已发布,此版本带来了不少新功能,包括支持在 IDE 中审查和合并 GitHub PR.新增加的 Inspections 小组件(Inspections ...
最新文章
- python空值赋0_Python中的空值判断
- 『中级篇』Docker Cloud自动构建 Docker image(55)
- acwing——每日一题——总结
- lua 给userdata设置元表_lua学习之复习汇总篇
- HDU 1108 最小公倍数
- MySQL - ODBC安装错误问题!
- Windows10共享文件夹、打印机,可是网络上显示“未授予用户在此计算机上的请求登录类型”的解决方案
- Anaconda 3 详细安装教程
- 基于D-S证据理论的数据融合算法的研究
- 1. Cloudcraft
- 整合ecshop与discuz论坛
- BodyContent揭秘及定制复杂的JSP标签
- PBR:基于物理的渲染(Physically Based Rendering)+理论相关
- Adding items to hidden net GND
- 电机控制要点解疑:SPWM,SVPWM和矢量控制
- UVA:10118 Free Candies
- 南开大学张昊计算机,张昊(东北大学工商管理学院副教授)_百度百科
- 2016 移动应用质量大数据报告
- OpenWrt分区扩容
- 先进驾驶员辅助系统中用于车辆检测的雷达和摄像机早期融合
热门文章
- javascript的几种继承方式
- 优化算法 | 遗传算法(附Python代码)
- Android性能测试小工具Emmagee
- 乡镇村级别的地理经纬度数据网址
- 程序员王不留到底干了啥?!
- java解析json字符串详解
- 大华设备无法注册EasyGBS国标视频平台,是什么原因?
- 史上最简单的教程——“21天”自学C语言
- html编辑器pp,在线轻设计工具之H5
- ppp协议c语言,ppp协议是用于拨号上网和路由器之间通信的点到点通信协议,是属于(1)协议,它不具有(2)的功能。( - 信管网...