当前位置:编程学习 > C/C++ >>

从crtmpserver中看具体处理rtmp协议的流程

在接收到客户端发送的34bytes
再去掉12bytes的头剩下22bytes
Deserialize来解码
[cpp]  
<span style="font-size:18px;">switch (H_MT(header)) {  
    ...  
    case RM_HEADER_MESSAGETYPE_FLEX:  
        {  
            message[RM_INVOKE][RM_INVOKE_IS_FLEX] =  
                    (bool)(H_MT(header) == RM_HEADER_MESSAGETYPE_FLEX);  
            return DeserializeInvoke(buffer, message[RM_INVOKE]);  
        }  
}</span>  
 
 
[cpp]  
<span style="font-size:18px;">bool RTMPProtocolSerializer::DeserializeInvoke(IOBuffer &buffer, Variant &message) {  
    if (message[RM_INVOKE_IS_FLEX]) {  
        if (!buffer.Ignore(1)) {  
            FATAL("Unable to ignore 1 byte");  
            return false;  
        }  
    }  
  
    if (!_amf0.ReadShortString(buffer, message[RM_INVOKE_FUNCTION])) {  
        FATAL("Unable to read %s", STR(RM_INVOKE_FUNCTION));  
        return false;  
    }  
  
    if (!_amf0.ReadDouble(buffer, message[RM_INVOKE_ID])) {  
        FATAL("Unable to read %s", STR(RM_INVOKE_ID));  
        return false;  
    }  
  
    for (uint32_t i = 0; GETAVAILABLEBYTESCOUNT(buffer) > 0; i++) {  
        if (!_amf0.Read(buffer, message[RM_INVOKE_PARAMS][i])) {  
            FATAL("Unable to de-serialize invoke parameter %u", i);  
            return false;  
        }  
    }  
  
    return true;  
}</span>  
 
 
完全的数据在这里被消耗了
 
[cpp]  
<span style="font-size:18px;">bool BaseRTMPAppProtocolHandler::InboundMessageAvailable(BaseRTMPProtocol *pFrom,  
        Variant &request) {  
    switch ((uint8_t) VH_MT(request)) {  
    case RM_HEADER_MESSAGETYPE_FLEX:  
            {  
                return ProcessInvoke(pFrom, request);  
    }  
    }  
}  
</span>  
中进行处理
 
[cpp]  
<span style="font-size:18px;">bool BaseRTMPAppProtocolHandler::ProcessInvoke(BaseRTMPProtocol *pFrom,  
        Variant &request) {  
    ...  
else if (functionName == RM_INVOKE_FUNCTION_PLAY) {  
            return ProcessInvokePlay(pFrom, request);  
}</span>  
 
 
这里多N多事情
[cpp]  
<span style="font-size:18px;">bool BaseRTMPAppProtocolHandler::ProcessInvokePlay(BaseRTMPProtocol *pFrom,  
        Variant & request) {  
    ...在这里生成meta文件,生成seek文件  
}</span>  
 
然后最核心的是这里
[cpp]   www.zzzyk.com
<span style="font-size:18px;">void BaseOutNetRTMPStream::SignalAttachedToInStream() {  
    //1. Store the attached stream type to know how we should proceed on detach  
    ...  
    //2. Mirror the feeder chunk size  
    ...  
    //3. Fix the time base  
    ...  
    //4. Store the metadata  
    ...  
    //5. Send abort messages on audio/video channels  
    ...  
    //6. Stream is recorded  
    ...  
    //7. Stream begin  
    ...  
    if (_sendOnStatusPlayMessages) {  
        //8. Send NetStream.Play.Reset  
        ...  
        //9. NetStream.Play.Start  
        ...  
        //10. notify |RtmpSampleAccess  
        ...  
    }  
    //11. notify onStatus code="NetStream.Data.Start"  
    ...  
    //12. notify onMetaData  
    ...  
}</span>  
 
 
[cpp] 
<span style="font-size:18px;">bool BaseInStream::Play(double absoluteTimestamp, double length) {  
    if (!SignalPlay(absoluteTimestamp, length)) {  
        FATAL("Unable to signal play");  
        return false;  
    }  
    LinkedListNode<BaseOutStream *> *pTemp = _pOutStreams;  
    while (pTemp != NULL) {  
        if (!pTemp->info->SignalPlay(absoluteTimestamp, length)) {  
            WARN("Unable to signal play on an outbound stream");  
        }  
        pTemp = pTemp->pPrev;  
    }  
    return true;  
}</span>  
 
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,