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

vue+flv.js+SpringBoot+websocket實(shí)現(xiàn)視頻監(jiān)控與回放

這篇具有很好參考價(jià)值的文章主要介紹了vue+flv.js+SpringBoot+websocket實(shí)現(xiàn)視頻監(jiān)控與回放。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

vue+flv.js+SpringBoot+websocket實(shí)現(xiàn)視頻監(jiān)控與回放

需求:vue+springboot的項(xiàng)目,需要在頁面展示出??档挠脖P錄像機(jī)連接的攝像頭的實(shí)時(shí)監(jiān)控畫面以及回放功能.

  1. 之前項(xiàng)目里是純前端實(shí)現(xiàn)視頻監(jiān)控和回放功能.但是有局限性.就是ip地址必須固定.新的需求里設(shè)備ip不固定.所以必須換一種思路.
  2. 通過設(shè)備的主動(dòng)注冊,讓設(shè)備去主動(dòng)連接服務(wù)器后端通過socket推流給前端實(shí)現(xiàn)實(shí)時(shí)監(jiān)控和回放功能;

思路:

1:初始化設(shè)備.后端項(xiàng)目啟動(dòng)時(shí)就調(diào)用初始化方法.
2:開啟socket連接.前端頁面加載時(shí)嘗試連接socket.
3:點(diǎn)擊播放,調(diào)用后端推流接口.并且前端使用flv.js實(shí)現(xiàn)播放.

準(zhǔn)備工作:

1:vue項(xiàng)目引入flv.js。
npm install --save flv.js
main.js里面引入
import flvjs from ‘flv.js’;
Vue.use(flvjs)
但是這里我遇見一個(gè)坑.開發(fā)模式?jīng)]有問題.但是打包之后發(fā)現(xiàn)ie瀏覽器報(bào)語法錯(cuò)誤.不支持此引用.所以修改引用地址.
在webpack.base.conf.js的module.exports下添加

  resolve: {
    extensions: ['.js', '.vue', '.json'],
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      '@': resolve('src'),
      'flvjs':'flv.js/dist/flv.js'
    }
  },

plugins下添加

  plugins: [
    new webpack.ProvidePlugin({
      flvjs:'flvjs',
      $: "jquery",
      jQuery: "jquery",
      "window.jQuery": "jquery"
    })
  ],

最后頁面引入時(shí):

import flvjs from "flv.js/dist/flv.js";

2.準(zhǔn)備一個(gè)硬盤錄像機(jī),并添加一個(gè)攝像頭設(shè)備以做測試使用.
硬盤錄像機(jī)設(shè)置為主動(dòng)注冊模式.并配置好ip和端口以及子設(shè)備ID
vue+flv.js+SpringBoot+websocket實(shí)現(xiàn)視頻監(jiān)控與回放
在設(shè)置里的網(wǎng)絡(luò)設(shè)置里面
vue+flv.js+SpringBoot+websocket實(shí)現(xiàn)視頻監(jiān)控與回放

3.后端搭建好websocket工具類
包含通用的OnOpen,onClose,onError等方法.

實(shí)現(xiàn):
1.項(xiàng)目啟動(dòng)開啟設(shè)備服務(wù).這個(gè)SDKLIB里面都有就不介紹了.
2.頁面加載嘗試開啟socket連接.

//嘗試連接websocket
    startSocket(channelnum, device_value) {
      try {
        let videoWin = document.getElementById(this.currentSelect);
        if (flvjs.isSupported()) {
          let websocketName =
            "/device/monitor/videoConnection/" + channelnum + device_value;
          console.log("進(jìn)入連接websocket", this.ipurl + websocketName);
          const flvPlayer = flvjs.createPlayer(
            {
              type: "flv",
              //是否是實(shí)時(shí)流
              isLive: true,
              //是否有音頻
              hasAudio: false,
              url: this.ipurl + websocketName,
              enableStashBuffer: true,
            },
            {
              enableStashBuffer: false,
              stashInitialSize: 128,
            }
          );
          flvPlayer.on("error", (err) => {
            console.log("err", err);
          });
          flvjs.getFeatureList();
          flvPlayer.attachMediaElement(videoWin);
          flvPlayer.load();
          flvPlayer.play();
          return true;
        }
      } catch (error) {
        console.log("連接websocket異常", error);
        return false;
      }
    },

這里傳的參數(shù)是通道號和設(shè)備信息.無需在意.只要是唯一key就可以.

2.socket連接成功后.調(diào)用后端推流方法實(shí)現(xiàn)播放.
這里說一下后端的推流方法.
調(diào)用SDK里的CLIENT_RealPlayByDataType方法

/**
     * 實(shí)時(shí)預(yù)覽拉流
     *
     * @param loginHandler 登錄句柄
     * @param channel      通道號
     * @param emDataType   回調(diào)拉出的碼流類型,{@link NetSDKLib.EM_REAL_DATA_TYPE}
     */
    public long preview(long loginHandler, int channel, NetSDKLib.fRealDataCallBackEx realDataCallBackEx, fRealDataCallBackEx2 realPlayDataCallback, int emDataType, int rType, boolean saveFile, int emAudioType) {
        NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE inParam = new NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE();
        NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE outParam = new NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE();
        inParam.nChannelID = channel;
        inParam.rType = rType;
        if(realDataCallBackEx!=null){
            inParam.cbRealData=realDataCallBackEx;
        }
        if(realPlayDataCallback!=null){
            inParam.cbRealDataEx = realPlayDataCallback;
        }
        inParam.emDataType = emDataType;
        inParam.emAudioType=emAudioType;
        if (saveFile) {
            inParam.szSaveFileName = UUID.randomUUID().toString().replace(".", "").replace("-", "") + "." + EMRealDataType.getRealDataType(emDataType).getFileType();
        }
        NetSDKLib.LLong realPlayHandler = netsdk.CLIENT_RealPlayByDataType(new NetSDKLib.LLong(loginHandler), inParam, outParam, 3000);
        if (realPlayHandler.longValue() != 0) {
            netsdk.CLIENT_MakeKeyFrame(new NetSDKLib.LLong(loginHandler),channel,0);
            RealPlayInfo info = new RealPlayInfo(loginHandler, emDataType, channel, rType);
            realPlayHandlers.put(realPlayHandler.longValue(), info);
        } else {
            log.error("realplay failed.error is " + ENUMERROR.getErrorMessage(), this);
        }
        return realPlayHandler.longValue();
    }

注意:這里的碼流類型選擇flv.
回調(diào)函數(shù)里面:

// 回調(diào)建議寫成單例模式, 回調(diào)里處理數(shù)據(jù),需要另開線程
    @Autowired
    private WebSocketServer server;
    private Log log = Log.get(WebSocketRealDataCallback.class);

    @Override
    public void invoke(NetSDKLib.LLong lRealHandle, int dwDataType, Pointer pBuffer, int dwBufSize, int param, Pointer dwUser) {

        RealPlayInfo info = DeviceApi.realPlayHandlers.get(lRealHandle.longValue());
        if (info != null && info.getLoginHandler() != 0) {
            //過濾碼流
            byte[] buffer = pBuffer.getByteArray(0, dwBufSize);
            if (info.getEmDataType() == 0 || info.getEmDataType() == 3) {
                //選擇私有碼流或mp4碼流,拉流出的碼流都是私有碼流
                if (dwDataType == 0) {
                    log.info(dwDataType + ",length:" + buffer.length + " " + Arrays.toString(buffer), WebSocketRealDataCallback.class);
                    sendBuffer(buffer, lRealHandle.longValue());
                }
            } else if ((dwDataType - 1000) == info.getEmDataType()) {
                log.info(dwDataType + ",length: " + buffer.length + Arrays.toString(buffer), WebSocketRealDataCallback.class);
                sendBuffer(pBuffer.getByteArray(0, dwBufSize), lRealHandle.longValue());
            }
        }


    }

以及調(diào)用Websocket里面的sendMessageToOne發(fā)送給指定客戶端

    /**
     * 發(fā)送數(shù)據(jù)
     * @param bytes
     * @param realPlayHandler
     */
    private static void sendBuffer(byte[] bytes, long realPlayHandler) {
        /**
         * 發(fā)送流數(shù)據(jù)
         * 使用pBuffer.getByteBuffer(0,dwBufSize)得到的是一個(gè)指向native pointer的ByteBuffer對象,其數(shù)據(jù)存儲(chǔ)在native,
         * 而webSocket發(fā)送的數(shù)據(jù)需要存儲(chǔ)在ByteBuffer的成員變量hb,使用pBuffer的getByteBuffer得到的ByteBuffer其hb為null
         * 所以,需要先得到pBuffer的字節(jié)數(shù)組,手動(dòng)創(chuàng)建一個(gè)ByteBuffer
         */
        ByteBuffer buffer = ByteBuffer.wrap(bytes);
        server.sendMessageToOne(realPlayHandler, buffer);
    }

這里傳的參數(shù)是設(shè)備初始化的時(shí)候得到的登錄句柄.以及流數(shù)據(jù).

/**
     * 發(fā)送binary消息給指定客戶端
     *
     * @param realPlayHandler 預(yù)覽句柄
     * @param buffer          碼流數(shù)據(jù)
     */
    public void sendMessageToOne(long realPlayHandler, ByteBuffer buffer) {
        //登錄句柄無效
        if (realPlayHandler == 0) {
            log.error("loginHandler is invalid.please check.", this);
            return;
        }
        RealPlayInfo realPlayInfo = AutoRegisterEventModule.findRealPlayInfo(realPlayHandler);
        if(realPlayInfo == null){
            //連接已斷開
        }
        String key = realPlayInfo.getChannel()+realPlayInfo.getSbbh();
        Session session = sessions.get(key);
        if (session != null) {
            synchronized (session) {
                try {
                    session.getBasicRemote().sendBinary(buffer);
                    byte[] bytes=new byte[buffer.limit()];
                    buffer.get(bytes);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } else {

            //log.error("session is null.please check.", this);
        }
    }

這樣就實(shí)現(xiàn)了視頻監(jiān)控.

效果:
vue+flv.js+SpringBoot+websocket實(shí)現(xiàn)視頻監(jiān)控與回放
分享一下websocket代碼:

package com.dahuatech.netsdk.webpreview.websocket;

import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @description websocket實(shí)現(xiàn)類
 */
@ServerEndpoint("/websocket/{realPlayHandler}")
@Component
public class WebSocketServer {
    private static Log log = LogFactory.get(WebSocketServer.class);
    private FileOutputStream outputStream;
    /**
     * 靜態(tài)變量,用來記錄當(dāng)前在線連接數(shù)。應(yīng)該把它設(shè)計(jì)成線程安全
     */
    private final AtomicInteger onlineCount = new AtomicInteger(0);
    /**
     * 存放每個(gè)客戶端對應(yīng)的WebSocket對象,根據(jù)設(shè)備realPlayHandler建立session
     */
    public static ConcurrentHashMap<Long, Session> sessions = new ConcurrentHashMap<>();
    /**
     * 存放客戶端的對象
     *//*
    public static CopyOnWriteArrayList<Session> sessionList=new CopyOnWriteArrayList<>();*/

    /**
     * 有websocket client連接
     *
     * @param realPlayHandler 預(yù)覽句柄
     * @param session
     */
    @OnOpen
    public void OnOpen(@PathParam("realPlayHandler") long realPlayHandler, Session session) {

        if (sessions.containsKey(realPlayHandler)) {
            sessions.put(realPlayHandler, session);
        } else {
            sessions.put(realPlayHandler, session);
            addOnlineCount();
        }

        log.info("websocket connect.session: " + session);
    }

    /**
     * 連接關(guān)閉調(diào)用的方法
     *
     * @param realPlayHandler 預(yù)覽句柄
     * @param session         websocket連接對象
     */
    @OnClose
    public void onClose(@PathParam("realPlayHandler") Long realPlayHandler, Session session) {
        if (sessions.containsKey(realPlayHandler)) {
            sessions.remove(realPlayHandler);
            subOnlineCount();
        }
    }

    /**
     * 發(fā)生錯(cuò)誤
     *
     * @param throwable e
     */
    @OnError
    public void onError(Throwable throwable) {
        throwable.printStackTrace();
    }

    /**
     * 收到客戶端發(fā)來消息
     *
     * @param message 消息對象
     */
    @OnMessage
    public void onMessage(ByteBuffer message) {
        log.info("服務(wù)端收到客戶端發(fā)來的消息: {}", message);
    }

    /**
     * 收到客戶端發(fā)來消息
     *
     * @param message 字符串類型消息
     */
    @OnMessage
    public void onMessage(String message) {
        log.info("服務(wù)端收到客戶端發(fā)來的消息: {}", message);
    }

    /**
     * 發(fā)送消息
     *
     * @param message 字符串類型的消息
     */
    public void sendAll(String message) {
        for (Map.Entry<Long, Session> session : sessions.entrySet()) {
            session.getValue().getAsyncRemote().sendText(message);
        }
    }

    /**
     * 發(fā)送binary消息
     *
     * @param buffer
     */
    public void sendMessage(ByteBuffer buffer) {
        for (Map.Entry<Long, Session> session : sessions.entrySet()) {
            session.getValue().getAsyncRemote().sendBinary(buffer);
        }
    }

    /**
     * 發(fā)送binary消息給指定客戶端
     *
     * @param realPlayHandler 預(yù)覽句柄
     * @param buffer          碼流數(shù)據(jù)
     */
    public void sendMessageToOne(long realPlayHandler, ByteBuffer buffer) {
        //登錄句柄無效
        if (realPlayHandler == 0) {
            log.error("loginHandler is invalid.please check.", this);
            return;
        }
        Session session = sessions.get(realPlayHandler);
        if (session != null) {
            synchronized (session) {
                try {
                    session.getBasicRemote().sendBinary(buffer);
                    byte[] bytes=new byte[buffer.limit()];
                    buffer.get(bytes);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } else {
            //log.error("session is null.please check.", this);
        }
    }

    public void sendMessageToAll(ByteBuffer buffer) {

        for (Session session : sessions.values()) {
            synchronized (session) {
                try {
                    /**
                     * tomcat的原因,使用session.getAsyncRemote()會(huì)報(bào)Writing FULL WAITING error
                     * 需要使用session.getBasicRemote()
                     */
                    session.getBasicRemote().sendBinary(buffer);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 主動(dòng)關(guān)閉websocket連接
     *
     * @param realPlayHandler 預(yù)覽句柄
     */
    public void closeSession(long realPlayHandler) {
        try {
            Session session = sessions.get(realPlayHandler);
            if (session != null) {
                session.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 獲取當(dāng)前連接數(shù)
     *
     * @return
     */
    public int getOnlineCount() {
        return onlineCount.get();
    }

    /**
     * 增加當(dāng)前連接數(shù)
     *
     * @return
     */
    public int addOnlineCount() {
        return onlineCount.getAndIncrement();
    }

    /**
     * 減少當(dāng)前連接數(shù)
     *
     * @return
     */
    public int subOnlineCount() {
        return onlineCount.getAndDecrement();
    }
}

遇見的坑:
前端在播放的時(shí)候一開始始終不出畫面.流數(shù)據(jù)已經(jīng)拉過來了.后來才發(fā)現(xiàn)是因?yàn)閔asAudio參數(shù)
vue+flv.js+SpringBoot+websocket實(shí)現(xiàn)視頻監(jiān)控與回放
這里如果設(shè)置成了true.則你的電腦必須插入耳機(jī).不然會(huì)報(bào)錯(cuò);

總結(jié):
之前使用純前端實(shí)現(xiàn)視頻監(jiān)控和回放時(shí).瀏覽器時(shí)只支持IE.使用后端推流的方式實(shí)現(xiàn)視頻監(jiān)控和回放時(shí).瀏覽器支持谷歌火狐Edge等.但是又不支持IE了.很有意思.
flv的官方文檔解釋的是:
vue+flv.js+SpringBoot+websocket實(shí)現(xiàn)視頻監(jiān)控與回放
由于IO限制,flv.js可以支持HTTP上的FLV直播流Chrome 43+,F(xiàn)ireFox 42+,Edge 15.15048+和Safari 10.1+現(xiàn)在。

最后:
由于是后端不停的拉流.所以流量和服務(wù)器壓力比較大.可能同時(shí)打開多個(gè)監(jiān)控.會(huì)出現(xiàn)卡頓的情況.需要注意.文章來源地址http://www.zghlxwxcb.cn/news/detail-432895.html

到了這里,關(guān)于vue+flv.js+SpringBoot+websocket實(shí)現(xiàn)視頻監(jiān)控與回放的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • vue3+nodejs(websocket)實(shí)現(xiàn)監(jiān)控拉rtsp流,使用flv.js+ffmpeg包(主要建立websocket是為了轉(zhuǎn)碼傳流)

    vue3+nodejs(websocket)實(shí)現(xiàn)監(jiān)控拉rtsp流,使用flv.js+ffmpeg包(主要建立websocket是為了轉(zhuǎn)碼傳流)

    關(guān)于拉取監(jiān)控?cái)z像頭的流,我個(gè)人去查了很多資料,也是因?yàn)橹皼]有接觸過這一模塊,加上目前公司也沒有后端去寫接口,所以我直接用node去寫websocket,與前端建立起通信,能夠進(jìn)行后續(xù)轉(zhuǎn)碼、傳流,能夠?qū)崿F(xiàn)實(shí)時(shí)播放監(jiān)控畫面。 這里的rtsp流是要事先知道的,監(jiān)控的這個(gè)

    2024年02月20日
    瀏覽(25)
  • uni-app 和H5頁面視頻播放flv格式視頻監(jiān)控

    本文章向大家介紹uniApp 實(shí)現(xiàn)微信小程序和app視頻播放flv格式視頻監(jiān)控,主要包括uniApp 實(shí)現(xiàn)微信小程序和app視頻播放flv格式視頻監(jiān)控使用實(shí)例、應(yīng)用技巧、基本知識(shí)點(diǎn)總結(jié)和需要注意事項(xiàng),具有一定的參考價(jià)值,需要的朋友可以參考一下。 video 支持 App平臺(tái): 支持本地視頻(

    2023年04月08日
    瀏覽(25)
  • linux+nginx-http-flv-module+ffmpeg實(shí)現(xiàn)搭建簡易流媒體服務(wù)器將rtsp流轉(zhuǎn)flv格式在web端和微信小程序?qū)崟r(shí)播放監(jiān)控視頻

    linux+nginx-http-flv-module+ffmpeg實(shí)現(xiàn)搭建簡易流媒體服務(wù)器將rtsp流轉(zhuǎn)flv格式在web端和微信小程序?qū)崟r(shí)播放監(jiān)控視頻

    一.介紹背景 公司項(xiàng)目開發(fā)需求:將海康攝像頭的rtsp流在web端及微信小程序端進(jìn)行播放。之前我寫過一篇關(guān)于web端使用webtrc+videojs播放rtsp流的文章,確實(shí)能夠解決web端播放rtsp流的需求,但是這次多加了一個(gè)微信小程序....所以要考慮小程序的播放問題。本著探索實(shí)踐的精神在

    2024年02月08日
    瀏覽(39)
  • 安防監(jiān)控視頻匯聚EasyCVR平臺(tái)的FLV視頻流在VLC中無法播放的原因排查

    安防監(jiān)控視頻匯聚EasyCVR平臺(tái)的FLV視頻流在VLC中無法播放的原因排查

    眾所周知,TSINGSEE青犀視頻匯聚平臺(tái)EasyCVR可支持多協(xié)議方式接入,包括主流標(biāo)準(zhǔn)協(xié)議國標(biāo)GB28181、RTSP/Onvif、RTMP等,以及廠家私有協(xié)議與SDK接入,包括海康Ehome、海大宇等設(shè)備的SDK等。在視頻流的處理與分發(fā)上,視頻監(jiān)控匯聚平臺(tái)EasyCVR的性能也同樣表現(xiàn)得很優(yōu)秀,平臺(tái)可對外分

    2024年02月13日
    瀏覽(19)
  • 安防監(jiān)控視頻匯聚平臺(tái)EasyCVR分發(fā)的FLV視頻流在VLC中無法播放是什么原因?

    安防監(jiān)控視頻匯聚平臺(tái)EasyCVR分發(fā)的FLV視頻流在VLC中無法播放是什么原因?

    眾所周知,TSINGSEE青犀視頻匯聚平臺(tái)EasyCVR可支持多協(xié)議方式接入,包括主流標(biāo)準(zhǔn)協(xié)議國標(biāo)GB28181、RTSP/Onvif、RTMP等,以及廠家私有協(xié)議與SDK接入,包括??礒home、海大宇等設(shè)備的SDK等。在視頻流的處理與分發(fā)上,視頻監(jiān)控匯聚平臺(tái)EasyCVR的性能也同樣表現(xiàn)得很優(yōu)秀,平臺(tái)可對外分

    2024年02月13日
    瀏覽(28)
  • 視頻匯聚平臺(tái)EasyCVR安防監(jiān)控視頻匯聚平臺(tái)的FLV視頻流在VLC中無法播放的問題解決方案

    視頻匯聚平臺(tái)EasyCVR安防監(jiān)控視頻匯聚平臺(tái)的FLV視頻流在VLC中無法播放的問題解決方案

    眾所周知,TSINGSEE青犀視頻匯聚平臺(tái)EasyCVR可支持多協(xié)議方式接入,包括主流標(biāo)準(zhǔn)協(xié)議國標(biāo)GB28181、RTSP/Onvif、RTMP等,以及廠家私有協(xié)議與SDK接入,包括??礒home、海大宇等設(shè)備的SDK等。在視頻流的處理與分發(fā)上,視頻監(jiān)控匯聚平臺(tái)EasyCVR的性能也同樣表現(xiàn)得很優(yōu)秀,平臺(tái)可對外分

    2024年02月12日
    瀏覽(26)
  • vue實(shí)現(xiàn)監(jiān)控視頻直播

    vue實(shí)現(xiàn)監(jiān)控視頻直播

    vue實(shí)現(xiàn)監(jiān)控視頻直播 要想使用videojs我們勢必是需要安裝videojs的, 而且在生產(chǎn)環(huán)境中我們也需要依賴它, 所以如下 我們打開Vue工程中的主入口 main.js 進(jìn)行引入 創(chuàng)建監(jiān)控視頻九宮格 創(chuàng)建視頻容器 雖然是遍歷視頻容器組件,但是監(jiān)控視頻只播放第一個(gè),所以這里創(chuàng)建視頻容器時(shí)

    2024年02月11日
    瀏覽(21)
  • vue3中使用TcPlayer實(shí)現(xiàn)視頻監(jiān)控-代碼

    1、引入js文件 在index.html頭部引入引入播放器的cdn ?2、主要代碼 這里主要是監(jiān)控畫面的布局通過點(diǎn)擊按鈕使用grid布局進(jìn)行切換,tcplayer.js的初始化就不展示了 ?3、視頻監(jiān)控-效果圖

    2024年02月09日
    瀏覽(15)
  • VUE+webrtc-streamer 實(shí)現(xiàn)實(shí)時(shí)視頻播放(監(jiān)控設(shè)備-rtsp)

    VUE+webrtc-streamer 實(shí)現(xiàn)實(shí)時(shí)視頻播放(監(jiān)控設(shè)備-rtsp)

    下圖則啟動(dòng)成功,此時(shí)在瀏覽器訪問127.0.0.1:8000可以看到本機(jī)監(jiān)控畫面 地址:https://github.com/mpromonet/webrtc-streamer/releases 注意:第三步在本機(jī)啟動(dòng)服務(wù)所以 new WebRtcStreamer(id,serverUrl)中URL傳入127.0.0.1端口可 文章參考鏈接:https://blog.csdn.net/liona_koukou/article/details/126605137

    2024年02月02日
    瀏覽(36)
  • VUE+webrtc-streamer實(shí)現(xiàn)實(shí)時(shí)視頻播放(監(jiān)控設(shè)備-rtsp)

    VUE+webrtc-streamer實(shí)現(xiàn)實(shí)時(shí)視頻播放(監(jiān)控設(shè)備-rtsp)

    首先說明目前我只完成了本地測試,因還沒確定技術(shù)選型所以暫無項(xiàng)目應(yīng)用,先做一下儲(chǔ)備,后續(xù)項(xiàng)目應(yīng)用的話這篇文章會(huì)持續(xù)更新。 監(jiān)控設(shè)備播放效果如下:基于公司環(huán)境測試了大華和海康的監(jiān)控設(shè)備(H264編碼)可以正確播放 1、下載webrtc-streamer,本機(jī)測試我下載的最新

    2024年02月01日
    瀏覽(27)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包