資源簡介
簡單實現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)?????{
????????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_
評論
共有 條評論