内容简介:使用flv.js做直播
在介绍flv.js之前先介绍下常见的直播协议以及给出我对它们的延迟与性能所做的测试得出的数据。
常见直播协议
-
RTMP: 底层基于
TCP
,在浏览器端依赖Flash。 -
HTTP-FLV: 基于
HTTP
流式IO传输FLV,依赖浏览器支持播放FLV。 -
WebSocket-FLV: 基于
WebSocket
传输FLV,依赖浏览器支持播放FLV。WebSocket
建立在HTTP
之上,建立WebSocket
连接前还要先建立HTTP
连接。 -
HLS: Http Live Streaming,苹果提出基于
HTTP
的流媒体传输协议。HTML5
可以直接打开播放。 -
RTP: 基于
UDP
,延迟1秒,浏览器不支持。
常见直播协议延迟与性能数据
以下数据只做对比参考
传输协议 | 播放器 | 延迟 | 内存 | CPU |
---|---|---|---|---|
RTMP | Flash | 1s | 430M | 11% |
HTTP-FLV | Video | 1s | 310M | 4.4% |
HLS | Video | 20 | 205M | 3% |
在支持浏览器的协议里,延迟 排序 是:
RTMP = HTTP-FLV = WebSocket-FLV < HLS
而性能排序恰好相反:
RTMP > HTTP-FLV = WebSocket-FLV > HLS
也就是说延迟小的性能不好。
可以看出在浏览器里做直播,使用HTTP-FLV协议是不错的,性能优于RTMP+Flash,延迟可以做到和RTMP+Flash一样甚至更好。
flv.js 简介
flv.js是来自Bilibli的开源项目。它解析FLV文件喂给原生HTML5 Video标签播放音视频数据,使浏览器在不借助Flash的情况下播放FLV成为可能。
flv.js 优势
-
由于浏览器对原生Video标签采用了硬件加速,性能很好,支持高清。
-
同时支持录播和直播
-
去掉对Flash的依赖
flv.js 限制
-
FLV里所包含的视频编码必须是
H.264
,音频编码必须是AAC
或MP3
, IE11和Edge浏览器不支持MP3音频编码,所以FLV里采用的编码最好是H.264+AAC,这个让音视频服务兼容不是问题。 -
对于录播,依赖
原生HTML5 Video标签
和 Media Source Extensions API -
对于直播,依赖录播所需要的播放技术,同时依赖
HTTP FLV
或者WebSocket
中的一种协议来传输FLV。其中HTTP FLV
需通过流式IO去拉取数据,支持流式IO的有 fetch 或者 stream -
flv.min.js
文件大小 164Kb,gzip后 35.5Kb,flash播放器gzip后差不多也是这么大。 -
由于依赖
Media Source Extensions
,目前所有iOS和Android4.4.4以下里的浏览器都不支持,也就是说目前对于移动端flv.js基本是不能用的。
flv.js依赖的浏览器特性兼容列表
flv.js 原理
flv.js只做了一件事,在获取到FLV格式的音视频数据后通过原生的JS去解码FLV数据,再通过 Media Source Extensions API 喂给原生HTML5 Video标签。(HTML5 原生仅支持播放 mp4/webm 格式,不支持 FLV)
flv.js 为什么要绕一圈,从服务器获取FLV再解码转换后再喂给Video标签呢?原因如下:
-
兼容目前的直播方案:目前大多数直播方案的音视频服务都是采用FLV容器格式传输音视频数据。
-
FLV容器格式相比于MP4格式更加简单,解析起来更快更方便。
flv.js兼容方案
由于目前flv.js兼容性还不是很好,要用在产品中必要要兼顾到不支持flv.js的浏览器。兼容方案如下:
PC端
-
优先使用 HTTP-FLV,因为它延迟小,性能也不差1080P都很流畅。
-
不支持 flv.js 就使用 Flash播放器播 RTMP 流。Flash兼容性很好,但是性能差默认被很多浏览器禁用。
-
不想用Flash兼容也可以用HLS,但是PC端只有Safari支持HLS
移动端
-
优先使用 HTTP-FLV,因为它延迟小,支持HTTP-FLV的设备性能运行 flv.js 足够了。
-
不支持 flv.js 就使用 HLS,但是 HLS延迟非常大。
-
HLS 也不支持就没法直播了,因为移动端都不支持Flash。
flv.js实战
说了这么多介绍与原理,接下来教大家如何用flv.js搭建一个完整的直播系统。
我已经搭建好了 一个demo 可以供大家体验。
搭建音视频服务
主播推流到音视频服务,音视频服务再转发给所有连接的客户端。为了让你快速搭建服务推荐我用 go 语言实现的 livego ,因为它可以运行在任何操作系统上。
-
下载livego ,注意选对你的操作系统和位数。
-
解压,执行
livego
,服务就启动好了。它会启动RTMP(1935端口)服务用于主播推流,以及HTTP-FLV(7001端口)服务用于播放。
实现播放页
在react体系里使用react flv.js 组件 reflv 快速实现。
先安装 npm i reflv
,再写代码:
import React, { PureComponent } from 'react'; import Reflv from 'reflv'; export class HttpFlv extends PureComponent { render() { return ( <Reflv url={`http://localhost:7001/live/test.flv`} type="flv" isLive cors /> ) } }
让以上代码在浏览器里运行。这是你还看不到直播,是因为还没有主播推流。
-
你可以使用 OBS 来推流,注意要配置好OBS:
<img width="961" alt="screen shot 2017-06-07 at 5 41 32 pm" src=" https://user-images.githubuse...
-
也可以使用 ffmpeg 来推流,推流命令
ffmpeg -f avfoundation -i "0" -vcodec h264 -acodec aac -f flv rtmp://localhost/live/test
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 使用开源的SRS 搭建一个直播服务
- 工具 | 字节跳动开源的,直播中台使用的一个视频动画特效 SDK
- 使用Go基于WebSocket构建千万级视频直播弹幕系统
- 网络爬虫直播观看总结(掘金直播第十期)
- 一文盘点直播技术中的编解码、直播协议、网络传输与简单实现
- 一文盘点直播技术中的编解码、直播协议、网络传输与简单实现
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Head First Web Design
Ethan Watrall、Jeff Siarto / O’Reilly Media, Inc. / 2009-01-02 / USD 49.99
Want to know how to make your pages look beautiful, communicate your message effectively, guide visitors through your website with ease, and get everything approved by the accessibility and usability ......一起来看看 《Head First Web Design》 这本书的介绍吧!