• 大小: 1.64MB
    文件类型: .gz
    金币: 1
    下载: 0 次
    发布日期: 2023-10-20
  • 语言: 其他
  • 标签: RTSP  RTP  RTCP  

资源简介

简单实现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\n“ 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\n“);
        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\n“ 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_

评论

共有 条评论