从零实现直播:开始之前

Hi,大家好,我是姜友华。
接下来的几节,我们将一起来实现一个直播系统。直播协议我选择了WebRTC。为什么要选择WebRTC呢?我也不知道,可能是我比较喜欢Google公司吧。

项目对应的代码放在git.hub上。按进程提交,有兴趣可以看看。同时也可以看看下面系列文件:

  1. Go的WebRTC库接口
  2. Go的WebSocket库接口
  3. Javascript的WebRTC库接口
  4. Javascript的WebSockets库接口
  5. Swift的WebRTC的原生实现
  6. Swift的WebSockets库接口

主要内容:

  • 本案直播体系中我们需要实现哪些内容?
  • 搭建本地的HTTPS服务。

我们要做哪些工作?

虽然我说的是实现一个直播系统,但其实我们的工作并不多,我们只需要分步骤做到以下几点:

  1. 使用Go实现基于localhost的https请求。
  2. 使用WebSocket,实现peer to peer的信息发送。
  3. 使用WebRTC,实现peer to peer的音视频与信息发送。
  4. 添加iOS端的参与。
  5. 实现房间的分发。
  6. 对直播播放的抖动进行处理。
  7. 对录播视频的美化进行处理。

由于我定的是使用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 []:[email protected]

$ ls
go.mod          site            main.go         server.crt      server.key

$ pwd
/Users/jiangyouhua/code/system/live/server

上面的操作分四步:

  1. 生成server.key。
  2. 从server.key生成server.crt:注意Common Name需要填写localhost,如是其它站点则填域名,如muutr.com。
  3. 查看要应文件是否成功生成。
  4. 获取当前目录路径。

二、开启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函数里:

  1. 第一行、第二行,指定的是刚生成的两个证书。
  2. 第三行是所有http请求转到当前目录的site目录下,且只能处理文件。
  3. 最后部分,启用一个http监听服务,监听的接口是443.

三、测试HTTPS服务

在测试HTTPS服务之前,让我们在site目录下建一个index.html文件。

/// index.html



    
    Live broadcast


    Live broadcast


建好后,现在运行main.go

$ go run main.go

不出意外的话,打开Chrome,输入https://localhost回车,会显示如下图:

Screen Shot 2021-08-25 at 16.57.24.png

因为没经第三方认证,所以Chrome不认我们生成的证书,从而拒绝显示页面内容。点击下面Advanced按钮,看有没有一个叫“Proceed to localhost (unsafe)”的链接。没有的话,那你需要安装设置证书。

四、安装、设置server.crt

安装、设置证书,需要执行以下步骤:

  1. 双击server.crt。这样server.crt会被安装在KeyChain Access里,名字为localhost。
  2. 在KeyChain Access里,双击localhost。这会打开Info面板。
  3. 在Info面板里,设置trust值为:Always Trust。关闭面板,确认个性即可。


    Screen Shot 2021-08-25 at 16.54.09.png

五、确认本地HTTPS可用。

现在再试试chrome。

  1. 刷新https://localhost/。
  2. 点击Advanced,会示说明。
  3. 点击说明里的Proceed to localhost (unsafe)。
    即可显示如下:
    Live broadcast。

恭喜你,本地HTTPS可用。下一节,我们可以将进入Live Broadcastt的征途。

好,就到这里。我是姜友华,下一次,再见。

你可能感兴趣的:(从零实现直播:开始之前)