常用的推流协议有:
协议 | 内容 |
---|---|
RTP | 实时流传输协议,但不保证服务质量 |
RTCP | RTP数据流协议的一个姐妹协议,为RTP提供服务质量反馈 |
SRTP & SRTCP | RTP和RTCP的安全版本,提供数据加密、消息认证功能 |
RTSP | 控制声音或影像的多媒体数据串流协议 |
RTMP | ADOBE公司播放器与服务器之间多媒体数据传输的开放协议 |
HLS | 苹果公司实现的基于HTTP的流数据传输协议,边下载边播放 |
RTP
-
流数据具有数据量大、实时传输等特点,它对网络传输有高带宽、低时延、同步和高可靠性的要求。为了保证好的QoS质量,传输模式、协议栈和应用体系控制等问题就显得非常重要。下面我们先来讨论RTP协议。
-
RTP英文全称Real-time Transport Protocol实时流传输协议。在RFC中定义为RFC3550/RFC3551。RTP由IETF(Internet Engineering Task Force,互联网工程任务组)工作组制定。
-
该协议主要实现实时数据的传输,它在数据包头中提供编码类型,包中数据的采样时刻、数据包的序号,依据这些信息传输双方可以协商编码类型,可以对数据包进行排序。
-
RTP 本身并没有服务质量保证机制,它依赖于低层服务去实现这一过程。
RTCP
- RTCP英文全称Real-time Transport Control Protocol,实时传输控制协议,该协议是RTP数据流协议的一个姐妹协议。RTCP为RTP数据流提供信道外控制。RTCP并不传输数据,它和RTP协作将多媒体数据打包和发送。RTCP的主要功能是保证服务质量,为RTP提供服务质量反馈。
SRTP & SRTCP
-
SRTP英文全称为Secure Real-time Transport Protocol安全实时传输协议,该协议是在实时传输协议RTP基础上定义的一个协议,旨在为RTP数据提供加密、消息认证、完整性保证和重放保护。可以参考文档RFC3711。
-
RTCP同样也有一个伴生协议,它被称为安全实时传输控制协议Secure RTCP或SRTCP。在使用实时传输协议或实时传输控制协议时,是应用安全传输协议还是明文传输在数据传输过程中是可以选择的。
RTSP
-
RTSP英文全称Real Time Streaming Protocol实时串流协议,该协议由Real Networks和Netscape共同提出的,它是用来控制流数据串的协议。该协议定义了一对多应用程序如何有效地通过IP网络传送流数据。RTSP提供了一个可扩展框架,使实时数据,如音视频的受控、点播成为可能。
-
它允许同时对多个串流控制,服务器端可以自行选择使用TCP或UDP来传送串流内容,它的语法和运作跟HTTP 1.1类似,能容忍网络延迟。详情可以参考文档RFC2326。
RTMP和RTMPS
-
RTMP英文全称Real Time Messaging Protocol实时消息传送协议。它是Adobe Systems公司为Flash播放器和服务器之间流数据传输开发的开放协议。RTMP协议既可以传输AMF格式数据,也可以传输FLV格式数据。
-
RTMP协议有三个分支,
第一种是工作在TCP协议上的明文传输,它使用的端口是1935;
第二种是RTMPT,RTMPT被封装在HTTP请求之中,可以穿越防火墙进行传输;
第三种是RTMPS,它也是封装在HTTP之中,不过与RTMPT不同的是,它使用HTTPS安全连接,可以保证传输的安全。 -
目前,大多数互联网数据流传输使用该协议。
HLS
-
HLS英文全称HTTP Live Streaming在线流传输协议,该协议是由美国苹果公司实现的基于HTTP的流数据传输协议,可以实现流媒体的直播和点播。该协议主要为iOS系统服务。
-
HLS实际上并不是真正的实时流协议,HLS协议在服务器端将数据流存储为连续的、短时长的MPEG-TS格式文件,客户端不断下载并解析播放这些小文件从而实现实时流效果。可以认为,HLS是以点播流技术方式来实现实时流的协议。这样的缺点是延时高。
RTMP VC HLS
-
RTMP是APP中最常用的数据流传输协议,它可以做到低延时。RTMP协议进行数据传输时,它将一整条数据流封装成FLV通过HTTP打包、TCP长连接分发出去,在服务器端不产生落地文件,延时通常为 1至3秒,远超HLS。
-
HLS协议通过切片传输数据,边下载边传输,所以传输延时要比RTMP长。但是,HLS基于HTTP/80 传输,很少会被防火墙拦下。HLS基于无状态协议(HTTP)支持平滑扩展,RTMP对视频服务器进行平滑扩展困难。
-
做APP数据流时一般会选择RTMP而不是HLS,特殊情况是微信端不支持RTMP,所以HLS表现良好。
这里代码主要介绍RTMP流媒体协议-推流
rtmp创建连接过程:
![](https://img.haomeiwen.com/i3531360/180ab04bac1ea197.png)
连接代码:
- (NSInteger)RTMP264_Connect:(char *)push_url {
//由于摄像头的timestamp是一直在累加,需要每次得到相对时间戳
//分配与初始化
_rtmp = PILI_RTMP_Alloc();
PILI_RTMP_Init(_rtmp);
//设置URL
if (PILI_RTMP_SetupURL(_rtmp, push_url, &_error) == FALSE) {
//log(LOG_ERR, "RTMP_SetupURL() failed!");
goto Failed;
}
_rtmp->m_errorCallback = RTMPErrorCallback;
_rtmp->m_connCallback = ConnectionTimeCallback;
_rtmp->m_userData = (__bridge void *)self;
_rtmp->m_msgCounter = 1;
_rtmp->Link.timeout = RTMP_RECEIVE_TIMEOUT;
//设置可写,即发布流,这个函数必须在连接前使用,否则无效
PILI_RTMP_EnableWrite(_rtmp);
//连接服务器
if (PILI_RTMP_Connect(_rtmp, NULL, &_error) == FALSE) {
goto Failed;
}
//连接流
if (PILI_RTMP_ConnectStream(_rtmp, 0, &_error) == FALSE) {
goto Failed;
}
if (self.delegate && [self.delegate respondsToSelector:@selector(socketStatus:status:)]) {
[self.delegate socketStatus:self status:LFLiveStart];
}
[self sendMetaData];
_isConnected = YES;
_isConnecting = NO;
_isReconnecting = NO;
_isSending = NO;
return 0;
Failed:
PILI_RTMP_Close(_rtmp, &_error);
PILI_RTMP_Free(_rtmp);
_rtmp = NULL;
[self reconnect];
return -1;
}
音视频编码后上传数据:
#pragma mark -- EncoderDelegate
- (void)audioEncoder:(nullable id<WSAudioEncoding>)encoder audioFrame:(nullable WSAudioFrame *)frame {
// 上传 时间戳对齐
if (self.uploading){
self.hasCaptureAudio = YES;
if(self.AVAlignment) [self pushSendBuffer:frame];
}
}
- (void)videoEncoder:(nullable id<WSVideoEncoding>)encoder videoFrame:(nullable WSVideoFrame *)frame {
// 上传 时间戳对齐
if (self.uploading){
if(frame.isKeyFrame && self.hasCaptureAudio) self.hasKeyFrameVideo = YES;
if(self.AVAlignment) [self pushSendBuffer:frame];
}
}
网友评论