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

java實現(xiàn)video標(biāo)簽視頻流播放

這篇具有很好參考價值的文章主要介紹了java實現(xiàn)video標(biāo)簽視頻流播放。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

java實現(xiàn)video標(biāo)簽視頻流播放

問題:

在遇到video標(biāo)簽播放后端視頻源時問題。直接返回文件流的話 video需要將文件整個下載一次才會播放。這樣如果小文件沒有問題。如果文件大的話就比較惡心了。

解決方案:通過模擬video標(biāo)簽?zāi)J(rèn)的range bytes規(guī)范方法分段獲取視頻信息。

video標(biāo)簽是通過請求頭帶上 Range: bytes=1179648- 意思是:告訴服務(wù)端我要1179648字節(jié)開始之后的內(nèi)容
然后服務(wù)端響應(yīng)頭返回:
accept-ranges: bytes #告訴瀏覽器我響應(yīng)的數(shù)據(jù)的范圍是字節(jié)形式的。
Content-Length: 286233105 #這次響應(yīng)內(nèi)容的大小。
Content-Range: bytes 1179648-287412752/287412753 #響應(yīng)內(nèi)容的范圍。287412753 是整個視頻總大小。

實現(xiàn)代碼僅供參考主要是理解思想:文章來源地址http://www.zghlxwxcb.cn/news/detail-628999.html

  public void videoStream(String env,String app,String id, HttpServletRequest request, HttpServletResponse response) throws Exception {
        //1.拿到文件引用
        FileInfo fi = getCacheFileInfo(env, app, id);
        if (fi==null){
            log.info("找不到文件:"+getKey(env,app,id));
            return;
        }


        String header = request.getHeader(HttpHeaders.RANGE);
        //2.如果沒有這個協(xié)議則直接走流下載
        if (StringUtils.isEmpty(header)){
            fileService.downloadFileStream(env,app,id,response);
            return;
        }

        //3.獲取數(shù)據(jù)的數(shù)據(jù)的范圍
        String[] rangeArr = header.replace("bytes=","").split("-");
        long fileLength = getFileLength(fi);
        long requestStart = getRequestStart(rangeArr);
        long requestEnd = getRequestEnd(rangeArr);
        if (requestEnd==0){
            requestEnd=requestStart+ chunkSize -1;
        }
        if (requestEnd>=fileLength){
            requestEnd=fileLength-1;
        }


        //4根據(jù)協(xié)議設(shè)置請求頭
        response.setHeader(HttpHeaders.ACCEPT_RANGES, "bytes");
        response.setHeader(HttpHeaders.CONTENT_TYPE, "video/mp4");
        long length = requestEnd - requestStart + 1;
        if (requestStart==0){
            length=fileLength;
        }
        response.setHeader(HttpHeaders.CONTENT_LENGTH, "" + length);
        response.setHeader(HttpHeaders.CONTENT_RANGE, "bytes " + requestStart + "-" + (requestStart==0?fileLength-1:requestEnd) + "/" + fileLength);
        response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);


        //5.寫數(shù)據(jù)
        writeData(env, app,fi,requestStart,requestEnd,response);


    }
      

private void writeData(String env,String app ,FileInfo fi, long requestStart, long requestEnd, HttpServletResponse response) {
        try (BufferedOutputStream bos=new BufferedOutputStream(response.getOutputStream())){
           //這個是下載普通文件
            if (fi instanceof StandaloneFileInfo){

                writeDataStandalone((StandaloneFileInfo) fi,requestStart,requestEnd,bos);
			//這個是下載分片文件
            }else if ( fi instanceof ShardingFileInfo){
                writeDataSharding(env,app,(ShardingFileInfo) fi,requestStart,requestEnd,bos);
            }
        }catch (Exception e){
            log.error("寫數(shù)據(jù)報錯");
        }
    }


	
    private void writeDataSharding(String env,String app,ShardingFileInfo fi, long requestStart, long requestEnd, BufferedOutputStream bos) throws Exception {
        //1.計算當(dāng)前字節(jié)請求范圍在那些分片上。
        int startChuck= (int) ((requestStart+1)%chunkSize==0?(requestStart+1)/chunkSize:((requestStart+1)/chunkSize)+1);
        int endChuck  = (int) ((requestEnd+1)/chunkSize)+1;

        //2.將需要請求的分片數(shù)據(jù)下載下來 放入一個buffer  這里為什么要用buffer 因為這種請求是很頻繁的使用堆內(nèi)存 比使用堆外內(nèi)存消耗大。因為堆內(nèi)存要gc
        ByteBuf buffer= ByteBufAllocator.DEFAULT.heapBuffer(chunkSize);
        List<String> shards = fi.getShardingMappingIds();
        for (int i = startChuck-1; i <shards.size()&&i<endChuck; i++) {
            StandaloneFileInfo info = (StandaloneFileInfo) fileService.downloadFile(env, app, shards.get(i));
            buffer.writeBytes(info.getData());
        }

        //3.計算具體從buff的那個字節(jié)開始讀 以及這次讀取字節(jié)的范圍
        int startLen=(int) ((requestStart) % chunkSize);
        int len= (int) ((requestEnd - requestStart)+ 1);

        //4.將需要讀取的字節(jié)寫回去。并且釋放掉這次的buffer。
        byte[] data=new byte[buffer.writerIndex()];
        buffer.getBytes(buffer.readerIndex(),data);
        bos.write(data,startLen,len);
        buffer.release();
    }


    private void writeDataStandalone(StandaloneFileInfo sfi,long requestStart, long requestEnd, OutputStream sos) throws IOException {
        byte[] bytes = Arrays.copyOfRange(sfi.getData(), (int) requestStart, (int) requestEnd);
        sos.write(bytes);
    }

到了這里,關(guān)于java實現(xiàn)video標(biāo)簽視頻流播放的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • Video(flv,mpegts)視頻流解決方案

    1.直播與點播 點播:從后端請求到MP4視頻,前端把地址放在video的src中實現(xiàn)播放 直播:1.獲取的是流數(shù)據(jù)2.要求實時性 2.視頻流形式 RTSP轉(zhuǎn)RTMP 底層基于 TCP,在瀏覽器端依賴 Flash,但是從2020底年開始,谷歌已經(jīng)帶頭不支持flash插件了 RTSP轉(zhuǎn)HLS 后端將視頻轉(zhuǎn)成HLS流,以m3u8后綴結(jié)尾。通過

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

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

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

    2024年01月19日
    瀏覽(104)
  • 【vue2】前端如何播放rtsp 視頻流,拿到rtsp視頻流地址如何處理,??狄曨lrtsp h264 如何播放

    【vue2】前端如何播放rtsp 視頻流,拿到rtsp視頻流地址如何處理,??狄曨lrtsp h264 如何播放

    最近在寫vue2 項目其中有個需求是實時播放攝像頭的視頻,攝像頭是 ???的設(shè)備,搞了很長時間終于監(jiān)控視頻出來了,記錄一下,放置下次遇到。文章有點長,略顯啰嗦請耐心看完。 測試?測試什么?測試rtsp視頻流能不能播放。 video mediaplay官網(wǎng) 即(VLC) 下載、安裝完VLC后

    2024年02月05日
    瀏覽(24)
  • 【音視頻】基于NGINX如何播放rtmp視頻流

    【音視頻】基于NGINX如何播放rtmp視頻流

    現(xiàn)階段直播越來越流行,直播技術(shù)發(fā)展也越來越快。Webrtc、rtmp、rtsp是比較火熱的技術(shù),而且應(yīng)用也比較廣泛。本文通過實踐來展開介紹關(guān)于rtmp如何播放。 本文重點介紹基于NGINX如何播放rtmp視頻流 可以參考上一篇博文:【音視頻】基于webrtc協(xié)議瀏覽器播放rtsp https://blog.csdn.n

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

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

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

    2024年02月05日
    瀏覽(29)
  • 【vue Dplayer】播放hls視頻流

    【vue Dplayer】播放hls視頻流

    安裝Dplayer和hls.js 準(zhǔn)備測試流 hls測試地址:(截止2023.08.08有效) http://playertest.longtailvideo.com/adaptive/bipbop/gear4/prog_index.m3u8

    2024年02月13日
    瀏覽(24)
  • TSINGSEE青犀視頻匯聚平臺EasyCVR多種視頻流播放協(xié)議介紹

    TSINGSEE青犀視頻匯聚平臺EasyCVR多種視頻流播放協(xié)議介紹

    眾所周知,TSINGSEE青犀視頻匯聚平臺EasyCVR可支持多協(xié)議方式接入,包括主流標(biāo)準(zhǔn)協(xié)議GB28181、RTSP/Onvif、RTMP等,以及廠家私有協(xié)議與SDK接入,包括??礒home、海大宇等設(shè)備的SDK等。今天我們來說一說,EasyCVR平臺支持分發(fā)的多種視頻流協(xié)議。 視頻監(jiān)控綜合管理平臺EasyCVR具備視頻

    2024年02月14日
    瀏覽(19)
  • electron+vue網(wǎng)頁直接播放RTSP視頻流?

    electron+vue網(wǎng)頁直接播放RTSP視頻流?

    目前大部分?jǐn)z像頭都支持RTSP協(xié)議,但是在瀏覽器限制,最新版的瀏覽器都不能直接播放RTSP協(xié)議,Electron 桌面應(yīng)用是基于 Chromium 內(nèi)核的,所以也不能直接播放RTSP,但是我們又有這個需求怎么辦呢? 市場上的方案很多,有很多免費開源的,同時也有比較成熟的商業(yè)軟件,豐儉

    2024年02月02日
    瀏覽(23)
  • 前端播放大視頻卡頓的解決(m3u8視頻流)

    前端播放大視頻卡頓的解決(m3u8視頻流)

    最近在一個大屏看板項目中有一個需求是:要求視頻和看板要進行來回切換。 最開始的做法是將MP4視頻放在項目里,在本地運行時是沒什么問題的,但是在往倉庫里提交代碼時出現(xiàn)了問題。當(dāng)單個文件超過100MB時會導(dǎo)致代碼提交失??; 后來的解決方案是將視頻文件放到服務(wù)器

    2024年01月19日
    瀏覽(27)
  • Vue中使用EasyPlayer播放H265視頻流

    Vue中使用EasyPlayer播放H265視頻流

    需要在Vue2的項目中使用EasyPlayer進行H265視頻流的播放。使用官方的最新版本加載H265會有問題。一直處于加載中… 引入easyplayer,這里最開始引入了最新版會有問題,因此引入的是3.3.12版本,可參照官方文檔進行配置。 EasyPlayer示例及使用說明 在static文件夾中引入對應(yīng)EasyPlayer.

    2024年02月03日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包