Dplayer Blob對視頻播放地址加密

寫demo的時候遇到的問題,想要記錄一下,正好也沒有發(fā)表過文章所以想借此記錄一下,內(nèi)容有很多是查詢資料獲得的几于,畢竟我只是個萌新。

以下內(nèi)容涉及到:Java 使用blob對H5視頻播放進(jìn)行加密
DplayerH5視頻播放器
js中Blob轉(zhuǎn)字符串

普通Mp4格式的視頻

使用Blob將普通格式的視頻加密并用Dplayer播放器進(jìn)行播放比較簡單沿后。

Java后臺將視頻以文件流的形式傳給前端

    @ResponseBody
    @RequestMapping("/getVideoSrc")
    public OutputStream getVideoSrc(HttpServletRequest httpServletRequest,
                                    HttpServletResponse httpServletResponse){
        //1.創(chuàng)建文件對象
        File f = new File("E:/test/1.mp4");
        //2.獲取文件名稱
        String fileName = f.getName();
        //3.導(dǎo)出文件
        String agent = httpServletRequest.getHeader("User-Agent").toUpperCase();
        InputStream fis = null;
        OutputStream os = null;
        try {
            //4.獲取輸入流
            fis = new BufferedInputStream(new FileInputStream(f.getPath()));
            byte[] buffer;
            buffer = new byte[fis.available()];
            fis.read(buffer);
            httpServletResponse.reset();
            //5.由于火狐和其他瀏覽器顯示名稱的方式不相同沿彭,需要進(jìn)行不同的編碼處理
            if(agent.indexOf("FIREFOX") != -1){//火狐瀏覽器
                httpServletResponse.addHeader("Content-Disposition", "attachment;filename="+ new String(fileName.getBytes("GB2312"),"ISO-8859-1"));
            }else{//其他瀏覽器
                httpServletResponse.addHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8"));
            }
            //6.設(shè)置response編碼
            httpServletResponse.setCharacterEncoding("UTF-8");
            httpServletResponse.addHeader("Content-Length", "" + f.length());
            //設(shè)置輸出文件類型
            httpServletResponse.setContentType("video/mpeg4");
            //7.獲取response輸出流
            os = httpServletResponse.getOutputStream();
            os.flush();
            //8.輸出文件
            os.write(buffer);
        }catch(Exception e){
            System.out.println(e.getMessage());
        } finally{
            //關(guān)閉流
            try {
                if(fis != null){ fis.close(); }

                if(os != null){ os.flush(); }

                if(os != null){os.close(); }

            } catch (IOException e) {
                System.out.println(e.getMessage());
            }
        }

        return os;
    }

前端使用JavaScript將視頻文件接收并轉(zhuǎn)為Blob對象

    //創(chuàng)建XMLHttpRequest對象
    var xhr = new XMLHttpRequest();
    //配置請求方式、請求地址以及是否同步
    xhr.open('POST', '/armystudy/blob/getVideoSrc', true);
    //設(shè)置請求結(jié)果類型為blob
    xhr.responseType = 'blob';
    //請求成功回調(diào)函數(shù)
    xhr.onload = function(e) {
        if (this.status == 200) {//請求成功
            //獲取blob對象
            var blob = this.response;
            //獲取blob對象地址尖滚,并把值賦給容器
            $("#sound").attr("src", URL.createObjectURL(blob));
        }
    };
    xhr.send();

html

<video id="sound" type="video/mp4" controls="controls" autoplay="autoplay"
       webkit-playsinline="true"    playsinline="true"   heigth="100%"></video>

文章來源:https://cloud.tencent.com/developer/article/1335832

使用Dplayer播放器

首先先要引用Dplayer的js文件

<script src="DPlayer.min.js"></script>
const dp = new DPlayer({
    container: document.getElementById('dplayer'),
    screenshot: true,
    video: {
        url: 'demo.mp4',
        pic: 'demo.jpg',
        thumbnails: 'thumbnails.jpg',
    },
    subtitle: {
        url: 'webvtt.vtt',
    },
    danmaku: {
        id: 'demo',
        api: 'https://api.prprpr.me/dplayer/',
    },
});

將Blob和使用Dplayer播放視頻進(jìn)行整合

java后臺不用變喉刘,只需要將js內(nèi)容進(jìn)行合并

//創(chuàng)建XMLHttpRequest對象
    var xhr = new XMLHttpRequest();
    //配置請求方式、請求地址以及是否同步
    xhr.open('GET', '/test03', true);
    console.log("請求")
    //設(shè)置請求結(jié)果類型為blob
    xhr.responseType = 'blob';

    xhr.onload = function(e){
        if (this.status == 200 ){
            //獲取blob對象
            var blob = this.response;
            var dp = new DPlayer({
                 container: document.getElementById('dplayer'),//播放器容器元素
                 theme: '#FADFA3', //控件的顏色
                 loop: false,//視頻循環(huán)播放
                    screenshot: true,//開啟截圖漆弄,如果開啟睦裳,視頻和視頻封面需要允許跨域
                    hotkey: true,//開啟熱鍵,支持快進(jìn)撼唾、快退廉邑、音量控制、播放暫停
                    lang: 'zh-cn',//可選值: 'en', 'zh-cn', 'zh-tw'
                    volume: 0.7,//默認(rèn)音量倒谷,請注意播放器會記憶用戶設(shè)置蛛蒙,用戶手動設(shè)置音量后默認(rèn)音量即失效
                    video: {
                        url: URL.createObjectURL(blob),//視頻鏈接
                        pic: '',//封面
                        type: 'hls',//'auto'可選值: 'auto', 'hls', 'flv', 'dash', 'webtorrent', 'normal' 或其他自定義類型
                    }
                });
        }
    }
    xhr.send();

使用Blob加密.m3u8類型的流媒體文件

這個方面內(nèi)容我查了很久的資料都沒有相關(guān)的內(nèi)容,在使用dplayer播放器情況下如果按照上面的那個方案使用blob將.m3u8文件進(jìn)行加密渤愁,會出現(xiàn)一個問題:前端在請求.ts切片文件的時候的請求地址的前面會加上<kbd>blob:</kbd>導(dǎo)致請求錯誤404牵祟,然后我一直陷入一個誤區(qū):為什么非要將.m3u8文件使用Blob進(jìn)行加密隱藏。 可以將請求.m3u8的地址進(jìn)行隱藏猴伶,這樣可以達(dá)到一樣的目的课舍,這是我的一個思路,如果大家有更好的思路可以評論出來他挎,讓我學(xué)習(xí)一下。

將Bolb文件轉(zhuǎn)成字符串

var reader = new FileReader();
  reader.onload = function(event){
    var content = reader.result;//內(nèi)容就在這里
  };
  reader.readAsText(blob);

將上面的內(nèi)容整合一下就可以實現(xiàn)使用blob隱藏.m3u8的地址捡需,達(dá)到和使用blob隱藏普通視頻格式一樣的效果办桨。

//創(chuàng)建XMLHttpRequest對象
    var xhr = new XMLHttpRequest();
    //配置請求方式、請求地址以及是否同步
    xhr.open('GET', '/test03', true);
    console.log("請求")
    //設(shè)置請求結(jié)果類型為blob
    xhr.responseType = 'blob';

    xhr.onload = function(e){
        if (this.status == 200 ){
            //獲取blob對象
            var blob = this.response;

            var reader = new FileReader();
            reader.onload = function (event) {
                var content = reader.result;//獲取Blob的內(nèi)容
                var dp = new DPlayer({
                    container: document.getElementById('dplayer'),//播放器容器元素
                    theme: '#FADFA3', //控件的顏色
                    loop: false,//視頻循環(huán)播放
                    screenshot: true,//開啟截圖站辉,如果開啟呢撞,視頻和視頻封面需要允許跨域
                    hotkey: true,//開啟熱鍵,支持快進(jìn)饰剥、快退殊霞、音量控制、播放暫停
                    lang: 'zh-cn',//可選值: 'en', 'zh-cn', 'zh-tw'
                    volume: 0.7,//默認(rèn)音量汰蓉,請注意播放器會記憶用戶設(shè)置绷蹲,用戶手動設(shè)置音量后默認(rèn)音量即失效
                    video: {
                        url: content,//視頻鏈接
                        pic: '',//封面
                        type: 'hls',//'auto'可選值: 'auto', 'hls', 'flv', 'dash', 'webtorrent', 'normal' 或其他自定義類型
                    }
                });
               
            }
            reader.readAsText(blob);
        }
    }
    xhr.send();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子祝钢,更是在濱河造成了極大的恐慌比规,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拦英,死亡現(xiàn)場離奇詭異蜒什,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)疤估,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門灾常,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铃拇,你說我怎么就攤上這事岗憋。” “怎么了锚贱?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵仔戈,是天一觀的道長。 經(jīng)常有香客問我拧廊,道長监徘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任吧碾,我火速辦了婚禮凰盔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘倦春。我一直安慰自己户敬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布睁本。 她就那樣靜靜地躺著尿庐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呢堰。 梳的紋絲不亂的頭發(fā)上抄瑟,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音枉疼,去河邊找鬼皮假。 笑死,一個胖子當(dāng)著我的面吹牛骂维,可吹牛的內(nèi)容都是我干的惹资。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼航闺,長吁一口氣:“原來是場噩夢啊……” “哼褪测!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤汰扭,失蹤者是張志新(化名)和其女友劉穎稠肘,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萝毛,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡项阴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了笆包。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片环揽。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖庵佣,靈堂內(nèi)的尸體忽然破棺而出歉胶,到底是詐尸還是另有隱情,我是刑警寧澤巴粪,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布通今,位于F島的核電站,受9級特大地震影響肛根,放射性物質(zhì)發(fā)生泄漏辫塌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一派哲、第九天 我趴在偏房一處隱蔽的房頂上張望臼氨。 院中可真熱鬧,春花似錦芭届、人聲如沸储矩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽持隧。三九已至,卻和暖如春树叽,著一層夾襖步出監(jiān)牢的瞬間舆蝴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工题诵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人层皱。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓性锭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親叫胖。 傳聞我的和親對象是個殘疾皇子草冈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350