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的征途。
好,就到这里。我是姜友华,下一次,再见。
网友评论