RTSP转RTMP有多种实现方式,原理差不多。
最简单的可以用ffmpeg来实现:
ffmpeg -i "rtsp流路径" -vcodec copy -acodec copy -f flv "rtmp://127.0.0.1:1935/live/"
上面实现了功能,但是没有工程化,实用性不强,本文重点在于Java实现。
java处理音视频目前最好的库就是javacv,我们可以通过FFmpegFrameGrabber来捕获rtsp数据流,
// 采集/抓取器grabber = new FFmpegFrameGrabber(src);if(src.indexOf("rtsp")>=0) {grabber.setOption("rtsp_transport","tcp");}grabber.start();// 开始之后ffmpeg会采集视频信息,之后就可以获取音视频信息if (width < 0 || height < 0) {width = grabber.getImageWidth();height = grabber.getImageHeight();}// 视频参数audiocodecid = grabber.getAudioCodec();codecid = grabber.getVideoCodec();framerate = grabber.getVideoFrameRate();// 帧率bitrate = grabber.getVideoBitrate();// 比特率
然后通过FFmpegFrameRecorder来录制推流
// 录制/推流器record = new FFmpegFrameRecorder(out, width, height);record.setVideoOption("crf", "18");record.setGopSize(2);record.setFrameRate(framerate);record.setVideoBitrate(bitrate);record.setAudioChannels(audioChannels);record.setAudioBitrate(audioBitrate);record.setSampleRate(sampleRate);AVFormatContext fc = null;if (out.indexOf("rtmp") >= 0 || out.indexOf("flv") > 0) {// 封装格式flvrecord.setFormat("flv");record.setAudioCodecName("aac");record.setVideoCodec(codecid);fc = grabber.getFormatContext();}record.start(fc);
下面提供了一个springboot的工程地址,实现了传入rtsp地址,获得前端播放地址的功能,后续可以在此基础上进一步完善。
工程地址:
flvjs实现rtsp数据流无插件浏览器播放-前端
flvjs实现rtsp数据流无插件浏览器播放-后端