因公司项目需求,需要开发一个基于java的RTSP服务,支持RTP/UDP和RTP/TCP模式的VLC播放。本人在这方面也是小白一个,于是各种谷歌,百度查找资料学习RTSP/RTP相关的理论知识,理论知识了解的差不多了,就想找一些java的成熟案例。可以找了一圈后发现根本没有java相关的可用案例。好在有一篇C++相关的可以借鉴,再此特别感谢这位大牛博主,不光技术好,博文也写的特别好。非常适合对于初学RTSP的小白。传送地址:http://blog.csdn.net/weixin_42462202/article/details/98986535。经过1周的学习和摸索最后成功开发出一个基于Java的RTSP服务,实现了RTP/UDP/TCP的在线实时视频播放。本文不讲述理论相关的,理论相关的参考上面的博客地址,讲的不要太好。这里只上经过公司项目实战验证的干货。交流QQ群:592145870, 点击下载源码

开发Java的RTSP服务主要有三个大步骤要点:

1、解析客户端RTSP请求协议并返回信息给客户端(建立通信连接)。

进入开发,首选需要一个网络通信开发包用于RTSP服务和客户端之间的通信,我这里选用的是netty-4.1.45.Final。netty4本身就支持RTSP协议的封装,所以在解析RTSP协议命令的时候非常方便。如图:
在这里插入图片描述

有了RTSP消息解析器后,自定义的Handler就可以轻松获取到相应的RTSP请求参数了,通过DefaultHttpRequest,HttpHeaders,你想要的请求信息都能有获取到请求信息后,按协议要求响应相应数据。如图:

2、提取nalu视频数据。

h264视频文件都是00 00 01或00 00 00 01为起始码,自己可以写个算法解析byte[]数组起始码提取nalu数据。参考如图:

在这里插入图片描述
在这里插入图片描述
上图readNalu方法就是提取nalu的算法方法,没有截全,主要是不同数据源方式可能有小差异,比如本地h264视频文件方式,可以通过open方法读取到全部的数据到byte[],提取nalu的时候比较简单,因为所有数据都在一起。但如果是海康终端设备数据,设备流服务数据本身就分片了,会出现有些片不包含起始码,有些片包含多个起始码。遇到的时候要注意,让readNalu方法兼容提取到每一个nalu数据,不然最后播放会出现绿屏或者花屏现象。

3、提取到的nalu数据进行nalu数据RTP打包和发送

不知道RTP包格式的请阅读本文开头的传送地址博客,打包有三种方式:单NALU打包、聚合打包、分片打包。常用的是单NALU打包和分片打包。客户端接收到正确协议格式的RTP数据包即可播放视频,RTP包发送有UDP模式和TCP模式之分,区别在于RTP/TCP模式多四个字节数据头。如图:
在这里插入图片描述
在这里插入图片描述 在这里插入图片描述
在这里插入图片描述
上几张图是RTP打包和TCP模式发送代码,TCP模式最后是通过netty的channel发送的。UPD模式很简单,只要知道客户端IP地址和端口即可用DatagramPacket发送。代码中的iosesson是用户会话管理的。开发测试阶段可以不用。打包好的RTP直接调用channel发送即可。

以上就是大致的步骤和核心代码,目前只实现了视频的播放和回访,后期还有音频的效果需要实现,因需要忙别的项目,音频的实现暂时还没研究,有兴趣的同学可以一起交流,最后放几张本地h264视频文件效果图:

因公司项目需求,需要开发一个基于java的RTSP服务,支持RTP/UDP和RTP/TCP模式的VLC播放。本人在这方面也是小白一个,于是各种谷歌,百度查找资料学习RTSP/RTP相关的理论知识,理论知识了解的差不多了,就想找一些java的成熟案例。可以找了一圈后发现根本没有java相关的可用案例。好在有一篇C++相关的可以借鉴,再此特别感谢这位大牛博主,不光技术好,博文也写的特别好。非常适合对于...
1.在HTML中实现VLC视频流播放和控制的(包括屏幕的放大缩小、播放的控制、声音大小的控制、图像控制等功能),本DEMO可以播放 RTSP 实时流(海康、大华等摄像机)、RSTP实时流等主流。。。请放心下载,在IE、360浏览器测试OK, rtsp .zip 2. rtsp 转rtmp程序,从 rtsp 摄像机获取流,转换为rtmp push到 服务 器(官方资源)EasyRTMP-master.zip 3.将 rtsp 转码为flv格式用于h5播放(前端使用flvjs播放)源码.rar和 rtsp -web-converter-master.zip
那么 rtsp 我们怎么处理呢?我们使用 java rtsp 流拿到之后,进行 rtsp 解码,因为要考虑到延时性,所以我们要尽量拿到一秒的数据之后再进行推流处理。代码如下: public void decodeWave(String token, String url) throws Ex..
rtsp 协议的格式与http协议的格式是一样的, 因此可以使用 netty 的http解析器来处理 rtsp 交互数据. netty 中自带了一个 Rtsp Decoder, 但是它几乎没做什么事情, 只是将 rtsp 消息解析成HttpRequest,HttpResonse, HttpContent. 因此, 最终还是需要开发者自己处理, 没有什么捷径. 因此本文只是说明 netty 的基本用法 基本使用方法 最近公司要我做一个跟摄像头有关的项目,要求实现网页直播的功能,并且前端不用浏览器插件(为了兼容更多的浏览器),摄像头是某世的,有提供 rtsp 地址。之前没接触过摄像头,网上找了很多资料,实现的方法也是各式各样,最终确定了一个比较接近需求且简单的方案。 先放出码云地址:https://gitee.com/lllyl2012/ rtsp Demo gith...
private static final String RTSP _VERSION = " RTSP /1.0"; private static final String CRLF = "\r\n"; public static void main(String[] args) throws Exception { String serverAddress = "example.com"; int serverPort = 554; String url = " rtsp ://" + serverAddress + ":" + serverPort + "/test.mp4"; // Establish TCP connection with server Socket rtsp Socket = new Socket(serverAddress, serverPort); BufferedReader inputReader = new BufferedReader(new InputStreamReader( rtsp Socket.getInputStream())); OutputStream outputStream = rtsp Socket.getOutputStream(); // Send RTSP OPTIONS request String optionsRequest = "OPTIONS " + url + " " + RTSP _VERSION + CRLF + "CSeq: 1" + CRLF + "User-Agent: My RTSP Client" + CRLF + CRLF; outputStream.write(optionsRequest.getBytes()); System.out.println("OPTIONS request sent."); // Read RTSP OPTIONS response String optionsResponse = ""; String inputLine; while ((inputLine = inputReader.readLine()) != null) { optionsResponse += inputLine + "\n"; if (inputLine.equals("")) break; System.out.println("OPTIONS response received:\n" + optionsResponse); // Send RTSP DESCRIBE request String describeRequest = "DESCRIBE " + url + " " + RTSP _VERSION + CRLF + "CSeq: 2" + CRLF + "User-Agent: My RTSP Client" + CRLF + "Accept: application/sdp" + CRLF + CRLF; outputStream.write(describeRequest.getBytes()); System.out.println("DESCRIBE request sent."); // Read RTSP DESCRIBE response String describeResponse = ""; while ((inputLine = inputReader.readLine()) != null) { describeResponse += inputLine + "\n"; if (inputLine.equals("")) break; System.out.println("DESCRIBE response received:\n" + describeResponse); // Close the RTSP socket rtsp Socket.close(); 这个示例通过建立TCP连接与 RTSP 服务 器进行通信,发送 RTSP OPTIONS和DESCRIBE请求,读取响应,并将其输出到控制台。您可以在此基础上构建更复杂的 RTSP 客户端。