點(diǎn)擊關(guān)注“八戒技術(shù)團(tuán)隊”,閱讀更多技術(shù)干貨
短視頻目前在互聯(lián)網(wǎng)上非?;鸨?,因為視頻比文字更能清晰的表達(dá)創(chuàng)作的內(nèi)容,大家每天都可能在刷抖音、B站的視頻。作為開發(fā)人員,不管是否從事音視頻開發(fā),都應(yīng)該了解一下相關(guān)的技術(shù)。
一、基礎(chǔ)概念
首先給大家介紹視頻的三個基礎(chǔ)概念:
1.幀數(shù)
在一秒內(nèi)播放的幀數(shù)就是每秒幀數(shù)率。
視頻標(biāo)準(zhǔn)幀率:24幀
2.分辨率
視頻圖像在一個單位尺寸內(nèi)的精密度。
常見分辨率:1280*720
3.碼率
數(shù)據(jù)傳輸時單位時間傳送的數(shù)據(jù)位數(shù),單位:kbps。
碼率和質(zhì)量成正比,但是文件體積也和碼率成正比。
二、視頻格式
視頻格式實質(zhì)是視頻編碼方式,可以大致分為兩種大類:
一、適合本地播放的本地影像視頻(從網(wǎng)上下載的視頻如:MP4)
如上圖,這是一個常見的MP4格式視頻,有很多視頻的基礎(chǔ)信息。MP4、AVI、MKV等都是本地視頻文件的后綴,是一種包含視頻各種信息的封裝格式,可以理解為一種打包,把所有的視頻數(shù)據(jù)和音軌封裝在一起。
二、適合在網(wǎng)絡(luò)中播放的網(wǎng)絡(luò)流媒體影像視頻(如B站上的視頻)
【視頻協(xié)議】是針對網(wǎng)絡(luò)流媒體而言的,也就是只有在有網(wǎng)絡(luò)時通過瀏覽器或者移動端APP才能看到的視頻,目前常見的協(xié)議有RTSP、RTMP、HLS、HTTP等。
一般來講,視頻流從加載到準(zhǔn)備播放是需要經(jīng)過解協(xié)議、解封裝、解編碼這樣的過程,其中協(xié)議指的就是流媒體協(xié)議;封裝指的是視頻的封裝格式;而編碼又分為視頻編碼和音頻編碼。
如果平臺上的視頻出于對版權(quán)的考慮,要進(jìn)行加密,一般是怎么處理的呢?
三、視頻BLOB加密
這種加密是在前端比較常見的一種加密方式,我們以B站上的一個視頻為例:
打開瀏覽器按下F12,可以看到視頻的資源地址是一串以 blob 開頭的地址,這跟我們常見的地址有些不一樣,而且如果你直接打開這個地址是無效的。
BLOB,它的全稱為big binary large object,譯為二進(jìn)制大對象。一般來說,首先由后端,比如 JAVA 將視頻轉(zhuǎn)換為blog對象傳給前端,前端在拿到blog對象后,再通過URL.createObjectURL生成臨時地址,賦值給video標(biāo)簽的src屬性,就可以實現(xiàn)這個效果了。前端的大致代碼如下:
四、視頻切片加密
我們知道看視頻的話是需要很大的流量的,對于絕大多數(shù)用戶來說,他們不一定會把視頻看完,如果是加載一個小視頻,那還沒有什么大問題,但如果是加載一個大視頻的話,這就會浪費(fèi)大量的流量,并且加載過程會持續(xù)占用帶寬。這個時候我們會用到視頻分片處理。
試想一下,如果我們把視頻切成一段一段的,每次只加載一段,看完了再加載一段,這樣能有效的節(jié)省資源。還是以B站的一個視頻為例,在F12中的Network里可以看到,網(wǎng)站一直在一段一段的請求視頻流的數(shù)據(jù)。(PS:這個m4s是HTML的一種格式)
切片加密原理:將視頻從MP4文件切片成多個ts文件,并使用AES-128對每一片視頻進(jìn)行加密,最后生成m3u8文件。這里我們需要用到ffmpeg。
1.生成公有key
openssl rand 16 > encrypt.key
2.生成私有key(16進(jìn)制)
openssl rand -hex 16
3.按照下面格式新建一個encrypt.keyinfo的文件
Key URI # enc.key的路徑,使用http形式
Path to key file # enc.key文件
Private key # 上面生成的16進(jìn)制的私有key
例如:
http://192.168.1.111:8090/encrypt.key
/home/Admin/encrypt.key
8b4c39c498949536f8d2af1f6fec7d39
4.用 ffmpeg 開始分片并加密
五、防盜鏈Referer
通過對視頻資源設(shè)置防盜鏈Referer,可以屏蔽非白名單內(nèi)的視頻資源下載。例如思博網(wǎng)的視頻我們都設(shè)置了防盜鏈:
HTTP referer 是 header 上的一個屬性。當(dāng)瀏覽器向服務(wù)器發(fā)起請求時,一般會帶上Referer,告訴服務(wù)器我是從哪個頁面鏈接過來的。打個比方,我們在后臺上傳一個視頻到七牛云,七牛云高級配置里有一個域名防盜鏈選項,我們可以在這里設(shè)置白名單和黑名單。
另外,七牛云還提供了私有空間,私有空間內(nèi)的文件對象都要獲得擁有者的授權(quán)才能進(jìn)行訪問,并且可以設(shè)置鏈接的有效時間,超過時長后自動失效(視頻會有緩存,清空緩存之前視頻仍然有效)。私有空間的特點(diǎn)是安全性更高,需要加token訪問,資源鏈接有時效性。
除了以上幾種策略外,還有視頻播放器加密、跑馬燈防盜錄等等。但是即使做了加密處理,也阻止不了錄屏。完全杜絕視頻泄露是很難的,或者我們可以采取其他方式加大盜用的成本。
目前市面上大致的視頻加密就是這幾種,當(dāng)然我們可以多個方案一起使用,使視頻加密的安全性更高。
希望以上內(nèi)容能對有需要的人有所幫助
歡迎大家一起探討交流
]]>