QT-FFmpeg-系列-4

十八、RTMP 流媒体播放过程

本文描述了从打开一个 RTMP 流媒体到视音频数据开始播放的全过程。注意:RTMP 中的逻辑结构
RTMP 协议规定,播放一个流媒体有两个前提步骤: 第一步,建立一个网络连接(NetConnection); 第二步,建立一个网络流(NetStream)。

其中,网络连接代表服务器端应用程序和客户端之间基础的连通关系。 网络流代表了发送多媒体数据的通道。
服务器和客户端之间只能建立一个网络连接,但是基于该连接可以创建很多网络流。 他们的关系如图所示:

1简要介绍

播放一个 RTMP 协议的流媒体需要经过以下几个步骤:握手,建立连接,建立流,播放。
RTMP 连接都是以握手作为开始的。
建立连接阶段用于建立客户端与服务器之间的“网络连接”;建立流阶段用于建立客户 端与服务器之间的“网络流”;播放阶段用于传输视音频数据。

2握手(HandShake)

一个 RTMP 连接以握手开始,双方分别发送大小固定的三个数据块

a)握手开始于客户端发送 C0、C1 块。服务器收到 C0 或 C1 后发送 S0 和 S1。
b)当客户端收齐 S0 和 S1 后,开始发送 C2。当服务器收齐 C0 和 C1 后,开始发送 S2。
c)当客户端和服务器分别收到 S2 和 C2 后,握手完成。

握手

3建立网络连接(NetConnection)

a)客户端发送命令消息中的“连接”(connect)到服务器,请求与一个服务应用实例建立连接。

b)服务器接收到连接命令消息后,发送确认窗口大小(Window Acknowledgement Size)协议消息到客户端,同时连接到连接命令中提到的应用程序。

c)服务器发送设置带宽()协议消息到客户端。

d)客户端处理设置带宽协议消息后,发送确认窗口大小(Window Acknowledgement Size)协议消息到服务器端。

e)服务器发送用户控制消息中的“流开始”(Stream Begin)消息到客户端。

服务器发送命令消息中的“结果”(_result),通知客户端连接的状态。

建立连接

4建立网络流(NetStream)

a)客户端发送命令消息中的“创建流”(createStream)命令到服务器端。

b)服务器端接收到“创建流”命令后,发送命令消息中的“结果”(_result),通知客户端流的状态。

建立流

Rtsp: Options Describe Setup Play Pause Teardown

5播放(Play)

a)客户端发送命令消息中的“播放”(play)命令到服务器。 b)接收到播放命令后,服务器发送设置块大小(ChunkSize)协议消息。

十九、HTTP-FLV 讲解

传统的直播协议要么使用 Adobe 的基于 TCP 的 RTMP 协议,要么使用 Apple 的基于

HTTP 的 HLS 协议。

今天我要向大家介绍另外一种结合了 RTMP 的低延时,以及可以复用现有 HTTP 分发资源的流式协议 HTTP-FLV

二十、HTTP-FLV 简介

HTTP-FLV,即将音视频数据封装成 FLV,然后通过 HTTP 协议传输给客户端。
HLS 其实是一个 “文本协议”,而并非流媒体协议,(ts0,ts1,…)。那么,什么样的协议才能称之为流媒体协议呢?
流(stream): 数据在网络上按时间先后次序传输和播放的连续音/视频数据流。之所以
可以按照顺序传输和播放连续是因为在类似 RTMP、FLV 协议中,每一个音视频数据都被封装成了包含时间戳信息头的数据包。而当播放器拿到这些数据包解包的时候能够根据时间戳 信息把这些音视频数据和之前到达的音视频数据连续起来播放。
MP4、MKV 等等类似这种封装,必须拿到完整的音视频文件才能播放,因为里面的单个音视频数据块不带有时间戳信息,播放器不能将这些没有时间戳信息数据块连续起来,所 以就不能实时的解码播放。

直播 http-flv,之前用的是 rtmp 和 hls。为什么使用 http-flv,它有什么优缺点? 怎么让流媒体服务器支持 flv 直播?

一、市场上哪家直播使用了 http-flv:

通过抓包分析: 优酷的 pc 网页直播使用了 http-flv。斗鱼、熊猫 tv、虎牙 pc 网页上的也使用了 http-flv。

二、http-flv、rtmp 和 hls 直播的优缺点:

A、三者的延迟性:
http-flv:低延迟,内容延迟可以做到 2-5 秒。
Rtmp:低延迟,内容延迟可以做到 2-5 秒。
Hls: 延迟较高(ts0,segment-time:5,10s)。

B、三者的易用性: rtmp 和 http-flv:播放端安装率高。只要浏览器支持 FlashPlayer 就能非常简易的播放。

hls:最大的优点:HTML5 可以直接打开播放;这个意味着可以把一个直播链接通过微信等转发分享,不需要安装任何独立的 APP,有浏览器即可。

C、rtmp 和 http-flv 比较:
(1)穿墙:很多防火墙会墙掉 RTMP,但是不会墙 HTTP,因此 HTTP FLV 出现奇怪问题的概率很小。
(2)调度:RTMP 也有个 302,可惜是播放器 as 中支持的,HTTP FLV 流就支持 302 方便 CDN
纠正 DNS 的错误。
(3)容错:SRS 的 HTTP FLV 回源时可以回多个,和 RTMP 一样,可以支持多级热备。
(4)简单:FLV 是最简单的流媒体封装,HTTP 是最广泛的协议,这两个组合在一起维护性更高,比 RTMP 简单多了。

events {
worker_connections 1024;
}

添加 RTMP 服务

rtmp {
server {
listen 1935; # 监听端口

chunk_size 4000; application live { live on;
gop_cache on; hls on;
hls_path html/hls;
}
}
}

HTTP 服务

http {
include mime.types; default_type application/octet-stream;
#access_log logs/access.log main; server {
listen 8080; # 监听端口

location /flv {
flv_live on; chunked_transfer_encoding on;
}

location /stat.xsl { root html;
}
location /stat {
rtmp_stat all; rtmp_stat_stylesheet stat.xsl;
}
location / {
root html;
}

3.ffmpeg 推流

ffmpeg -re -i ande10.mp4 -vcodec libx264 -acodec aac -f flv -y rtmp://127.0.0.1:1935/live/test1

4.vlc 播放

http-flv:http://localhost:8080/flv?port=1935&app=live&stream=test1 rtmp:rtmp://127.0.0.1:1935/live/test1
Hls: http://localhost:8080/hls/test1.m3u8

5.flv.js 网页播放

跨域问题:#http-flv
location /flv {
flv_live 1935 app=live;
add_header ‘Access-Control-Allow-Origin’ ''; add_header “Access-Control-Allow-Credentials” “true”; add_header “Access-Control-Allow-Methods” "";
add_header “Access-Control-Allow-Headers” “Content-Type,Access-Token”; add_header “Access-Control-Expose-Headers” “*”;
}

Nginx.conf 内容如下:

worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#error_log logs/error.log debug;

注意这个大小关系:

PreviosTagSize = TagDataSize + 11;
2、FLV 格式解析

先 来 一 张 图 , 这 是 《 东 风 破 》 — — 周 杰 伦 ( 下 载 ) 的 一 个 MV 视 频 。
header

头部分由一下几部分组成

Signature(3 Byte)+Version(1 Byte)+Flags(1 Bypte)+DataOffset(4 Byte)
header

头部分由一下几部分组成

Signature(3 Byte)+Version(1 Byte)+Flags(1 Bypte)+DataOffset(4 Byte)
Char TagType;//8:auido, 9:video, 18(0x12):scripts Char TagDataSize[3];
Char Timestamp[3]; Char TimeStampEx[1]; Char StreamId[3]; Char * buf;
};

type 1 个字节。8 为 Audio,9 为 Video,18 为 scripts
tag data size 3 个字节。表示 tag data 的长度:从 streamd id 后算起。
Timestreamp 3 个字节。时间戳
TimestampExtended 1 个字节。时间戳扩展字段
stream id 3 个字节。总是 0
tag data 数据部分

FLV Adobe 官方标准
FLV 文件格式标准是写在 F4V/FLV file format spec v10.1 的附录 E 里面的 FLV File
Format。

单位说明
FLV 文件头和文件体 (E.2, E.3)

从整个文件上看,FLV = FLV File Header + FLV File Body。
通常,FLV 的前 13 个字节(flv header + PreviousTagSize0)完全相同,所以,程序中会单独定义一个常量来指定。特殊,比如有的视频文件没有视频流或没有音频流

FLV Tag (E.4)
Timestamp 和 TimestampExtended 组成了这个 TAG 包数据的 PTS 信息,PTS = Timestamp | TimestampExtended << 24。
AudioTagHeader 的第一个字节,也就是接跟着 StreamID 的 1 个字节包含了音频类型, 采样率等的基本信息。

AudioTagHeader 之后跟着的就是 AUDIODATA 部分了。但是,这里有个特例,如果音频格式(SoundFormat)是 AAC,AudioTagHeader 中会多出 1 个字节的数据
AACPacketType,这个字段来表示 AACAUDIODATA 的类型:0 = AAC sequence header, 1 = AAC raw。
AudioSpecificConfig 结构描述非常复杂,在标准文档中是用伪代码描述的,这里先假定要编码的音频格式,做一下简化。

音频编码为:AAC-LC,音频采样率为 44100。
在 FLV 的文件中,一般情况下 AAC sequence header 这种包只出现 1 次,而且是第一个audio tag,为什么需要这种 tag,因为在做 FLV demux 的时候,如果是 AAC 的音频, 需要在每帧 AAC ES 流前边添加 7 个字节 ADST 头,ADST 是解码器通用的格式,也就是说 AAC 的纯 ES 流要打包成 ADST 格式的 AAC 文件,解码器才能正常播放。就是在打包 ADST 的时候,需要 samplingFrequencyIndex 这个信息,
samplingFrequencyIndex 最准确的信息是在 AudioSpecificConfig 中,这样,你就完全可以把 FLV 文件中的音频信息及数据提取出来,送给音频解码器正常播放了。

VideoTag (E.4.3)

由于 AVC(H.264) 编码的特殊性,这里着重说明了 AVC(H.264) 编码的 Tag 格式。

VideoTagHeader 的第一个字节,也就是接跟着 StreamID 的 1 个字节包含着视频帧类型及视频 CodecID 等最基本信息。
VideoTagHeader 之后跟着的就是 VIDEODATA 部分了。但是,这里有个特例,如果视频格式(CodecID)是 AVC,VideoTagHeader 会多出 4 个字节的信息。
AVCDecoderConfigurationRecord 包含着是 H.264 解码相关比较重要的 SPS 和 PPS 信息,在给 AVC 解码器送数据流之前一定要把 SPS 和 PPS 信息送出,否则的话,解码器不能正常解码。而且在解码器 stop 之后再次 start 之前,如 seek,快进快退状态切换等,都需要重新送一遍 SPS 和 PPS 的信息。AVCDecoderConfigurationRecord 在
FLV 文件中一般情况也只出现 1 次,也就是第一个 video tag。

AVCDecoderConfigurationRecord 长度为 sizeof(UI8) * (11 + sps_size + pps_size)。

SCRIPTDATA (E.4.4)
ScriptTagBody 内容用 AMF 编码
一个 SCRIPTDATAVALUE 记录包含一个有类型的 ActionScript 值。

onMetadata (E.5)

FLV metadata object 保存在 SCRIPTDATA 中, 叫 onMetaData。不同的软件生成的
FLV 的 properties 不同。
keyframes 索引信息

官方的文档中并没有对 keyframes index 做描述,但是,flv 的这种结构每个 tag 又不像 TS 有同步头,如果没有 keyframes index 的话,需要按顺序读取每一个 tag, seek 及快进快退的效果会非常差。后来在做 flv 文件合成的时候,发现网上有的 flv 文件将
keyframes 信息隐藏在 Script Tag 中。

keyframes 几乎是一个非官方的标准, 也就是民间标准。两个常用的操作 metadata 的工具是 flvtool2 和 FLVMDI,都是把 keyframes 作为一个默认的元信息项目。在 FLVMDI 的主页上有描述:
也就是说 keyframes 中包含着 2 个内容 “filepositions” 和 “times”分别指的是关键帧的文件位置和关键帧的 PTS。通过 keyframes 可以建立起自己的 Index,然后在 seek 和快进快退的操作中,快速有效地跳转到你想要找的关键帧位置进行处理。

二十一、WEBRTC 讲解

WebRTC 简介

WebRTC,名称源自网页实时通信(Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音通话或视频聊天的技术,是谷歌 2010 年以 6820 万美元收购Global IP Solutions 公司而获得的一项技术。

WebRTC 提供了实时音视频的核心技术,包括音视频的采集、编解码、网络传输、显示等功能,并且还支持跨平台:windows,linux,mac,android。

虽然 WebRTC 的目标是实现跨平台的 Web 端实时音视频通讯,但因为核心层代码的
Native、高品质和内聚性,开发者很容易进行除 Web 平台外的移殖和应用。很长一段时间内
WebRTC 是业界能免费得到的唯一高品质实时音视频通讯技术。

WebRTC 是一项在浏览器内部进行实时视频和音频通信的技术,是谷歌于 2010 年以

6820 万美元收购 VoIP 软件开发商 Global IT Solutions 公司而获得一项技术,谷歌于 2011 年
6月 3 日开源该项目。

谷歌在官方博客中称:“我们希望让浏览器成为实时通信的创新地所在,到目前为止, 实时通信需要使用受版权保护的信号处理技术,并通过插件或下载客户端才能实现,而
WebRTC 则允许开发人员使用 HTML 和 JavaScript API 来创建实时应用。”

谷歌还称:“为此我们将与 Mozilla 和 Opera 等浏览器厂商密切合作,以便让更广泛的Web 社区来部署这项技术。此外,我们还将与 IETF 和 W3C 工作组等标准机构合作,以定义一套实时通信标准。”

1.webrtc 是什么
浏览器为音视频获取传输提供的接口

2.webrtc 可以做什么
浏览器端到端的进行音视频聊天、直播、内容传输

3.数据传输需要些什么IP、端口、协议
客户端、服务端

4.SDP 协议

sdp 协议:SDP 信息相当于 PC 的名片 主要是协商两个端点在传输数据的时候一些配置数据格式:keyi=value

SDP 协商利用的是里请求和响应这两个模型(offer、answer),Offerer 发给 Answerer 的请求消息称为请求 offer,内容包括媒体流类型、各个媒体流使用的编码集,以及将要用于接收媒体流的 IP 和端口。
Answerer 收到 offer 之后,回复给 Offerer 的消息称为响应,内容包括要使用的媒体编码,是否接收该媒体流以及告诉 Offerer 其用于接收媒体流的 IP 和端口。

在 WebRTC 连接流程中,在创建 PeerConnectionA 后,就会去创建一个 offerSDP,并设置为
localSDP。通过 signaling 发送 PeerB。 peerB 收到 peerA 的 SDP 后,把收到的 SDP 设置为
RemoteSDP。在设置完成后,PeerB 再生成 AnswerSDP,设置为 localSDP,通过 signaling 通道发送给 PeerA,PeerA 收到后 AnswerSDP 后,设置为 RemoteSDP,以上流程完成了 SDP 的交换。

5.STUN
允许应用程序发现自己和公网之间的中间件类型,
同时也能允许应用程序发现自己被 NAT 分配的公网 IP,从而替代位于应用层中的私网地址,

达到 NAT 穿透的目的

6.TURN
通过修改应用层中的私网地址达到 NAT 穿透
也是解决内网穿透的,这里是 stun 不能工作的时候采取的办法相当于一个中转器即 peerA->TURN-PeerB

7.ICE
交互式连接的建立
把 STUN 和 TURN 结合在一起的一个标准叫 ICE(不是协议,是整合了 STUN,TURN 的框架)。利用 STUN 和 TURN 为连接提供正确的路由,然后寻找一系列双方可用地址按顺序测试地址, 直到找到双方都可用的组合。

二十二、WebRTC 整体架构

1.绿色部分是 WebRTC 核心部分(核心库)

2.紫色部分是 JS 提供的 API(应用层) 整体是应用层调用核心层。

核心层,第一层 C++ API
提供给外面的接口。最主要的是(PeerConnedtion 对等连接)。核心层,第二层 Session

上下文管理层(音视频)。
核心层,第三层[最重要的部分]
音视频引擎 :编解码;音频缓冲 BUFFER 防止音频网络抖动 NetEQ;回音消除;降噪;静音检测;
视频引擎 :编解码;jitter buffer 防止视频网络抖动;图像处理增强; 传输:SRTP 加密后的 RTP;多路复用;P2P(STUN+TURN+ICE)
核心层,第四层 ,硬件相关层音视频采集; 网络 IO

二十三、WebRTC 功能模块

WebRTC 实现了基于网页的视频会议,标准是 WHATWG 协议,目的是通过浏览器提供简单的 javascript 就可以达到实时通讯(Real-Time Communications (RTC))能力。
WebRTC(Web Real-Time Communication)项目的最终目的主要是让 Web 开发者能够基于浏览器(Chrome/FireFox/…)轻易快捷开发出丰富的实时多媒体应用,而无需下载安装任 何插件,Web 开发者也无需关注多媒体的数字信号处理过程,只需编写简单的 Javascript 程序即可实现,W3C 等组织正在制定 Javascript 标准 API,目前是 WebRTC 1.0 版本,Draft 状态;另外 WebRTC 还希望能够建立一个多互联网浏览器间健壮的实时通信的平台,形成开发者与浏览器厂商良好的生态环境。同时,Google 也希望和致力于让 WebRTC 的技术成为HTML5 标准之一,可见 Google 布局之深远。
WebRTC 提供了视频会议的核心技术,包括音视频的采集、编解码、网络传输、显示等功能,并且还支持跨平台:windows,linux,mac,android。

音视频行业,WebRTC 在近几年对音视频实时通讯这个行业带来的颠覆是显而易见的, Google 用他自己的魅力+实力征服了很多开发者,小编也是其中之一啦。但是跟随这项技术这么长时间来,他带给我们的确实可以说是行业内顶尖的技术,不说多,一个音频的回声消除,就能显示出真正的技术?

WebRTC 提供了视频会议的核心技术,包括音视频的采集、编解码、网络传输、显示等功能,并且还支持跨平台:windows,linux,mac,android, iOS 等。
WebRTC 中的任何的一个技术点都可以拿出来列一个专栏进行讨论,这里我们只能简单粗暴的罗列一下。

视频相关

视频采集—video_capture

源代码在 webrtc\modules\video_capture\main 目录下,包含接口和各个平台的源代码。

在 windows 平台上,WebRTC 采用的是 dshow 技术,来实现枚举视频的设备信息和视频数据的采集,这意味着可以支持大多数的视频采集设备;对那些需要单独驱动程序的视频采集卡(比如海康高清卡)就无能为力了。

视频采集支持多种媒体类型,比如 I420、YUY2、RGB、UYUY 等,并可以进行帧大小和帧率控制。

视频编解码—video_coding
源代码在 webrtc\modules\video_coding 目录下。

WebRTC 采用 I420/VP8 编解码技术。VP8 是 google 收购 ON2 后的开源实现,并且也用在
WebM 项目中。VP8 能以更少的数据提供更高质量的视频,特别适合视频会议这样的需求。

视频加密–video_engine_encryption
视频加密是 WebRTC 的 video_engine 一部分,相当于视频应用层面的功能,给点对点的视频双方提供了数据上的安全保证,可以防止在 Web 上视频数据的泄漏。

视频加密在发送端和接收端进行加解密视频数据,密钥由视频双方协商,代价是会影响视频数据处理的性能;也可以不使用视频加密功能,这样在性能上会好些。

视频加密的数据源可能是原始的数据流,也可能是编码后的数据流。估计是编码后的数据流,这样加密代价会小一些,需要进一步研究。

视频媒体文件–media_file
源代码在 webrtc\modules\media_file 目录下。

该功能是可以用本地文件作为视频源,有点类似虚拟摄像头的功能;支持的格式有 Avi。另外,WebRTC 还可以录制音视频到本地文件,比较实用的功能。
视频图像处理–video_processing
源代码在 webrtc\modules\video_processing 目录下。

视频图像处理针对每一帧的图像进行处理,包括明暗度检测、颜色增强、降噪处理等功能,用来提升视频质量。

视频显示–video_render
源代码在 webrtc\modules\video_render 目录下。

在 windows 平台,WebRTC 采用 direct3d9 和 directdraw 的方式来显示视频,只能这样, 必须这样。

网络传输与流控
对于网络视频来讲,数据的传输与控制是核心价值。WebRTC 采用的是成熟的 RTP/RTCP
技术。

音频相关

WebRTC 的音频部分,包含设备、编解码(iLIBC/iSAC/G722/PCM16/RED/AVT、NetEQ)、加密、声音文件、声音处理、声音输出、音量控制、音视频同步、网络传输与流控(RTP/RTCP)等功能。

音频设备—audio_device
源代码在 webrtc\modules\audio_device\main 目录下,包含接口和各个平台的源代码。在 windows 平台上,WebRTC 采用的是 Windows Core Audio 和 Windows Wave 技术来管理
音频设备,还提供了一个混音管理器。
利用音频设备,可以实现声音输出,音量控制等功能。

音频编解码—audio_coding
源代码在 webrtc\modules\audio_coding 目录下。
WebRTC 采用 iLIBC/iSAC/G722/PCM16/RED/AVT 编解码技术。
WebRTC 还提供 NetEQ 功能—抖动缓冲器及丢包补偿模块,能够提高音质,并把延迟减至最小。
另外一个核心功能是基于语音会议的混音处理。声音加密–voice_engine_encryption
和视频一样,WebRTC 也提供声音加密功能。

声音文件
该功能是可以用本地文件作为音频源,支持的格式有 Pcm 和 Wav。同样,WebRTC 也可以录制音频到本地文件。

声音处理–audio_processing
源代码在 webrtc\modules\audio_processing 目录下。
声音处理针对音频数据进行处理,包括回声消除(AEC)、AECM(AEC Mobile)、自动增益
(AGC)、降噪(NS)、静音检测(VAD)处理等功能,用来提升声音质量。

网络传输与流控
和视频一样,WebRTC 采用的是成熟的 RTP/RTCP 技术。

二十四、WebRTC 的影响和前景

WebRTC 技术的快速普及将对现有的很多领域产生巨大的影响。
首先,受到影响的是现有的 VoIP 业务领域。目前我们正在经历一个硬件多样化的时代, 比如可穿戴设备的兴起。这将促进适应新型设备的操作系统的涌现和加大现有操作系统的分化。因此,操作系统的异构性和繁杂性使得 VoIP 应用的开发、更新与维护的复杂性和成本剧增。随着 WebRTC 集成到浏览器中,基于 Web 的实时通信应用可以通过 HTML 标签和JavaScript API 实现快速的开发,并避免了由于操作系统的异构性带来的重复开发和由于版本升级带来的维护费用以及不便。这将导致现有的应用开发人员从现有的基于浏览器插件或者原生 VoIP 应用模式转向使用 WebRTC 进行 Web 应用开发,进而使得现有的 VoIP 应用的普通用户向基于浏览器的 Web 应用的迁移。目前,涉及 VoIP 业务的客服以及在线教育领域很关注 WebRTC 技术在自身领域的应用。

其次,现有的 IM 应用通过其拥有的大量用户,并通过构建在这些 IM 应用上的衍生应用形成生态圈。这些 IM 应用及其所形成的生态圈正在试图取代浏览器成为互联网入口。这种现象在移动智能终端表现的更加突出。然而,如上文所述,WebRTC 技术的部署和使用将呈现爆炸式的增长,这将导致 IM 应用向 IM Web 应用的转变和用户向 IM Web 应用的迁移。因此,构建在现有 IM 应用的生态圈将被打破。现有的 IM 应用及其生态圈必将做出相应的布局调整以适应新的技术环境。

同时,WebRTC 的普及将给企业带来监管和安全问题。目前,有些公司在公司内部封锁了 IM 应用(比如 QQ,Skype)的端口,以防止员工在工作过程中由于对音视频工具的不慎使用所造成的安全问题。基于 WebRTC 的新型 IM Web 应用,与正常的 Web 页面无异,所以很难检测该种 IM Web 应用。这给企业的监管和安全造成了巨大的隐患。

其次,智能电视的展现形式和业务模式将受到巨大的影响。目前,智能电视主要包括智能操作系统以及显示设备。在智能电视上的主要业务也主要是对多媒体源的直播和点播。随着 WebRTC 的普及和涌现大量的 IM Web 应用,智能电视将很可能原生的包含摄像头设备。同时,视频会议业务也将像现在的对多媒体源的直播和点播业务一样,成为智能电视的主要业务。

其次,所上文所述,由于 WebRTC 所支持的音视频格式的局限,以及 WebRTC 在多人视频会话中采用的可选网状结构的限制(目前是 6 人)。新型的服务供应商将产生。这些供应商主要提供 1)不同视频编解码的转换;2)在多人会话中,视频流的整合与广播。目前, 服务供应商及其产品有:Dialogic 推出的 PowerMedia XMS 2.1 和英特尔推出的 Collaboration Service for WebRTC。

最后,集成了 WebRTC 的 Web 浏览器将进一步改变传统的应用、Web 浏览器和操作系统的格局。Web 浏览器将成为介于操作系统与 Web 应用的一个平台。为 Web 操作系统的普及进一步铺平道路。包含了 WebRTC 的浏览器将进一步巩固其互联网入口的地位——近些年,超级应用(例如微信)通过其拥有的大量用户和在其上的开发的衍生应用试图成为互联 网入口。Web 浏览器及其 Web 应用将成为一种生态圈。高性能浏览器的研发将成为下一个竞争热点。而浏览器的安全问题将更加凸显。

二十五、WEBRTC 调用本地摄像头

1、概述

WebRTC 是“网络实时通信”(Web Real Time Communication)的缩写,它主要用来让浏览器实时获取和交换视频、音频和数据。
Ffmpeg :
ffmpeg -list_devices true -f dshow -i dummy

ffplay -f dshow -i video=“USB2.0 PC CAMERA”

WebRTC 共分三个 API:
MediaStream(又称 getUserMedia) RTCPeerConnection
RTCDataChannel
getUserMedia 主要用于获取视频和音频信息,后两个 API 用于浏览器之间的数据交换。

2、getUserMedia

2.1简介
首先,检查浏览器是否支持 getUserMedia 方法。

navigator.getUserMedia ||
(navigator.getUserMedia = navigator.mozGetUserMedia || navigator.webkitGetUserMedia
|| navigator.msGetUserMedia);

if (navigator.getUserMedia) {
//do something
} else {
console.log(‘your browser not support getUserMedia’);
}
Chrome21 、 Opera 18 和 Firefox 17 支 持 该 方 法 , 目 前 IE 还 不 支 持 , 上 面 代 码 中 的
msGetUserMedia 只是为了确保将来的兼容。

getUserMedia 方法接受三个参数。

getUserMedia(streams, success, error);
含义如下:

streams:表示包括哪些多媒体设备的对象success:回调函数,获取多媒体设备成功时调用
error:回调函数,获取多媒体设备失败时调用 用法如下:

navigator.getUserMedia({ video: true,
audio: true
}, onSuccess, onError);
上面的代码用来获取摄像头和麦克风的实时信息。

如果网页使用了 getUserMedia,浏览器就会询问用户,是否许可提供信息。如果用户拒绝, 就调用回调函数 onError。

发生错误时,回调函数的参数是一个 Error 对象,它有一个 code 参数,取值如下:

PERMISSION_DENIED:用户拒绝提供信息。
NOT_SUPPORTED_ERROR:浏览器不支持指定的媒体类型。
MANDATORY_UNSATISHIED_ERROR:指定的媒体类型未收到媒体流。

2.2展示摄像头图像
将用户的摄像头拍摄的图像展示在网页上,需要先在网页上放置一个 video 元素。图像就展示在这个元素中。


然后,用代码获取这个元素。

function onSuccess(stream) {

var video = document.getElementById(‘webcam’);

//more code
}
最后,将这个元素的 src 属性绑定数据流,摄像头拍摄的图像就可以显示了。

function onSuccess(stream) {
var video = document.getElementById(‘webcam’); if (window.URL) {
video.src = window.URL.createObjectURL(stream);
} else {
video.src = stream;
}


video.autoplay = true;
//or video.play();
}
它的主要用途是让用户使用摄像头为自己拍照。

Html 与 js 代码:

Document
开始 停止

二十六、流媒体开源库简介

live555 简介

Live555 是一个为流媒体提供解决方案的跨平台的 C++开源项目,它实现了对标准流媒体传输协议如 RTP/RTCP、RTSP、SIP 等的支持。
Live555 实现了对多种音视频编码格式的音视频数据的流化、接收和处理等支持,包括
MPEG、H.263+、DV、JPEG 视频和多种音频编码。
同时由于良好的设计,Live555 非常容易扩展对其他格式的支持。
目前,Live555 已经被用于多款播放器的流媒体播放功能的实现,如 VLC(VideoLan)、
MPlayer。

下载
live555 源码:http://www.live555.com/(官网)
下载地址: http://download.videolan.org/pub/contrib/live555/

该项目的源代码包括四个基本的库,各种测试代码以及 IVE555 Media Server。
四 个 基 本 的 库 分 别 是 UsageEnvironment&TaskScheduler , groupsock , liveMedia ,
BasicUsageEnvironment。

Live555 是一个为流媒体提供解决方案的跨平台的 C++开源项目,它实现了对标准流媒体传输协议如 RTP/RTCP、RTSP、SIP 等的支持。Live555 实现了对多种音视频编码格式的音视频数据的流化、接收和处理等支持,包括 MPEG、H.263+、DV、JPEG 视频和多种音频编码。同时由于良好的设计,Live555 非常容易扩展对其他格式的支持。目前,Live555 已经被用于多款播放器的流媒体播放功能的实现,如 VLC(VideoLan)、MPlayer。

LIVE555 媒体服务器”是完整的 RTSP 服务器应用程序。它可以流式传输几种媒体文件(必须存储在当前工作目录中,即从中启动应用程序的目录中或子目录中):

MPEG 传输流文件(文件名后缀“ .ts”)
甲的 Matroska 或 WebM 的文件(文件名为后缀“.MKV”或“.webm”) 一个奥格文件(文件名后缀“.OGG”,‘OGV’,或“.opus”)
MPEG-1 或 2 节目流文件(文件名后缀“ .mpg”)

MPEG-4 视频基本流文件(文件名后缀“ .m4e”)
H.264视频基本流文件(文件名后缀“ .264”)
H.265视频基本流文件(文件名后缀“ .265”)
一个 VOB 视频+音频文件(文件名后缀为“ .vob”) DV 视频文件(文件名后缀“ .dv”)
MPEG-1 或 2(包括第 III 层,即“ MP3”)音频文件(文件名后缀“ .mp3”)
WAV(PCM)音频文件(文件名后缀“ .wav”)
AMR 音频文件(文件名后缀“ .amr”) AC-3 音频文件(文件名后缀“ .ac3”)
AAC(ADTS 格式)音频文件(文件名后缀“ .aac”)

下载源码后解压得到 live 目录,目录结构如下,lib 目录是编译后产生的目录:

主要使用其中的四个目录,分别对应 Live555 的四个库:
UsageEnvironment 目录,生成的静态库为 libUsageEnvironment.lib,这个库主要包含一些基本数据结构以及工具类的定义

groupsock 目录,生成的静态库为 libgroupsock.lib,这个库主要包含网络相关类的定义和实现

liveMedia 目录,生成的静态库为 libliveMedia.lib,这个库包含了 Live555 核心功能的实

BasicUsageEnvironment 目录,生成的静态库为 libBasicUsageEnvironment.lib,这个库主要包含对 UsageEnvironment 库中一些类的实现

mediaServer 目 录 中 包 含 Live555 流 媒 体 服 务 器 的 标 准 示 例 程 序 , 运 行
live555MediaServer.exe 后出现如下界面:

在 mediaServer 目录中放入你的媒体文件,如 test.mp3,在 VLC 播放器中选择“媒体”-“打开网络串流”,然后输入 rtsp://127.0.0.1:8554/test.mp3 就可以播放刚才的 mp3 文件了。

proxyServer 目录中是 live555 实现的代理服务器的例子程序,这个程序可以从其他的流媒体服务器(如支持 RTSP 的摄像机)取实时的视频流然后转发给多个 RTSP 客户端,这个程序很有用,可以转发摄像机的实时视频流。

testProgs 目录中包含很多的测试例子程序,我经常用的是 testOnDemandRTSPServer.cpp, 我是从这个例子程序开始学习 Live555 的。

FFmpeg 简介

FFmpeg 到底是什么

简介

FFMPEG 难度比较大,却没有一个循序渐进,由简单到复杂的教程。
现在网上的有关 FFMPEG 的教程多半难度比较大,不太适合刚接触 FFMPEG 的人学习; 而且很多的例子程序编译通不过,极大地打消了学习的积极性。我自己在刚开始学习
FFMPEG 的时候也遇到了很大的困难。
为了帮助更多的人快速成为“大神”,我想总结一个学习 FFMPEG 的方法,方便大家循序渐进的学习 FFMPEG。

PS:有不少人不清楚“FFmpeg”应该怎么读。它读作“ef ef em peg”

FFmpeg 是什么

FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。
采用 LGPL 或 GPL 许可证。它提供了录制、转换以及流化音视频的完整解决方案。
FFmpeg 在 Linux 平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括
Windows、Mac OS X 等。
这个项目最早由 Fabrice Bellard 发起,2004 年至 2015 年间由 Michael Niedermayer 主要负责维护。许多 FFmpeg 的开发人员都来自 MPlayer 项目,而且当前 FFmpeg 也是放在MPlayer 项目组的服务器上。
项目的名称来自 MPEG 视频编码标准,前面的"FF"代表"Fast Forward"。

FFmpeg 的组成

构成 FFmpeg 主要有三个部分, 第一部分:工具
第一部分是四个作用不同的工具软件,分别是:ffmpeg.exe,ffplay.exe,ffserver.exe 和 ffprobe.exe。
ffmpeg.exe:音视频转码、转换器ffplay.exe:简单的音视频播放器ffserver.exe:流媒体服务器ffprobe.exe:简单的多媒体码流分析器

第二部分:SDK
第二部分是可以供开发者使用的 SDK,为各个不同平台编译完成的库。

如果说上面的四个工具软件都是完整成品形式的玩具,那么这些库就相当于乐高积木一 样,我们可以根据自己的需求使用这些库开发自己的应用程序。这些库有:
libavcodec:包含音视频编码器和解码器
libavutil:包含多媒体应用常用的简化编程的工具,如随机数生成器、数据结构、数学函数 等功能
libavformat:包含多种多媒体容器格式的封装、解封装工具
libavfilter:包含多媒体处理常用的滤镜功能 libavdevice:用于音视频数据采集和渲染等功能的设备相关
libswscale:用于图像缩放和色彩空间和像素格式转换功能
libswresample:用于音频重采样和格式转换等功能

第三部分:源码
第三部分是整个工程的源代码,无论是编译出来的可执行程序还是 SDK,都是由这些源代码编译出来的。
FFmpeg 的源代码由 C 语言实现,主要在 Linux 平台上进行开发。
FFmpeg 不是一个孤立的工程,它还存在多个依赖的第三方工程来增强它自身的功能。在当前这一系列的博文/视频中,我们暂时不会涉及太多源代码相关的内容,主要以
FFmpeg 的工具和 SDK 的调用为主。

FFmpeg 主要功能

多媒体视频处理工具 FFmpeg 有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。

视频采集功能
ffmpeg 视频采集功能非常强大,不仅可以采集视频采集卡或 USB 摄像头的图像,还可以进行屏幕录制,同时还支持以 RTP 方式将视频流传送给支持 RTSP 的流媒体服务器,支持直播应用。

视频格式转换功能

ffmpeg 视频转换功能。视频格式转换,比如可以将多种视频格式转换为 flv 格式,可不是视频信号转换 。
ffmpeg 可以轻易地实现多种视频格式之间的相互转换(wma,rm,avi,mod 等),例如可以将摄录下的视频 avi 等转成视频网站所采用的 flv 格式。

视频截图功能
对于选定的视频,截取指定时间的缩略图。
视频抓图,获取静态图和动态图,不提倡抓 gif 文件;因为抓出的 gif 文件大而播放不流畅。

给视频加水印功能
使用 ffmpeg 视频添加水印(logo)。

FFmpeg 八大库

1.libavutil
核心工具库,最基础模块之一,其他模块都会依赖该库做一些基本的音视频处理操作

2.libavformat
文件格式和协议库,封装了 Protocol 层和 Demuxer、Muxer 层,使得协议和格式对于开发者来说是透明的

3.libavcodec
编解码库,封装了 Codec 层,但是有一些 codec 是具备自己的 License 的,FFmpe 不会默认添加像 libx264、FDK-AAC、Lame 等库,但是 FFmpeg 是一个平台,可以将其他的第三方 codec 以插件的方式添加进来,为开发者提供统一接口

4.libavfilter
音视频滤镜库,该模块包含了音频特效和视频特效的处理,在使用 FFmpeg 的 API 进行编解码的过程中,可以使用该模块高效的为音视频数据做特效处理

5.libavdevice

输入输出设备库,比如需要编译出播放声音或者视频的工具 ffplay,就需要确保该模块是打开的,同事也需要 libsdl 的预先编译,该设备模块播放声音和视频都又是使用 libsdl 库

6.libswresample
用于音频重采样,可以对数字音频进行声道数、数据格式、采样率等多种基本信息的转

7.libswscale
该模块用于图像格式转换,可以将 YUV 的数据转换为 RGB 的数据

8.libpostproc
该模块用于进行后期处理,当我们使用 filter 的时候,需要打开这个模块,filter 会用到这个模块的一些基础函数

比较老的 ffmpeg 还会编译出 avresamle 模块,也是用于对音频原始出具进行重采样的, 但是已经被废弃,推荐使用 libswresample 替代
另外,库里还可以包含对 H.264/MPEG-4 AVC 视频编码的 X264 库,是最常用的有损视频编码器,支持 CBR、VBR 模式,可以在编码的过程中直接改变码率的设置,在直播的场景中非常适用!可以做码率自适应的功能

FFmpeg 搭建环境及初步体验

FFmpeg 下载&安装 (Windows 版本)

下载编译好的 Windows 版本:http://ffmpeg.zeranoe.com/builds/

视频中的地址已经无法打开,我将 ffmepg4.3.1 的开发包和源码上传
到了百度云:
链接:https://pan.baidu.com/s/1-3xSO6ytyQLlSId0Xiak4w 提取码:fyxy

FFmpeg 分为 3 个版本:Static、 Shared、 Dev

前两个版本可以直接在命令行中使用,包含了三个 exe:ffmpeg.exe,ffplay.exe,ffprobe.exe
Static 版本中的 exe 体积较大,那是因为相关的 Dll 都已经编译进 exe 里面去了。
Shared 版本中 exe 的体积相对小很多,是因为它们运行的时候还需要到相关的 dll 中调用相应的功能
Dev 版本用于开发,里面包含了库文件 xxx.lib 以及头文件 xxx.h
将下载好的 static 版本,解压到 d:\ffmpeg

添加环境变量(win10):右键 我的电脑 ——》属性——》高级系统设置——》环境变量, 添加路径 d:\ffmpeg\bin

FFmpeg 命令行的使用

ffmpeg.exe
用于转码的应用程序:
一个简单的转码命令 将 input.avi 转码成 output.ts,并设置视频的码率为 640kbps ffmpeg -i input.avi -b:v 640k output.ts

ffplay.exe
主要用于播放的应用程序
ffplay test.avi

ffprobe.exe
ffprobe 是用于查看文件格式的应用程序。
ffprobe test.mp4

二十七、VLC 简介

VLC 播放器简介
1、VLC 播放器
VLC 支持多种常见音视频格式,支持多种流媒体传输协议,也可当做本地流媒体服务器使用,功能十分强大。
官网下载地址:https://www.videolan.org/
VLC 多媒体播放器(最初命名为 VideoLAN 客户端)是 VideoLAN 计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持 DVD 影音光盘,VCD 影音光盘及各类流

式协议。它也能作为 unicast 或 multicast 的流式服务器在 IPv4 或 IPv6 的高速网络连接下使用。它融合了 FFmpeg 计划的解码器与 libdvdcss 程序库使其有播放多媒体文件及加密
DVD 影碟的功能。

2、VLC media player

VLC 是一款自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,以及
DVD、音频 CD、VCD 及各类流媒体协议。
VLC 的全名是 Video Lan Client,是一个开源的、跨平台的视频播放器。
VLC 支持大量的音视频传输、封装和编码格式,下面给出一个简要的不完整的列表:
操作系统:Windows、WinCE、Linux、MacOSX、BEOS、BSD
访问形式:文件、DVD/VCD/CD、http、ftp、mms、TCP、UDP、RTP、IP 组播、IPv6、rtsp
编码格式:MPEG*、DIVX、WMV、MOV、3GP、FLV、H.263、H.264、FLAC
视频字幕:DVD、DVB、Text、Vobsub
视频输出:DirectX、X11、XVideo、SDL、FrameBuffer、ASCII
控制界面:WxWidgets、QT4、Web、Telnet、Command line
浏览器插件:ActiveX、Mozilla(firefox)

3、VLC 打开网络串流

http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8

4、VLC 系统支持

VLC 支持以下操作系统,下载的时候请选择你的系统。
Windows
Mac OS X
iOS
GNU/Linux
Debian GNU/Linux
Ubuntu
openSUSE
Gentoo Linux
Fedora
Arch Linux
Slackware Linux
Mandriva Linux
ALT Linux
Red Hat Enterprise LinuxOther OS
FreeBSD
NetBSD
OpenBSD
Solaris
Android

5、VLC 作为流媒体服务器

VLC 的功能很强大,它不仅仅是一个视频播放器,也可作为小型的视频服务器,更可以一边播放一边转码,把视频流发送到网络上。

二十八、EasyDarwin 简介

https://github.com/EasyDarwin/EasyDarwin https://github.com/EasyDarwin/EasyDarwin/releases

EasyDarwin 开源流媒体服务器

主要功能特点

基于 Golang 开发维护;
支持 Windows、Linux、macOS 平台; 支持 RTSP 推流分发(推模式转发); 支持 RTSP 拉流分发(拉模式转发);
服务端录像 参考:https://blog.csdn.net/jyt0551/article/details/84189498
服务端录像检索与回放 参考:https://blog.csdn.net/jyt0551/article/details/84189498 关键帧缓存;
秒开画面;
Web 后台管理; 分布式负载均衡;

安装部署

下载解压 release 包直接运行(Windows)
EasyDarwin.exe
以 Ctrl + C 停止服务
easydarwin-8.0.0-1804031316
@penggy penggy released this on 3 Apr 2018 · 112 commits to master since this release
Node 版本第一个 release
登录界面默认用户名 admin, 密码 123456
支持 TCP, UDP 传输模式

以服务启动(Windows)
ServiceInstall-EasyDarwin.exe

以 ServiceUninstall-EasyDarwin.exe 卸载 EasyDarwin 服务直接运行(Linux/macOS)
cd EasyDarwin
./easydarwin

Ctrl + C

以服务启动(Linux/macOS)

cd EasyDarwin
./start.sh

./stop.sh

查看界面

打开浏览器输入 http://localhost:10008, 进入控制页面,默认用户名密码是 admin/admin

测试推流

ffmpeg -re -i ande10.mp4 -rtsp_transport tcp -vcodec libx264 -acodec aac -f rtsp rtsp://localhost/test1
Rtsp:控制信息Rtp/rtcp:udp/tcp

测试播放

Vlc:打开网络串流
ffplay -rtsp_transport tcp rtsp://localhost/test1 ffplay rtsp://localhost/test1

二十九、NGINX-RTMP 简介

https://github.com/arut/nginx-rtmp-module NGINX-based Media Streaming Server
nginx-rtmp-module Project blog
http://nginx-rtmp.blogspot.com

Wiki manual
https://github.com/arut/nginx-rtmp-module/wiki/Directives

Google group https://groups.google.com/group/nginx-rtmp
https://groups.google.com/group/nginx-rtmp-ru (Russian) Donation page (Paypal etc)
http://arut.github.com/nginx-rtmp-module/

Features
RTMP/HLS/MPEG-DASH live streaming

RTMP Video on demand FLV/MP4, playing from local filesystem or HTTP Stream relay support for distributed streaming: push & pull models Recording streams in multiple FLVs
H264/AAC support

Online transcoding with FFmpeg

HTTP callbacks (publish/play/record/update etc)

Running external programs on certain events (exec)

HTTP control module for recording audio/video and dropping clients

Advanced buffering techniques to keep memory allocations at a minimum level for faster streaming and low memory footprint

Proved to work with Wirecast, FMS, Wowza, JWPlayer, FlowPlayer, StrobeMediaPlayback, ffmpeg, avconv, rtmpdump, flvstreamer and many more

Statistics in XML/XSL in machine- & human- readable form Linux/FreeBSD/MacOS/Windows

三十、SRS 简介

SRS(Simple Realtime Server)

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

Remark: Although SRS is licenced under MIT, but there are some depended libraries which are distributed using their own licenses, please read License Mixing.

Usage

Step 1: Get SRS.

git clone https://gitee.com/winlinvip/srs.oschina.git srs &&
cd srs/trunk && git remote set-url origin https://github.com/ossrs/srs.git && git pull
Note: We use mirrors(gitee) here, but it’s also ok to directly clone by git clone https://github.com/ossrs/srs.git && cd srs/trunk

Step 2: Build SRS.

./configure && make
Remark: Recommend to use Centos7 64bits, please read wiki(CN,EN). Note: You can also build SRS in docker, please read docker.

Step 3: Run SRS

./objs/srs -c conf/srs.conf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许毅宏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值