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稳定版)相关推荐

  1. 海康威视rtsp转rtmp

    工具,继承了推流nginx工具https://pan.baidu.com/s/1EjfxsR3SPasnwVadbxeGrA cmd输入:ffmpeg -re -rtsp_transport tcp ...

  2. 关于海康威视RTSP转RTMP直播的操作方法

    记录日期:2018-11-03 第一步:下载工具:nginx                  github 地址:https://github.com/illuspas/nginx-rtmp-win ...

  3. java实现rtsp转rtmp

    RTSP转RTMP有多种实现方式,原理差不多. 最简单的可以用ffmpeg来实现: ffmpeg -i "rtsp流路径" -vcodec copy -acodec copy -f ...

  4. java中rtsp转m3u8_NGINX+ffmpeg 实现 大华摄像头视屏转流RTSP转RTMP或M3U8

    一.准备 1.环境: windows 2.开发工具: ffmpeg.nginx(代理服务器)nginx-rmtp-module(nginx服务器的流媒体插件).vlc(兼容性播放器) 3.原理: ng ...

  5. 华为海康大华摄像头编译RTSP转RTMP和HTTPFLV

    华为海康大华摄像头编译RTSP转RTMP和HTTPFLV 项目需求要看摄像头实时画面谷歌浏览器不支持RTSP流直接展示 方案一 通过Java+nginx+rtsp转rtmp流 方案二 通过Java+ ...

  6. 视频流RTSP转RTMP与RTSP转M3U8实战

    一.环境 1.开发环境:windows 2.开发工具:FFmpeg.nginx.nginx-rmtp-module (链接  rtsp转u3m8提取码:fyc2 ) 3.简介:Nginx是一款轻量级的 ...

  7. 重磅消息:Redis 6.0.0 稳定版发布

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://www.sohu.com/a/ ...

  8. python3最新稳定版本-python3稳定版

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 美国时间6月27日晚8点,python 3. 7. 0 经过多轮测试,终 ...

  9. Hello World -- Java Web版(Java Web 入门教程)

    在阅读本文之前,你一定知道如何用Java语言写出"Hello, World!"了.那么,用Java语言如何写出Web版的"Hello, World!",使之显示 ...

  10. IDEA 2020.2 稳定版发布,带来了不少新功能...

    IntelliJ IDEA 2020.2 稳定版已发布,此版本带来了不少新功能,包括支持在 IDE 中审查和合并 GitHub PR.新增加的 Inspections 小组件(Inspections ...

最新文章

  1. python空值赋0_Python中的空值判断
  2. 『中级篇』Docker Cloud自动构建 Docker image(55)
  3. acwing——每日一题——总结
  4. lua 给userdata设置元表_lua学习之复习汇总篇
  5. HDU 1108 最小公倍数
  6. MySQL - ODBC安装错误问题!
  7. Windows10共享文件夹、打印机,可是网络上显示“未授予用户在此计算机上的请求登录类型”的解决方案
  8. Anaconda 3 详细安装教程
  9. 基于D-S证据理论的数据融合算法的研究
  10. 1. Cloudcraft
  11. 整合ecshop与discuz论坛
  12. BodyContent揭秘及定制复杂的JSP标签
  13. PBR:基于物理的渲染(Physically Based Rendering)+理论相关
  14. Adding items to hidden net GND
  15. 电机控制要点解疑:SPWM,SVPWM和矢量控制
  16. UVA:10118 Free Candies
  17. 南开大学张昊计算机,张昊(东北大学工商管理学院副教授)_百度百科
  18. 2016 移动应用质量大数据报告
  19. OpenWrt分区扩容
  20. 先进驾驶员辅助系统中用于车辆检测的雷达和摄像机早期融合

热门文章

  1. javascript的几种继承方式
  2. 优化算法 | 遗传算法(附Python代码)
  3. Android性能测试小工具Emmagee
  4. 乡镇村级别的地理经纬度数据网址
  5. 程序员王不留到底干了啥?!
  6. java解析json字符串详解
  7. 大华设备无法注册EasyGBS国标视频平台,是什么原因?
  8. 史上最简单的教程——“21天”自学C语言
  9. html编辑器pp,在线轻设计工具之H5
  10. ppp协议c语言,ppp协议是用于拨号上网和路由器之间通信的点到点通信协议,是属于(1)协议,它不具有(2)的功能。( - 信管网...