JAVA实现H264视频流推送到RTSP、RTMP服务----JavaCV

这篇具有很好参考价值的文章主要介绍了JAVA实现H264视频流推送到RTSP、RTMP服务----JavaCV。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前提:
1.准备好rtsp、rtmp服务
2.准备好视频流接收程序

POM依赖配置

<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv</artifactId>
    <version>1.4.4</version>
    <exclusions>
        <exclusion>
            <groupId>org.bytedeco.javacpp-presets</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.bytedeco.javacpp-presets</groupId>
    <artifactId>ffmpeg</artifactId>
    <version>4.1-1.4.4</version>
</dependency>
<!-- ${javacpp.platform.dependencies} 根据运行环境取值
windows:windows-x86_64;linux:linux-x86_64 -->
<dependency>
    <groupId>org.bytedeco.javacpp-presets</groupId>
    <artifactId>ffmpeg</artifactId>
    <version>4.1-1.4.4</version>
    <classifier>${javacpp.platform.dependencies}</classifier>
</dependency>

关键代码

/**
 * 推流到rtsp、rtmp服务器
 */
@Slf4j
public class Pusher extends Thread {

    private final PipedInputStream pis = new PipedInputStream();
    private final PipedOutputStream pos = new PipedOutputStream();
    private final String deviceId;
    private final String channel;
    private volatile boolean running = true;
    private boolean flag = false;
    private String rtspBaseAddress = "rtsp://127.0.0.1:554/";
    private String rtmpBaseAddress = "rtmp://127.0.0.1:1935/hls/";

    public RtmpPusher(String deviceId, String channel) {
        this.deviceId = deviceId;
        this.channel = channel;
        try {
        	// 使用管道流实现线程间通信
            pos.connect(pis);
        } catch (IOException e) {
            log.info("pos connect pis error.{}", e.getMessage());
        }
    }
	
	/**
     * 将视频流写入管道
     */
    public void onMediaStream(byte[] data) {
        try {
            if (!flag) {
                log.info("receive data...");
                flag = true;
            }
            pos.write(data);
        } catch (IOException e) {
            log.error("write video data error.{}", e.getMessage());
            try {
                pos.close();
            } catch (IOException ex) {
                log.error("pos close error.{}", ex.getMessage());
            }
        }
    }
    /**
     * 转流器, 指定format
     */
    public void recordPushWithFormat() {
        long startTime = 0;
        long videoTS;

        try {
            log.info("grabber start ... {} > {}", deviceId, channel);
            // 从管道流中读取视频流
            // maximumSize 设置为0,不设置会阻塞
            FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(pis, 0);

            //此配置以减少启动时间!若不设置,启动最起码半分钟;
            //类似一个缓冲区,用来检测流的正确性,值越小,启动越快
            grabber.setOption("probesize", "1024*20");
            grabber.setFrameRate(30);
            grabber.setVideoBitrate(2000000);
            //阻塞式,直到通道有数据
            grabber.start();

            log.info("grabber start suc. and start recorder ... {} > {}", deviceId, channel);

            // 获取推流地址对应的recorder,用于录制视频
            // rtmp对应format是flv
            // rtsp对应format是rtsp
            FrameRecorder rtspRecorder = getRecorder(rtspBaseAddress + deviceId + Constant.SEPARATOR + channel, "rtsp");
            FrameRecorder rtmpRecorder = getRecorder(rtmpBaseAddress + deviceId + Constant.SEPARATOR + channel, "flv");

            rtspRecorder.start();
            rtmpRecorder.start();

            Frame grabframe;

			// 从视频流中捕获帧以录制视频
            while (running && (grabframe = grabber.grab()) != null) {

                if (startTime == 0) {
                    startTime = System.currentTimeMillis();
                }

                videoTS = 1000 * (System.currentTimeMillis() - startTime);
                
				// 推流到rtsp server
                if (videoTS > rtspRecorder.getTimestamp()) {
                    rtspRecorder.setTimestamp(videoTS);
                }
                rtspRecorder.record(grabframe);
                // 推流到rtmp server
                if (videoTS > rtmpRecorder.getTimestamp()) {
                    rtmpRecorder.setTimestamp(videoTS);
                }
                rtmpRecorder.record(grabframe);

            }
        } catch (Exception e) {
            log.error("record push error.", e);
        } finally {
            try {
                pis.close();
            } catch (IOException e) {
                log.error("pis close error.{}", e.getMessage());
            }
        }

    }

    private FrameRecorder getRecorder(String address, String format) {
        FrameRecorder recorder = new FFmpegFrameRecorder(address, 720, 480);
        recorder.setInterleaved(true);
        recorder.setVideoOption("tune", "zerolatency");
        recorder.setVideoOption("preset", "ultrafast");
        recorder.setVideoOption("crf", "28");
        recorder.setVideoBitrate(2000000);//码率 越大越清晰
        recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
        recorder.setFormat(format);//flv rtsp
        recorder.setFrameRate(30);//帧率 30fps 每秒包含的帧数 24-30越大越流畅
        recorder.setGopSize(60);//30*2 每60帧存在一个关键帧
        return recorder;
    }

    public void stopPush() {
        this.running = false;
        this.interrupt();
    }

    public boolean isRunning() {
        return this.running;
    }

    @Override
    public void run() {
        recordPushWithFormat();
    }
}

原理说明

基本思路是:启动两个线程,线程1接收视频流,线程2使用JavaCV将视频流推送到RTSP、RTMP服务,两者之间使用管道流进行通信。线程2接收到视频流后的具体操作:启动grabber接收视频流并捕获视频帧,然后启动recoder将捕获的视频帧推送到RTSP、RTMP服务。文章来源地址https://www.toymoban.com/news/detail-505166.html

到了这里,关于JAVA实现H264视频流推送到RTSP、RTMP服务----JavaCV的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT实现OpenCV播放rtsp视频流

    使用OpenCV(图像处理)、FastDeploy(飞桨部署)库; 监控相机传输数据用的是码流,高清网络摄像机产品编码器都会产生两个编码格式,称为 主码流 和 子码流 。这就叫双码流技术。 目的是用于解决监控录像的本地存储和网络传输的图像的质量问题。双码流能实现本地和远程

    2024年02月03日
    浏览(69)
  • Windows上使用FFmpeg实现本地视频推送模拟海康协议rtsp视频流

    Nginx搭建RTMP服务器+FFmpeg实现海康威视摄像头预览: Nginx搭建RTMP服务器+FFmpeg实现海康威视摄像头预览_nginx rtmp 海康摄像头_霸道流氓气质的博客-CSDN博客 上面记录的是使用FFmpeg拉取海康协议摄像头的rtsp流并推流到流媒体服务器。 如果在其它业务场景下需要本地的视频文件模拟

    2024年02月12日
    浏览(44)
  • ffmpeg + nginx 实现rtsp视频流转m3u8视频流,转码推流(linux)

    FFmpeg即是一款音视频编解码工具,同时也是一组音视频编码开发套件,作为编码开发套件,它为开发者提供了丰富的音视频处理的调用接口。 FFmpeg提供了多种媒体格式的封装和解封装,包括多种音视频编码、多种协议的流媒体、多种多彩格式转换、多种采样率转换、多种码率

    2024年02月09日
    浏览(69)
  • 【音视频】如何播放rtsp视频流

    现阶段直播越来越流行,直播技术发展也越来越快。Webrtc和rtsp是比较火热的技术,而且应用也比较广泛。本文通过实践来展开介绍关于rtsp、webrtc的使用过程。 本文重点介绍如何播放rtsp视频流,通过ffplay方式以及VLC media player的方式来播放 可以参考上一篇博文:【音视频】基于

    2024年01月19日
    浏览(96)
  • Windows上搭建Nginx-http-flv实现rtsp视频流推流到rtmp流媒体服务器并转换和前端拉取http-flv视频流

    Nginx-http-flv-module流媒体服务器搭建+模拟推流+flv.js在前端html和Vue中播放HTTP-FLV视频流: Nginx-http-flv-module流媒体服务器搭建+模拟推流+flv.js在前端html和Vue中播放HTTP-FLV视频流_霸道流氓气质的博客-CSDN博客 Windows上搭建Nginx RTMP服务器并使用FFmpeg实现本地视频推流: Vue中使用vue-vi

    2024年02月15日
    浏览(73)
  • 如何解决html播放rtsp视频,浏览器播放rtsp视频流方案

    最近项目中需要实时播放摄像头rtsp视频流,于是就专门做了些研究。而浏览器不能直接播放,只有通过插件或者转码来实现这个需求。 要实现这个目的,可以采用的方案非常得多,有商业的也有开源的,这里主要列举一些开源的方案。这里的方案都是我尝试过了的,有些成

    2024年02月05日
    浏览(59)
  • RTSP视频流相关的一些操作

    端口554在网络通信中用于Real Time Streaming Protocol(RTSP)。 尝试使用 v4l2 去解码 https://gstreamer.freedesktop.org/documentation/tutorials/playback/hardware-accelerated-video-decoding.html?gi-language=c https://github.com/uutzinger/camera/blob/master/RTSP_RTP_gstreamer.md Ubuntu18.04 x86-64 使用 rtsp 流去做推理 nnstreamer_example_obj

    2024年02月12日
    浏览(54)
  • 记录对接海康威视摄像头web端实时预览:Linux+ffmpeg+nginx转换RTSP视频流(完整版实现)

            需求:web端实现海康摄像头实时预览效果         由于市面上大部分网络摄像头都支持RTSP协议视频流,web端一般无法直接使用RTSP实现视频预览,本篇使用ffmpeg对视频流进行转换,最终实现web端实时预览。         工具介绍:ffmpeg、nginx、vue         介

    2024年01月25日
    浏览(56)
  • 将电脑本地视频转成rtsp和rtmp视频流

    1、安装rtsp-simple-server rtsp-server 下载好的文件直接运行就好 2、打开FFmpeg开始推流 udp推流 tcp推流 循环推流 其中: -re 为以流的方式读取; -stream_loop 为循环读取视频源的次数,-1为无限循环; -i 为输入的文件; -f 为格式化输出到哪里;

    2024年02月15日
    浏览(47)
  • LiveNVR监控流媒体Onvif/RTSP功能-视频流水印如何叠加视频水印叠加动态图片叠加视频流时间示例

    监控视频平台播放视频监控的时候,除了满足正常视频播放外,有时还需要方便标记或者防盗用等添加视频水印。有些视频在原始摄像头端就可以添加OSD水印,这种方式最好。 但是有些原始视频没有水印,但是平台端播放的时候又希望有水印,下面介绍下LiveNVR Onvif/RTSP流媒体

    2024年02月13日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包