国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JAVA實現(xiàn)H264視頻流推送到RTSP、RTMP服務----JavaCV

這篇具有很好參考價值的文章主要介紹了JAVA實現(xiàn)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} 根據(jù)運行環(huán)境取值
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 {
        	// 使用管道流實現(xiàn)線程間通信
            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());
            }
        }
    }
    /**
     * 轉(zhuǎn)流器, 指定format
     */
    public void recordPushWithFormat() {
        long startTime = 0;
        long videoTS;

        try {
            log.info("grabber start ... {} > {}", deviceId, channel);
            // 從管道流中讀取視頻流
            // maximumSize 設置為0,不設置會阻塞
            FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(pis, 0);

            //此配置以減少啟動時間!若不設置,啟動最起碼半分鐘;
            //類似一個緩沖區(qū),用來檢測流的正確性,值越小,啟動越快
            grabber.setOption("probesize", "1024*20");
            grabber.setFrameRate(30);
            grabber.setVideoBitrate(2000000);
            //阻塞式,直到通道有數(shù)據(jù)
            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 每秒包含的幀數(shù) 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服務。文章來源地址http://www.zghlxwxcb.cn/news/detail-505166.html

到了這里,關于JAVA實現(xiàn)H264視頻流推送到RTSP、RTMP服務----JavaCV的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • QT實現(xiàn)OpenCV播放rtsp視頻流

    QT實現(xiàn)OpenCV播放rtsp視頻流

    使用OpenCV(圖像處理)、FastDeploy(飛槳部署)庫; 監(jiān)控相機傳輸數(shù)據(jù)用的是碼流,高清網(wǎng)絡攝像機產(chǎn)品編碼器都會產(chǎn)生兩個編碼格式,稱為 主碼流 和 子碼流 。這就叫雙碼流技術。 目的是用于解決監(jiān)控錄像的本地存儲和網(wǎng)絡傳輸?shù)膱D像的質(zhì)量問題。雙碼流能實現(xiàn)本地和遠程

    2024年02月03日
    瀏覽(100)
  • Windows上使用FFmpeg實現(xiàn)本地視頻推送模擬??祬f(xié)議rtsp視頻流

    Windows上使用FFmpeg實現(xiàn)本地視頻推送模擬??祬f(xié)議rtsp視頻流

    Nginx搭建RTMP服務器+FFmpeg實現(xiàn)??低晹z像頭預覽: Nginx搭建RTMP服務器+FFmpeg實現(xiàn)??低晹z像頭預覽_nginx rtmp ??禂z像頭_霸道流氓氣質(zhì)的博客-CSDN博客 上面記錄的是使用FFmpeg拉取??祬f(xié)議攝像頭的rtsp流并推流到流媒體服務器。 如果在其它業(yè)務場景下需要本地的視頻文件模擬

    2024年02月12日
    瀏覽(22)
  • ffmpeg + nginx 實現(xiàn)rtsp視頻流轉(zhuǎn)m3u8視頻流,轉(zhuǎn)碼推流(linux)

    ffmpeg + nginx 實現(xiàn)rtsp視頻流轉(zhuǎn)m3u8視頻流,轉(zhuǎn)碼推流(linux)

    FFmpeg即是一款音視頻編解碼工具,同時也是一組音視頻編碼開發(fā)套件,作為編碼開發(fā)套件,它為開發(fā)者提供了豐富的音視頻處理的調(diào)用接口。 FFmpeg提供了多種媒體格式的封裝和解封裝,包括多種音視頻編碼、多種協(xié)議的流媒體、多種多彩格式轉(zhuǎn)換、多種采樣率轉(zhuǎn)換、多種碼率

    2024年02月09日
    瀏覽(32)
  • 【音視頻】如何播放rtsp視頻流

    【音視頻】如何播放rtsp視頻流

    現(xiàn)階段直播越來越流行,直播技術發(fā)展也越來越快。Webrtc和rtsp是比較火熱的技術,而且應用也比較廣泛。本文通過實踐來展開介紹關于rtsp、webrtc的使用過程。 本文重點介紹如何播放rtsp視頻流,通過ffplay方式以及VLC media player的方式來播放 可以參考上一篇博文:【音視頻】基于

    2024年01月19日
    瀏覽(103)
  • Windows上搭建Nginx-http-flv實現(xiàn)rtsp視頻流推流到rtmp流媒體服務器并轉(zhuǎn)換和前端拉取http-flv視頻流

    Windows上搭建Nginx-http-flv實現(xiàn)rtsp視頻流推流到rtmp流媒體服務器并轉(zhuǎn)換和前端拉取http-flv視頻流

    Nginx-http-flv-module流媒體服務器搭建+模擬推流+flv.js在前端html和Vue中播放HTTP-FLV視頻流: Nginx-http-flv-module流媒體服務器搭建+模擬推流+flv.js在前端html和Vue中播放HTTP-FLV視頻流_霸道流氓氣質(zhì)的博客-CSDN博客 Windows上搭建Nginx RTMP服務器并使用FFmpeg實現(xiàn)本地視頻推流: Vue中使用vue-vi

    2024年02月15日
    瀏覽(25)
  • 如何解決html播放rtsp視頻,瀏覽器播放rtsp視頻流方案

    如何解決html播放rtsp視頻,瀏覽器播放rtsp視頻流方案

    最近項目中需要實時播放攝像頭rtsp視頻流,于是就專門做了些研究。而瀏覽器不能直接播放,只有通過插件或者轉(zhuǎn)碼來實現(xiàn)這個需求。 要實現(xiàn)這個目的,可以采用的方案非常得多,有商業(yè)的也有開源的,這里主要列舉一些開源的方案。這里的方案都是我嘗試過了的,有些成

    2024年02月05日
    瀏覽(29)
  • RTSP視頻流相關的一些操作

    RTSP視頻流相關的一些操作

    端口554在網(wǎng)絡通信中用于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日
    瀏覽(94)
  • 記錄對接??低晹z像頭web端實時預覽:Linux+ffmpeg+nginx轉(zhuǎn)換RTSP視頻流(完整版實現(xiàn))

    ????????需求:web端實現(xiàn)??禂z像頭實時預覽效果 ????????由于市面上大部分網(wǎng)絡攝像頭都支持RTSP協(xié)議視頻流,web端一般無法直接使用RTSP實現(xiàn)視頻預覽,本篇使用ffmpeg對視頻流進行轉(zhuǎn)換,最終實現(xiàn)web端實時預覽。 ????????工具介紹:ffmpeg、nginx、vue ????????介

    2024年01月25日
    瀏覽(24)
  • 將電腦本地視頻轉(zhuǎn)成rtsp和rtmp視頻流

    1、安裝rtsp-simple-server rtsp-server 下載好的文件直接運行就好 2、打開FFmpeg開始推流 udp推流 tcp推流 循環(huán)推流 其中: -re 為以流的方式讀??; -stream_loop 為循環(huán)讀取視頻源的次數(shù),-1為無限循環(huán); -i 為輸入的文件; -f 為格式化輸出到哪里;

    2024年02月15日
    瀏覽(20)
  • LiveNVR監(jiān)控流媒體Onvif/RTSP功能-視頻流水印如何疊加視頻水印疊加動態(tài)圖片疊加視頻流時間示例

    LiveNVR監(jiān)控流媒體Onvif/RTSP功能-視頻流水印如何疊加視頻水印疊加動態(tài)圖片疊加視頻流時間示例

    監(jiān)控視頻平臺播放視頻監(jiān)控的時候,除了滿足正常視頻播放外,有時還需要方便標記或者防盜用等添加視頻水印。有些視頻在原始攝像頭端就可以添加OSD水印,這種方式最好。 但是有些原始視頻沒有水印,但是平臺端播放的時候又希望有水印,下面介紹下LiveNVR Onvif/RTSP流媒體

    2024年02月13日
    瀏覽(97)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包