流媒体(Streaming Media)
在网络上将一连串的媒体数据压缩后,分段发送数据,使得数据包得像流水一样的发送,流式传输可以是现场影音或预存于服务器上的影片。
流媒体协议:rtsp、RTMP
RTSP (Real-Time Stream Protocol)
由Real Networks和Netscape共同提出的,基于文本的多媒体播放控制协议,RTSP定义流格式,流数据经由RTP传输,RTSP实时效果非常好,适合视频聊天,视频监控等方向。
RTMP(Real Time Message Protocol)
由Adobe公司提出,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问题,优势在于低延迟,稳定性高,支持所有摄像头格式,浏览器加载flash插件就可以直接播放。
rtmp协议&RTSP协议&HTTP协议
RTMP协议:RTMP协议是 Adobe 的私有协议,未完全公开,RTMP协议一般传输的是FLV,f4v格式流,RTMP一般在TCP 1个通道上传输命令和数据。
RTSP协议:RTSP协议是共有协议,并有专门机构做维护,RTSP协议一般传输的是 ts、mp4 格式的流,RTSP传输一般需要2-3个通道,命令和数据通道分离。
HTTP协议:是共有协议,HTTP协议没有特定的传输流,HTTP传输一般需要2-3个通道,命令和数据通道分离。
RTSP协议RTSP分为服务器与客户端,RTSP协议定义了服务器-客户端之间的接口,主要有:OPTIONS,DESCRIBE,SETUP,PLAY,TEARDOWN,RECOED,ANNOUNCE。RTSP并不包括具体数据的传输,该功能一般由RTP与RTCP协议来实现,并可以通过TCP或UDP两种底层传输方式进行。
RTSP基本交互过程
OPTIONS
C—>S
客户端向服务器端发送OPTIONS,请求可用的方法。
S—>C
服务器端回复客户端,消息中包含当前可用的方法。
DESCRIBE
C—>S
客户端向服务器请求媒体描述文件,一般通过rtsp开头的url来发起请求,格式为sdp。
S—>C
服务器回复客户端sdp文件,该文件告诉客户端服务器有哪些音视频流,有什么属性,如编解码器信息,帧率等。
SETUP
C—>S
客户端向服务器端发起建立连接请求,请求建立会话连接,准备开始接收音视频数据,请求信息描述了期望音视频数据包基于UDP还是TCP传输,指定了RTP,RTCP端口,以及是单播还是组播等信息!
S—>C
服务器端收到客户端请求后,根据客户端请求的端口号确定发送控制数据的端口以及音视频数据的端口!
PLAY
C—>S
客户端向服务端请求播放媒体。
S—>C
服务器回复客户端200 OK! 之后开始通过SETUP中指定的端口开始发送数据。
TEARDOWN
C---->S
结束播放的时候,客户端向服务器端发起结束请求。
S—>C
服务端收到消息后,向客户端发送200 OK,之后断开连接。
流媒体服务流媒体服务&直播服务
直播服务普遍采用了RTMP作为流媒体协议,FLV作为封装格式,H.264作为视频编码格式,AAC作为音频编码格式,FLV是RTMP使用的封装格式,H.264是实际应用中编码效率最高的视频编码标准,AAC则是当今实际应用中编码效率最高的音频编码标准。
librtmp是RTMP协议的实现,可以使用librtmp来实现协议的解析和数据的收发,服务器可以基于nginx rtmp实现,客户端方面采用librtmp负责推流,FFmpeg负责编码,收看客户端采用VLC播放器,VLC本身就可以解析RTMP流,又可以解析编码后的视频数据。
EasyDarwin——开源流媒体服务器
EasyDarwin开源流媒体服务器(www.easydarwin.org),go语言实现,支持推流(或者拉流 )的同时进行了本地存储。
本地存储的实现原理是,在推流的同时启动ffmpeg作为一路Client来做存储,ffmpeg在demux和mux的工作方面十分成熟。
,