精华内容
下载资源
问答
  • java实现rtsp转rtmp

    2021-03-18 16:22:02
    RTSP转RTMP有多种实现方式,原理差不多。 最简单的可以用ffmpeg来实现: ffmpeg -i "rtsp流路径" -vcodec copy -acodec copy -f flv "rtmp://127.0.0.1:1935/live/" 上面实现了功能,但是没有工程化,实用性不强...

    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) {
                // 封装格式flv
                record.setFormat("flv");
                record.setAudioCodecName("aac");
                record.setVideoCodec(codecid);
                fc = grabber.getFormatContext();
            }
            record.start(fc);

    下面提供了一个springboot的工程地址,实现了传入rtsp地址,获得前端播放地址的功能,后续可以在此基础上进一步完善。

    工程地址:

           flvjs实现rtsp数据流无插件浏览器播放-前端

            flvjs实现rtsp数据流无插件浏览器播放-后端

    展开全文
  • Rtsp转Rtmp Java客户端

    2021-06-10 14:46:52
    这是rtsp转流到rtmp服务器客户端-javafx客户端
  • 【笔记】Java 实现RTSP转RTMP协议 核心代码: try { avutil.av_log_set_level(avutil.AV_LOG_INFO); FFmpegLogCallback.set(); grabber = new FFmpegFrameGrabber(pojo.getRtsp()); grabber.setOption(...

    【笔记】Java 实现RTSP转RTMP协议

    核心代码:

    try {
    			avutil.av_log_set_level(avutil.AV_LOG_INFO);
    			FFmpegLogCallback.set();
    			grabber = new FFmpegFrameGrabber(pojo.getRtsp());
    			grabber.setOption("rtsp_transport", "tcp");
    			// 设置采集器构造超时时间
    			grabber.setOption("stimeout", "2000000");
    			if ("sub".equals(pojo.getStream())) {
    				grabber.start(config.getSub_code());
    			} else if ("main".equals(pojo.getStream())) {
    				grabber.start(config.getMain_code());
    			} else {
    				grabber.start(config.getMain_code());
    			}
    
    			// 部分监控设备流信息里携带的帧率为9000,如出现此问题,会导致dts、pts时间戳计算失败,播放器无法播放,故出现错误的帧率时,默认为25帧
    			if (grabber.getFrameRate() > 0 && grabber.getFrameRate() < 100) {
    				framerate = grabber.getFrameRate();
    			} else {
    				framerate = 25.0;
    			}
    			logger.debug("===============framerate:"+framerate);
    			int width = grabber.getImageWidth();
    			int height = grabber.getImageHeight();
    			// 若视频像素值为0,说明拉流异常,程序结束
    			if (width == 0 && height == 0) {
    				logger.error(pojo.getRtsp() + "  拉流异常!");
    				grabber.stop();
    				grabber.close();
    				release();
    				return;
    			}
    			recorder = new FFmpegFrameRecorder(pojo.getRtmp(), grabber.getImageWidth(), grabber.getImageHeight());
    			recorder.setInterleaved(true);
    			// 关键帧间隔,一般与帧率相同或者是视频帧率的两倍
    			recorder.setGopSize((int) framerate * 2);
    			// 视频帧率(保证视频质量的情况下最低25,低于25会出现闪屏)
    			recorder.setFrameRate(framerate);
    			// 设置比特率
    			recorder.setVideoBitrate(grabber.getVideoBitrate());
    			// 封装flv格式
    			recorder.setFormat("flv");
    			// h264编/解码器
    			recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
    			recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
    			Map<String, String> videoOption = new HashMap<>();
    
    			// 该参数用于降低延迟
    			videoOption.put("tune", "zerolatency");
    			/**
    			 ** 权衡quality(视频质量)和encode speed(编码速度) values(值): *
    			 * ultrafast(终极快),superfast(超级快), veryfast(非常快), faster(很快), fast(快), *
    			 * medium(中等), slow(慢), slower(很慢), veryslow(非常慢) *
    			 * ultrafast(终极快)提供最少的压缩(低编码器CPU)和最大的视频流大小;而veryslow(非常慢)提供最佳的压缩(高编码器CPU)的同时降低视频流的大小
    			 */
    			videoOption.put("preset", "veryslow");
    			// 画面质量参数,0~51;18~28是一个合理范围
    			videoOption.put("crf", "28");
    			recorder.setOptions(videoOption);
    			AVFormatContext fc = grabber.getFormatContext();
    			recorder.start(fc);
    			// 清空探测时留下的缓存
    			grabber.flush();
    
    			AVPacket pkt = null;
    			long dts = 0;
    			long pts = 0;
    			int timebase = 0;
    			for (int no_frame_index = 0; no_frame_index < 5 && err_index < 5;) {
    				long time1 = System.currentTimeMillis();
    				if (exitcode == 1) {
    					break;
    				}
    				pkt = grabber.grabPacket();
    				if (pkt == null || pkt.size() == 0 || pkt.data() == null) {
    					// 空包记录次数跳过
    					logger.warn("JavaCV 出现空包 设备信息:[ip:" + pojo.getIp() + " channel:" + pojo.getChannel() + " stream:"
    							+ pojo.getStream() + " starttime:" + pojo.getStarttime() + " endtime:" + " rtsp:"
    							+ pojo.getRtsp() + pojo.getEndtime() + " url:" + pojo.getUrl() + "]");
    					no_frame_index++;
    					continue;
    				}
    				// 过滤音频
    				if (pkt.stream_index() == 1) {
    					av_packet_unref(pkt);
    					continue;
    				}
    
    				// 矫正sdk回调数据的dts,pts每次不从0开始累加所导致的播放器无法续播问题
    				pkt.pts(pts);
    				pkt.dts(dts);
    				err_index += (recorder.recordPacket(pkt) ? 0 : 1);
    				// pts,dts累加
    				timebase = grabber.getFormatContext().streams(pkt.stream_index()).time_base().den();
    				pts += timebase / (int) framerate;
    				dts += timebase / (int) framerate;
    				// 将缓存空间的引用计数-1,并将Packet中的其他字段设为初始值。如果引用计数为0,自动的释放缓存空间。
    				av_packet_unref(pkt);
    
    				long endtime = System.currentTimeMillis();
    				if ((long) (1000 /framerate) - (endtime - time1) > 0) {
    					Thread.sleep((long) (1000 / framerate) - (endtime - time1));
    				}
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    			logger.error(e.getMessage());
    		} finally {
    			release();
    		}
    
    展开全文
  • javacv-RTSP转RTMP

    2020-11-04 09:10:10
    使用javacv实现rtsp转stmp,网上找了好多方法但都不符合业务,于是自己封装了一个。 功能依赖nginx-rtmp服务器,不搞什么上传资源了,评论获取。 代码: package com.app.rtmp; import java.util.HashMap; ...

    多个海康摄像头的rtsp读取,放在web中预览;

    使用javacv实现rtsp转stmp,网上找了好多方法但都不符合业务,于是自己封装了一个。

     

    功能依赖nginx-rtmp服务器,不搞什么上传资源了,评论获取。

    代码:

    package com.app.rtmp;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import org.bytedeco.javacpp.avcodec;
    import org.bytedeco.javacv.FFmpegFrameGrabber;
    import org.bytedeco.javacv.FFmpegFrameRecorder;
    import org.bytedeco.javacv.Frame;
    
    public class Rtsp2RtmpPacket {
    
        /**
         * 此处应用场景为多个摄像头rtsp流的读取
         */
        public static Map<String, Rtsp2RtmpPacket> PACKETS = new HashMap<>();
    
        public boolean exit = false;
        private FFmpegFrameGrabber grabber;
        private FFmpegFrameRecorder recorder;
    
        public static void getStart(String sessionId, String rtspUrl, String rtmpUrl) {
            getStop(sessionId);
            Rtsp2RtmpPacket packet = new Rtsp2RtmpPacket();
            PACKETS.put(sessionId, packet);
            new Thread(new Runnable() {
                @Override
                public void run() {
                    packet.push(rtspUrl, rtmpUrl);
                }
            }).start();
        }
    
        public static void getStop(String sessionId) {
            try {
                Rtsp2RtmpPacket rtmpPacket = PACKETS.get(sessionId);
                if (rtmpPacket != null) {
                    rtmpPacket.setExit(true);
                    PACKETS.remove(sessionId);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public void push(String rtspUrl, String rtmpUrl) {
            try {
                int width = 1600, height = 900;
                grabber = FFmpegFrameGrabber.createDefault(rtspUrl);
                grabber.setOption("rtsp_transport", "tcp"); // tcp方式防止丢包
                grabber.setImageWidth(width);
                grabber.setImageHeight(height);
                grabber.start();
                recorder = new FFmpegFrameRecorder(rtmpUrl, width, height, grabber.getAudioChannels());
                recorder.setInterleaved(true);
                recorder.setVideoOption("tune", "zerolatency"); // 降低编码延时
                recorder.setVideoOption("preset", "ultrafast"); // 提升编码速度
                recorder.setVideoOption("crf", "28"); // 视频质量参数(详见 https://trac.ffmpeg.org/wiki/Encode/H.264)
                recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
                recorder.setFormat("flv"); // 封装格式flv rtmp使用
                recorder.setVideoBitrate(2000000);
                recorder.setFrameRate(25); // 视频帧率(保证视频质量的情况下最低25,低于25会出现闪屏)
                recorder.setPixelFormat(0);
                recorder.setAudioQuality(0);// 最高质量
                recorder.setAudioBitrate(192000);// 音频比特率
                recorder.setSampleRate(44100);// 音频采样率
                recorder.setAudioChannels(grabber.getAudioChannels());// 双通道(立体声) 2(立体声);1(单声道);0(无音频)
                recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);// 音频编/解码器
                recorder.start();
                while (!exit) {
                    Frame frame = grabber.grabImage();
                    if (frame == null) {
                        grabber.start();
                        continue;
                    }
                    recorder.record(frame);
                }
    
                recorder.stop();
                recorder.release();
                grabber.stop();
                grabber.release();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public boolean isExit() {
            return exit;
        }
    
        public void setExit(boolean exit) {
            this.exit = exit;
        }
    
        public static void main(String[] args) {
            Rtsp2RtmpPacket.getStart("1001", "rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov", "rtmp://127.0.0.1:6004/live/test");
        }
    
    }
    

     

    存在问题:

    出现[h264 @ 000000001d3dfe40] error while decoding MB 29 5, bytestrea,在网上找解决方法,无果,还好需求对视频完整性要求不高,就在获取失败时重新调用获取的start()方法;详见代码。

    音频没有。。。

    一知半解最可怕,还待深入了解,望大牛指导。

     

    代码是在网上横飞的一段不知道出处的代码的基础上加以封装的,侵删。

     

     

     

    展开全文
  • 海康威视rtsp转rtmpjava稳定版)

    万次阅读 热门讨论 2019-07-24 11:42:19
    将海康威视摄像头产生的rtsp视频流,通过java代码转换后,以rtmp的形式推送到nginx服务器,实现远程访问。推流程序需要和设备在同一个局域网下(否则获取不到视频流),nginx可以在本地服务器,也可以是云服务器。 ...
  • 1.下载nginx(windows版已包含rtmp...2. 配置rtmp : rtmp { server { listen 1935; chunk_size 4000; application live { live on; } application hls { live on; hls on; hls_path temp/hls; hls_fragment 8s; } } }
  • JavaCV使用FFmpeg进行rtsp转rtmp直播流画面延时的优化方法由于首帧pts和dts不相等导致的画面延时问题分析解决方法FFmpegFrameGrabber调用start()方法执行时间太长导致画面延时问题分析解决方法 项目github地址:...
  • FFmpeg封装rtsprtmp(无需转码,低资源消耗)目录结构添加依赖,编写配置文件创建Bean创建缓存Cache修改启动类拉流、推流、封装定时任务Timer线程池管理编写controller1.开启视频流接口(POST)2.关闭视频流...
  • javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 ...javaCV开发详解之3:收流器实现,录制流媒体服务器的rtsp/rtmp视频文件(基于javaCV-FFMPEG) javaCV开发详解之4:流器实现(也可作...
  • javacv实现rtsp转rtmp(支持拉一路推多路)

    千次阅读 热门讨论 2020-04-09 10:10:02
    /** * rtsp转rtmp */ public class ConvertVideoPakcet { FFmpegFrameGrabber grabber = null; FFmpegFrameRecorderPlus record = null; int width = -1, height = -1; // 视频参数 protected double framerate;// ...
  • Java实现RTSP流实时转RTMP流 海康摄像头RTSP转RTMP 大华摄像头RTSP转RTMP 网页播放RTSP视频流 FFmpeg实时将RTSP转RTMP
  • Java+前端】前端调用大华摄像头,rtsp转rtmp

    千次阅读 热门讨论 2019-07-24 17:43:56
    大华网络摄像头采用rtsp格式,rtsp格式无法直接显示到web页面上,所以中间要进行实时视频转码。 步骤: 搭建nginx流式服务器 资源见文件分享,解压缩后直接就可进行使用(都已经将环境集成过了); 文档目录如下 ...
  • nginx-rtmp-ffmpeg集合 查看相关文章:http://javame.cnblogs.com 有问题加我
  • red5+java6+ffmpeg 实现rtsp转rtmp

    千次阅读 2016-08-07 00:10:18
    安装流媒体服务器red5 下载的版本为 setup-Red5-1.0.1-java6.exe ...安装java6,,添加JAVA_HOME 将解压后的ffmpeg的bin目录加入path 将oflaDemo 拷贝到red5目录下的webapps目录中 并将其中的index.h
  • 上一篇文章简单介绍了java如何调用ffmpeg的...上上一篇介绍了nginx-rtmp服务器的搭建:http://blog.csdn.net/eguid_1/article/details/51749830 这一篇将进一步深挖java对ffmepg命令的控制并最终实现服务接口化...
  • windows下流媒体nginx-rmtp-module服务器搭建及java程序调用fmpeg将rtsp转rtmp直播流【转】 时间:2015-01-15 12:18:57 阅读:2972 评论:0 收藏:0 [点我收藏+] 标签:class com 使用 src log java ...
  • 压缩包内包括流工具以及通过java控制流的jar包和一小部分演示代码以及播放器代码。另外除了压缩包内播放器大家也可以选择ckplayer在线播放器直接播放rtmp流。主要用于直播,视频监控在浏览器播放的流处理,小...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 123
精华内容 49
关键字:

javartsp转rtmp

java 订阅