為SRS流媒體伺服器新增HLS加密功能(附原始碼)
為SRS流媒體伺服器新增HLS加密功能(附原始碼)
之前測試使用過nginx的HLS加密功能,會使用到一個叫做nginx-rtmp-module的外掛,但此外掛很久不更新了,網上搜尋到一箇中國製造的叫做SRS的流媒體伺服器,比較活躍,而且據說這個流媒體伺服器的效能和功能都強大不少,但遺憾的是沒有HLS加密功能。問原作者為什麼沒有新增這個功能沒有回覆,所以還是自己動手,豐衣足食吧,花了幾個晚上的時間自己參考nginx-rtmp實現了一下。程式碼放到了github上。
功能介紹
幾個新新增的引數配置項
hls_keys on;
hls_fragments_per_key 4;
hls_key_file [app]/[stream]-[seq].key;
hls_key_file_path ./objs/nginx/html;
hls_key_url http://localhost:8080/live/h265.m3u8;
分別代表如下含義:
- hls_keys: 是否開啟hls加密,預設關閉。
- hls_fragments_per_key: 每個key可以加密多少個ts片段,預設值是10。
- hls_key_file: key檔案相對路徑的生成模板,包括一個[app]資料夾以及名字[stream]-[seq],字尾為.key,預設值為[app]/[stream]-[seq].key。
- hls_key_file_path: 可以為key檔案的生成指定本地目錄,預設為hls_path(存放ts的目錄)。
- hls_key_url: 可以為key指定一個HTTP url。
實現過程中的幾個關鍵點
需要實現的功能點包括一下幾個方面:
從配置檔案讀取配置項
這個仿照srs的實現新增,比較簡單。
key和iv的自動生成和儲存
在這裡每隔hls_fragments_per_key個ts會自動的生成隨機的16bytes的key和iv。key會儲存在hls_key_file_path路徑中,iv會儲存在m3u8檔案中。
在程式碼實現中,key和iv在記憶體中儲存了三份。SrsHlsMuxer中儲存了一份,用於提供每次new SrsHlsSegment時需要的key和iv。因為每次重新整理m3u8(refresh_m3u8)時,都要從頭重新生成一次m3u8檔案,所以需要為每個SrsHlsSegment物件備份一份iv。最後是傳遞給writer的key和iv,用於AES128加密。
AES128加密
材料都準備好了,最後的關鍵問題就是加密。在這裡使用了Openssl的加密庫,SRS的實現是每次寫一個packet(188bytes),而AES128需要加密的raw資料是16的倍數,因此需要在原有SrsFileWriter的實現上加一層緩衝。緩衝到16的倍數後(也就是188*4),加密一次資料,然後寫到檔案中。具體實現是下面的樣子:
srs_error_t SrsEncFileWriter::write(void* buf, size_t count, ssize_t* pnwrite)
{
srs_assert(count == SRS_TS_PACKET_SIZE);
srs_error_t err = srs_success;
if(buflength != HLS_AES_ENCRYPT_BLOCK_LENGTH)
{
memcpy(tmpbuf+buflength,(char*)buf,SRS_TS_PACKET_SIZE);
buflength += SRS_TS_PACKET_SIZE;
}
if(buflength == HLS_AES_ENCRYPT_BLOCK_LENGTH)
{
unsigned char encryptedbuf[HLS_AES_ENCRYPT_BLOCK_LENGTH];
memset(encryptedbuf,0,HLS_AES_ENCRYPT_BLOCK_LENGTH);
AES_cbc_encrypt((unsigned char *)tmpbuf, (unsigned char *)encryptedbuf, HLS_AES_ENCRYPT_BLOCK_LENGTH, &key, iv, AES_ENCRYPT);
buflength = 0;
memset(tmpbuf,0,HLS_AES_ENCRYPT_BLOCK_LENGTH);
return SrsFileWriter::write(encryptedbuf,HLS_AES_ENCRYPT_BLOCK_LENGTH,pnwrite);
}
else
{
return err;
}
};
需要注意的是每次close TS檔案的FD時需要判斷緩衝中有沒有資料,如果有的話需要新增填充資料(新增到正好為16的倍數即可),然後加密,寫檔案,關閉檔案:
int addBytes = 16 - buflength % 16;
memset(tmpbuf + buflength, addBytes, addBytes);
unsigned char encryptedbuf[buflength+addBytes];
測試
能夠為HLS TS切片正常加密和播放。沒有做充分的測試,對SRS瞭解的還不夠深入。如果大家需要這個功能的話,可以嘗試著使用一下,遇到問題聯絡我。
如何使用
首先,在配置檔案中新增以下配置項。
http_server {
enabled on;
listen 8080;
dir ./objs/nginx/html;
}
vhost __defaultVhost__ {
hls {
enabled on;
hls_fragment 10;
hls_window 600000;
hls_path ./objs/nginx/html;
hls_m3u8_file [app]/[stream].m3u8;
hls_ts_file [app]/[stream]-[seq].ts;
hls_keys on;
hls_fragments_per_key 4;
hls_key_file [app]/[stream]-[seq].key;
hls_key_file_path ./objs/nginx/html;
hls_key_url http://localhost:8080/live;
}
然後到trunk目錄下啟動:
./objs/srs -c conf/hls.conf
推送rtmp流的命令:
ffmpeg -re -i /Users/zexu/Movies/test.mp4 -c copy -f flv rtmp://localhost:1935/live/h265
最後在播放器中播放URL:
http://localhost:8080/live/h265.m3u8
關於配置項要注意的地方
關於hls_key_file_path和hls_key_url,要麼都不配置(註釋掉即可),這樣的話m3u8,ts和key檔案都在一個目錄下面。要麼就都配置,需要自己保證兩個地址能夠對上。否則會出現key找不到而導致播放失敗的問題。
作者:
HarlanC
部落格地址:
http://www.cnblogs.com/harlanc/
個人部落格:
http://www.harlancn.me/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出,
原文連結
如果覺的博主寫的可以,收到您的贊會是很大的動力,如果您覺的不好,您可以投反對票,但麻煩您留言寫下問題在哪裡,這樣才能共同進步。謝謝!
相關文章
- 基於 SRS+NG 搭建 HLS 直播流媒體伺服器伺服器
- [SRS流媒體]RTMP/HLS 直播伺服器simple-rtmp-server安裝伺服器Server
- docker 中使用原始碼方式搭建 SRS 流媒體服務Docker原始碼
- nginx上搭建HLS流媒體伺服器Nginx伺服器
- 基於SRS搭建RTMP直播流媒體伺服器伺服器
- 媒體轉碼HLS標準加密詳解加密
- 流媒體加密加密
- 淺析 HLS 流媒體協議協議
- SRS系列二——初步實現HLS直播
- JMeter流媒體線上播放HLS外掛BlazeMeter - HLS Plugin實現視訊線上播放壓測JMeterPlugin
- 什麼是流媒體伺服器?伺服器
- 用VLC做流媒體伺服器伺服器
- nginx+ffmpeg搭建流媒體伺服器(直播流)Nginx伺服器
- Golang開源流媒體伺服器(RTMP/RTSP/HLS/FLV等協議)Golang伺服器協議
- 直播流媒體伺服器解決方案伺服器
- 1.RTMP流媒體伺服器搭建伺服器
- vlc簡單搭建流媒體伺服器伺服器
- 流媒體軟體系統可實現哪些功能IPTV?
- 從Chrome原始碼看audio/video流媒體實現二Chrome原始碼IDE
- 直播帶貨app原始碼,關於流媒體技術的那些事APP原始碼
- 使用Nginx搭建rtmp流媒體伺服器筆記Nginx伺服器筆記
- 使用ffmpeg推送視訊流至流媒體伺服器(c語言)伺服器C語言
- 樹莓派實用RED5搭建流媒體伺服器實現點播功能樹莓派伺服器
- NodeJS stream 流 原理分析(附原始碼)NodeJS原始碼
- .NET gRPC 核心功能初體驗,附Demo原始碼RPC原始碼
- 流媒體技術基礎-流媒體傳輸協議(二)協議
- 流媒體伺服器與影片伺服器有什麼區別?伺服器
- CD 從抓軌到搭建流媒體伺服器 —— 以《月臨寐鄉》為例伺服器
- 點量流媒體伺服器系統釋出啦伺服器
- 2022年Q3美國流媒體新增訂戶份額(附原資料表)
- 2022年Q2美國流媒體新增訂戶份額(附原資料表)
- 【知識分享】流媒體儲存伺服器有哪些要求伺服器
- 搭建一個點播跟直播流媒體伺服器玩玩伺服器
- 直播帶貨app原始碼,不得不瞭解的流媒體傳輸協議APP原始碼協議
- 【教程】原始碼加密、防洩密軟體原始碼加密
- 一個.Net開發的功能強大、易於使用的流媒體伺服器和管理系統伺服器
- Giraph原始碼分析(七)—— 新增訊息統計功能原始碼
- 主流流媒體的綜合效能大 PK ( smart_rtmpd, srs, zlm, nginx rtmp )Nginx