从零实现直播:开始之前

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 []:jingo1997@163.com

$ 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
<!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回车,会显示如下图:

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的征途。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,492评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,048评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,927评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,293评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,309评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,024评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,638评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,546评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,073评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,188评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,321评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,998评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,678评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,186评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,303评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,663评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,330评论 2 358

推荐阅读更多精彩内容