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