Hi,大家好,我是姜友華。
接下來的幾節,我們將一起來實現一個直播系統。直播協議我選擇了WebRTC。為什么要選擇WebRTC呢?我也不知道,可能是我比較喜歡Google公司吧。
項目對應的代碼放在git.hub上。按進程提交,有興趣可以看看。同時也可以看看下面系列文件:
- Go的WebRTC庫接口
- Go的WebSocket庫接口
- Javascript的WebRTC庫接口
- Javascript的WebSockets庫接口
- Swift的WebRTC的原生實現
- Swift的WebSockets庫接口
主要內容:
- 本案直播體系中我們需要實現哪些內容?
- 搭建本地的HTTPS服務。
我們要做哪些工作?
雖然我說的是實現一個直播系統,但其實我們的工作并不多,我們只需要分步驟做到以下幾點:
- 使用Go實現基于localhost的https請求。
- 使用WebSocket,實現peer to peer的信息發送。
- 使用WebRTC,實現peer to peer的音視頻與信息發送。
- 添加iOS端的參與。
- 實現房間的分發。
- 對直播播放的抖動進行處理。
- 對錄播視頻的美化進行處理。
由于我定的是使用WebRTC協議,那就意味著我們需要用到另外兩個協議:HTTPS、WebSocket。其中HTTPS是入口,而WebSocket的使用則需要有HTTPS支持;同時WebRTC要實現Peer to Peer等功能則需要WebSocket支持。
不說了那么多了,我們來看看工程的目錄結構。
> live
> server
> site
. go.mod
. main.go
> client
> live
上面列表中,無后綴的是目錄,有后綴的是文件。即我們建立了live工程,在工程里又創建了兩個目錄,分別用于服務端與客戶端。服務端是Go實現,使用go.mod來管理包;客戶端暫時只有iOS建立的live工程,如果后期有安卓工程將添加在該目錄下;網頁客戶端在服務目錄的site下。
啟用HTTP服務
一、生成Loaclhost的ssl證書。
在實現HTTPS服務前,我們需要通過Openssl生成Loaclhost證書:
$ openssl genrsa -out server.key 2048
Generating RSA private key, 2048 bit long modulus
.................+++
......+++
e is 65537 (0x10001)
$ openssl req -new -x509 -key server.key -out server.crt -days 365
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:
State or Province Name (full name) []:
Locality Name (eg, city) []:
Organization Name (eg, company) []:
Organizational Unit Name (eg, section) []:
Common Name (eg, fully qualified host name) []:localhost
Email Address []:jingo1997@163.com
$ ls
go.mod site main.go server.crt server.key
$ pwd
/Users/jiangyouhua/code/system/live/server
上面的操作分四步:
- 生成server.key。
- 從server.key生成server.crt:注意Common Name需要填寫localhost,如是其它站點則填域名,如muutr.com。
- 查看要應文件是否成功生成。
- 獲取當前目錄路徑。
二、開啟HTTP服務
現在,我們可以使用Go來搭建史上最簡的服務器。也是這個特性讓我喜歡上了Go,并經常在示例中用它。
/// main.go
package main
import (
"log"
"net/http"
)
func main() {
keyFile := "/Users/jiangyouhua/code/system/live/server/server.key"
certFile := "/Users/jiangyouhua/code/system/live/server/server.crtt"
http.Handle("/", http.FileServer(http.Dir("./site/")))
if err := http.ListenAndServeTLS(":443", certFile, keyFile, nil); err != nil {
log.Fatalln(err)
}
}
main函數里:
- 第一行、第二行,指定的是剛生成的兩個證書。
- 第三行是所有http請求轉到當前目錄的site目錄下,且只能處理文件。
- 最后部分,啟用一個http監聽服務,監聽的接口是443.
三、測試HTTPS服務
在測試HTTPS服務之前,讓我們在site目錄下建一個index.html文件。
/// index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Live broadcast</title>
</head>
<body>
Live broadcast
</body>
</html>
建好后,現在運行main.go
$ go run main.go
不出意外的話,打開Chrome,輸入https://localhost回車,會顯示如下圖:
因為沒經第三方認證,所以Chrome不認我們生成的證書,從而拒絕顯示頁面內容。點擊下面Advanced按鈕,看有沒有一個叫“Proceed to localhost (unsafe)”的鏈接。沒有的話,那你需要安裝設置證書。
四、安裝、設置server.crt
安裝、設置證書,需要執行以下步驟:
- 雙擊server.crt。這樣server.crt會被安裝在KeyChain Access里,名字為localhost。
- 在KeyChain Access里,雙擊localhost。這會打開Info面板。
-
在Info面板里,設置trust值為:Always Trust。關閉面板,確認個性即可。
Screen Shot 2021-08-25 at 16.54.09.png
五、確認本地HTTPS可用。
現在再試試chrome。
- 刷新https://localhost/。
- 點擊Advanced,會示說明。
- 點擊說明里的Proceed to localhost (unsafe)。
即可顯示如下:
Live broadcast。
恭喜你,本地HTTPS可用。下一節,我們可以將進入Live Broadcastt的征途。
好,就到這里。我是姜友華,下一次,再見。