ios直播

iOS 直播专题5-推流

2021-03-23  本文已影响0人  浪人残风

常用的推流协议有:

协议 内容
RTP 实时流传输协议,但不保证服务质量
RTCP RTP数据流协议的一个姐妹协议,为RTP提供服务质量反馈
SRTP & SRTCP RTP和RTCP的安全版本,提供数据加密、消息认证功能
RTSP 控制声音或影像的多媒体数据串流协议
RTMP ADOBE公司播放器与服务器之间多媒体数据传输的开放协议
HLS 苹果公司实现的基于HTTP的流数据传输协议,边下载边播放

RTP

RTCP

SRTP & SRTCP

RTSP

RTMP和RTMPS

HLS

RTMP VC HLS

这里代码主要介绍RTMP流媒体协议-推流

rtmp创建连接过程:


image.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];
    }
}

项目源码下载

上一篇下一篇

猜你喜欢

热点阅读