srs ffmpeg flv.js相关概念

推流,指的是把采集阶段封包好的内容传输到服务器的过程。其实就是将现场的视频信号传到网络的过程。

https://github.com/ossrs/srs/wiki/v3_CN_SampleHttpFlv

https://github.com/ossrs/srs/wiki/v3_CN_DeliveryHttpStream#about-http-flv

https://github.com/ossrs/srs/wiki/v3_CN_SampleHttpFlvCluster

SRS

https://github.com/ossrs/srs

https://github.com/ossrs/srs/wiki/v1_CN_DeliveryRTMP

https://github.com/ossrs/srs/wiki/v1_CN_RTMP.PK.HTTP

SRS/3.0,OuXuli,是一个流媒体集群,支持RTMP/HLS/FLV,高效、稳定、易用,简单而快乐。
SRS is a RTMP/HLS/FLV streaming cluster, high efficiency, stable and simple.

flv.js

https://github.com/Bilibili/flv.js

An HTML5 Flash Video (FLV) Player written in pure JavaScript without Flash. LONG LIVE FLV!

This project relies on Media Source Extensions to work.

Overview

flv.js works by transmuxing FLV file stream into ISO BMFF (Fragmented MP4) segments, followed by feeding mp4 segments into an HTML5 <video> element through Media Source Extensions API.

flv.js is written in ECMAScript 6, transpiled into ECMAScript 5 by Babel Compiler, and bundled with Browserify.

Demo

http://bilibili.github.io/flv.js/demo/

Features

  • FLV container with H.264 + AAC / MP3 codec playback
  • Multipart segmented video playback
  • HTTP FLV low latency live stream playback
  • FLV over WebSocket live stream playback
  • Compatible with Chrome, FireFox, Safari 10, IE11 and Edge
  • Extremely low overhead, and hardware accelerated by your browser!

livego

https://github.com/gwuhaolin/livego

Simple and efficient live broadcast server:

  • Very simple to install and use;
  • Pure Golang, high performance, and cross-platform;
  • Supports commonly used transmission protocols, file formats, and encoding formats;

Supported transport protocols

  • RTMP
  • AMF
  • HLS
  • HTTP-FLV

Supported container formats

  • FLV
  • TS

Supported encoding formats

  • H264
  • AAC
  • MP3
    -----------

https://github.com/gwuhaolin/blog/issues/3

https://segmentfault.com/a/1190000009695424

常见直播协议

  • 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秒,浏览器不支持。

直播运行流程:

  1. 主播端在采集到一段时间的音视频原数据后,因为音视频原数据庞大需要先压缩数据:

    • 通过H264视频编码压缩数据数据
    • 通过PCM音频编码压缩音频AAC数据
  2. 压缩完后再通过FLV容器格式封装压缩后的数据,封装成一个FLV TAG

  3. 再把FLV TAG通过RTMP协议推流到音视频服务器,音视频服务器再从RTMP协议里解析出FLV TAG。

  4. 音视频服务器再通过HTTP协议通过和浏览器建立的长链接流式把FLV TAG传给浏览器。

  5. flv.js 获取FLV TAG后解析出压缩后的音视频数据喂给Video播放。

常见直播协议延迟与性能数据,以下数据只做对比参考

传输协议
播放器
延迟
内存
CPU
RTMP Flash 1s 430M 11%
HTTP-FLV Video 1s 310M 4.4%
HLS Video 20s 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,音频编码必须是AACMP3, 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标签呢?原因如下:

  1. 兼容目前的直播方案:目前大多数直播方案的音视频服务都是采用FLV容器格式传输音视频数据。

  2. FLV容器格式相比于MP4格式更加简单,解析起来更快更方便。

flv.js兼容方案

由于目前flv.js兼容性还不是很好,要用在产品中必要要兼顾到不支持flv.js的浏览器。兼容方案如下:

PC端

  1. 优先使用 HTTP-FLV,因为它延迟小,性能也不差1080P都很流畅。

  2. 不支持 flv.js 就使用 Flash播放器播 RTMP 流。Flash兼容性很好,但是性能差默认被很多浏览器禁用。

  3. 不想用Flash兼容也可以用HLS,但是PC端只有Safari支持HLS

移动端

  1. 优先使用 HTTP-FLV,因为它延迟小,支持HTTP-FLV的设备性能运行 flv.js 足够了。

  2. 不支持 flv.js 就使用 HLS,但是 HLS延迟非常大。

  3. HLS 也不支持就没法直播了,因为移动端都不支持Flash。

--------------------------------------------------------------------------

链接:https://www.jianshu.com/p/1b825ae84005

Flv.js 就是由 bilibili 网站开源的 HTML5 Flash 视频(FLV)播放器,纯原生 JavaScript 开发(ECMAScript 6 编写) ,没有用到 Flash。
它的工作原理是 Flv.js 在 JavaScript 中流式解析 flv 文件流,并实时转封装为 fmp4 ,通过 Media Source Extensions 喂给浏览器,实现了 FLV 格式视频的播放。

https://www.jianshu.com/p/d9c66d7d1653

-------------------------------------------------------

ffmpeg学习笔记:

https://www.jianshu.com/p/24045108dd8a
-----------------------------------------------------------

RTMP是一种常用的推流协议。一般用于推拉FLV的音视频数据。

当我们谈及RTMP的时候,有这么几种概念:

  • 一种“容器”,里面封装了音视频数据,是实时的流数据
  • 一个点播服务,可以有多个客户端同时观看一个RTMP地址的媒体
  • 一种推流方式,把本地的资源“广播”给客户端

当然,这些其实都是RTMP的东西,请看网络模型:

对于传输通路来说,这是一种“容器”;对于播放器而言,这是一个点播服务;对于媒体源而言,这是一种推流方式。

原理

RTMP基于TCP,默认使用端口1935,是一个应用层的协议。

协议具体内容,建议在网上找资料看,这里列个概要:

  • 连接需要3次握手
  • 基于消息通讯,但是消息可以被分块传输
  • 消息类型按用途可以简单划分为:协议控制消息、命令消息、数据消息
  • 命令对象有NetConnection和NetStream,通过NetConnection可以创建一个或多个的NetStream。NetStream用于传输音频、视频
  • 推流和拉流的本质区别是在NetStream上调用的命令不同。推流用push,拉流用play。

RTMP

RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。是Adobe公司开发的一个基于TCP的应用层协议,也就是说,RTMP是和HTTP/HTTPS一样,是应用层的一个协议族。RTMP在TCP通道上一般传输的是flv 格式流。请注意,RTMP是网络传输协议,而flv则是视频的封装格式。flv封装格式设计出来的目的是为了用于网络传输使用的,因此RTMP+FLV可以说是”黄金搭档“。

RTMP协议包括:基本协议及RTMPT/RTMPS/RTMPE等多种变种。从视频协议学习:推流拉流都擅长的 RTMP了解到,RTMP协议家族有以下几个点挺有趣,读者们不妨看看:

  1. RTMP工作在TCP之上,默认使用端口1935,这个是基本形态;
  2. RTMPE在RTMP的基础上增加了加密功能;
  3. RTMPT封装在HTTP请求之上,可穿透防火墙;
  4. RTMPS类似RTMPT,增加了TLS/SSL的安全功能;
  5. RTMFP使用UDP进行传输的RTMP;

RTMP就是专门针对多媒体数据流的实时通信设计出来的一种网络数据传输协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。

原文地址:https://www.cnblogs.com/scw2901/p/14853536.html