简单的RTSP RTP RTCP推送H264码流服务器实现


简单实现RTSP, RTP, RTCP收发功能,可用于基础入门的学习研究。由于只是闲时兴趣随意花2星期凑出实现,代码及功能并非完善,只是能够多路VLC及MPLAYER作为客户端同时播放。
资源截图
代码片段和文件信息
#include 

#include “CMediaSession.h“

#define PRE_PARSE_frame (50)
CMediaSession::CMediaSession(std::string strFileName)
{
    m_strFileName = strFileName;
    m_fpFile = NULL;
    m_pBuf = NULL;
    m_u32BufLen = 1 * 1024 * 1024;
}

CMediaSession::~CMediaSession()
{
    Stop();
}

BOOL CMediaSession::GetMediaInfo(MediaInfo_t *pMediaInfo)
{
    ASSERT(pMediaInfo);
    pMediaInfo->stVideoInfo.eType = StreamType_H264;
    strcpy(pMediaInfo->stVideoInfo.strStreamType “H264“);
    pMediaInfo->stVideoInfo.u32frameRate = 25;
    strcpy(pMediaInfo->acFileName “Bibubibu“);
    pMediaInfo->bHaveVideo = TRUE;
    pMediaInfo->bHaveAudio = FALSE;
    return TRUE;
}

BOOL CMediaSession::GetframeInfoByCSeq(frameInfo_t &stFrmInfo INT32 s32FrmIdx)
{
    FrmInfo_t stFrm;
    INT32 s32Offset = 0;
    std::map::iterator iter;
    
    memset(&stFrm 0x0 sizeof(stFrm));
    ///printf(“s32FrmIdx:%d
“ s32FrmIdx);

    iter = m_mapFrmInfo.find(s32FrmIdx - 1);
    if (iter != m_mapFrmInfo.end())
    {
        FrmInfo_t *p = NULL;
        p = &(iter->second);
        s32Offset = p->u32Offset + p->u32Len;
    }
    
    if (!findNextNalu(stFrm s32Offset))
    {
        printf(“can‘t find nalu error
“);
        return FALSE;
    }
    
    stFrmInfo.pframe = m_pBuf + stFrm.u32Offset - s32Offset;
    stFrmInfo.s32frameSize = stFrm.u32Len;
    stFrmInfo.s8NaluType = stFrm.s8NaluType;
    stFrmInfo.s32StreamType = H264;

    iter = m_mapFrmInfo.find(s32FrmIdx);
    if (iter == m_mapFrmInfo.end())
    {
        if (m_listFrmKey.size() >= PRE_PARSE_frame)
        {
            m_mapFrmInfo.erase(m_listFrmKey.front());
            m_listFrmKey.pop_front();
        }
        m_listFrmKey.push_back(s32FrmIdx);
    }
    m_mapFrmInfo.insert(std::pair(s32FrmIdx stFrm));
    return TRUE;
}

BOOL CMediaSession::findNextNalu(FrmInfo_t &stFrmInfo INT32 &s32Offset)
{
    INT32 s32RLen = 0;
    INT32 s32Pos = 0;
    ASSERT(m_fpFile);
    ///printf(“s32Offset:0x%x
“ s32Offset);
    fseek(m_fpFile s32Offset SEEK_SET);
    s32RLen = fread(m_pBuf 1 m_u32BufLen m_fpFile);
    ///ASSERT(s32RLen > 0);
    ///TODO:replace END MSG
    if (s32RLen <= 0)
    {
        s32Offset = 0;
        fseek(m_fpFile s32Offset SEEK_SET);
        s32RLen = fread(m_pBuf 1 m_u32BufLen m_fpFile);
        ASSERT(s32RLen > 0);
    }

    while ((s32Pos + 2) < m_u32BufLen)
    {
        if (        (m_pBuf[s32Pos] == 0x00)
                && (m_pBuf[s32Pos + 1] == 0x00)
                && (m_pBuf[s32Pos + 2] == 0x01)
            )
        {
            stFrmInfo.u32Offset = s32Offset + s32Pos + 3;
            stFrmInfo.s8NaluType = m_pBuf[s32Pos + 3] & 0x1F;
            break;
        }
        else if (    (m_pBuf[s32Pos] == 0x00)
                && (m_pBuf[s32Pos + 1] == 0x00)
                && (m_pBuf[s32Pos + 2] == 0x00)
                && (m_

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

发表评论

评论列表(条)