資源簡介
讀取H264文件,獲得每一幀的數據,然后切分成NAL,封裝成RTP包,用UDP發送到網絡。

代碼片段和文件信息
#include?“stdafx.h“
#include?“fframeExtractFilter.h“
#include?“MfcParser.h“
static?unsigned?char?delimiter_H264[]??=?{0x00?0x00?0x00?0x01};?//?H.264
static?unsigned?char?delimiter_MPEG4[]?=?{0x00?0x00?0x01};?//MPEG4
//
//?Constructor
//
CframeExtractFilter::CframeExtractFilter()
????:???m_pframexCtx(NULL)
{
????m_first?=?1;
????memset(m_szFileName?0?sizeof(m_szFileName));
m_frame_num?=?0;
????m_bLoopAfterEnd?=?FALSE;
m_bReadFileEnd?=?FALSE;
}
//
//?Destructor
//
CframeExtractFilter::~CframeExtractFilter()
{
if(m_pframexCtx?!=?NULL)
{
SsbSipParserDeInit(m_pframexCtx);
m_pframexCtx?=?NULL;
}
}
//
//?設置文件讀取路徑
//
void?CframeExtractFilter::SetFileName(LPCTSTR?pszFileName)
{
????lstrcpy(m_szFileName?pszFileName);
}
//設置是否循環讀取文件
void?CframeExtractFilter::SetLoopMode(BOOL?bLoop)
{
m_bLoopAfterEnd?=?bLoop;
}
//
//?ReadTheFile
//
int?CframeExtractFilter::OpenFile(LPCTSTR?pszFileName?SSBSIP_MFC_CODEC_TYPE??file_codec_type)
{
SSBSIP_MFC_CODEC_TYPE??codec_type?=?UNKNOWN_TYPE;
TCHAR?????????file_ext[6]?=?{0};
TCHAR?????????file_name[128]?=?{0};
????int???????????nRead;
????unsigned?int??width?height;
width?=?height?=?0;
????char?*?divider?=?NULL;
char?ext[8]?=?{0};
USES_CONVERSION;
divider?=?strrchr(T2A(pszFileName)?‘.‘);
if(divider)
????strcpy(ext?divider+1);
?bool?bFlag??=?false;
?if(file_codec_type?!=?UNKNOWN_TYPE)?//根據輸入的編碼類型來確定格式
?{
?bFlag?=?true;
?codec_type?=?file_codec_type;
?}
?else
?{
??bFlag?=?GetCodecType(ext?(SSBSIP_MFC_CODEC_TYPE&)codec_type);?//根據文件后綴名獲取視頻編碼格式
?}
?if(!bFlag)?//不是支持的格式
?return?-1;
?SetFileName(pszFileName);?//保存文件路徑
?m_StrmType?=?codec_type;
?ATLTRACE(_T(“OpenFile:?%s?\n“)?pszFileName);
if(m_pframexCtx?!=?NULL)
{
SsbSipParserDeInit(m_pframexCtx);
}
MPEG4_CONFIG_DATA?conf_data;
memset(&conf_data?0?sizeof(MPEG4_CONFIG_DATA));
conf_data.bGetWH?=?TRUE;?//是否獲取分辨率
//讀取整個文件,獲得視頻分辨率和每一幀的信息
if((m_pframexCtx?=?SsbSipParserInit((SSBSIP_MFC_CODEC_TYPE)m_StrmType?T2A(pszFileName)?MAX_DECODER_INPUT_BUFFER_SIZE?&conf_data))?==?NULL)
{
::OutputDebugString(L“SsbSipParserInit?Failed\n“);
return?-2;
}
width???=?conf_data.width;
height??=?conf_data.height;
ATLTRACE(“Width:?%d?Height:?%d?\n“?width?height);
????//?Validate?the?width?&?height?value
????if?((width?>?4096)?||?(width?16)?||?(height?>?2048)?||?(height?16))?{
????????ATLTRACE(_T(“video?size?is?not?vaild.?(width=%d?height=%d)\n“)?width?height);
????????return?-3;
????}
m_bReadFileEnd?=?FALSE;
????return?0;
}
//函數:GetNextframe
//說明:?讀取下一個幀的數據,如果是第一次調用,則讀取第一幀。
//??????m_bLoopAfterEnd變量設置是否循環讀取文件,會影響GetNextframe函數的行為。如果m_bLoopAfterEnd為true,則調用GetNextframe永遠都會返回成功;否則,則讀到文件尾部最后一幀就結束。
//返回值:大于0返回實際讀取的幀長度;==0表示已經讀到最后一幀,調用者應該停止繼續調用該函數,準備關閉文件;-1表示讀取錯誤。
int?CframeExtractFilter::GetNextframe(unsigned?char?*pframeBuf?unsigned?int?*pSize?char?*
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2018-12-03?15:33??VsParserSendH264\
?????目錄???????????0??2018-12-03?15:33??VsParserSendH264\Debug\
?????文件????????4640??2018-12-03?13:35??VsParserSendH264\ffr
?????文件????????1597??2018-12-03?13:35??VsParserSendH264\ffr
?????文件????????1135??2018-12-03?13:36??VsParserSendH264\mfcparser.h
?????文件???????11516??2013-11-12?10:13??VsParserSendH264\NALUnit.cpp
?????文件????????4637??2013-11-12?10:13??VsParserSendH264\NALUnit.h
?????文件????????1207??2018-12-02?17:27??VsParserSendH264\ReadMe.txt
?????文件????????2121??2018-12-03?14:14??VsParserSendH264\RTPPacket.cpp
?????文件????????1320??2018-12-03?14:51??VsParserSendH264\RTPPacket.h
?????文件????????3780??2018-12-03?15:30??VsParserSendH264\RTSPStream.cpp
?????文件????????1602??2018-12-03?15:30??VsParserSendH264\RTSPStream.h
?????文件????????7087??2013-11-12?10:13??VsParserSendH264\smartptr.h
?????文件????????3765??2015-06-19?09:53??VsParserSendH264\SpsDecode.h
?????文件????????2385??2018-12-03?13:41??VsParserSendH264\SsbSipMfcDecParser.cpp
?????文件?????????216??2018-12-02?17:27??VsParserSendH264\stdafx.cpp
?????文件?????????394??2018-12-03?14:37??VsParserSendH264\stdafx.h
?????文件????????4173??2013-12-28?13:14??VsParserSendH264\Structure.h
?????文件?????????498??2018-12-02?17:27??VsParserSendH264\targetver.h
?????文件???????12077??2018-12-03?14:58??VsParserSendH264\TypeHandler.cpp
?????文件????????2037??2018-12-03?15:31??VsParserSendH264\TypeHandler.h
?????文件???????34810??2018-12-02?17:57??VsParserSendH264\vsparser.cpp
?????文件????????3281??2018-12-02?17:29??VsParserSendH264\vsparser.h
?????文件????????7451??2018-12-03?15:32??VsParserSendH264\VsParserPro.cpp
?????文件????????5628??2018-12-03?14:29??VsParserSendH264\VsParserPro.vcproj
?????文件?????????909??2018-12-03?13:23??VsParserSendH264.sln
評論
共有 條評論