• 大小: 40KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-05
  • 语言: 其他
  • 标签: H264  RTP  

资源简介

读取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\fframeExtractFilter.cpp
     文件        1597  2018-12-03 13:35  VsParserSendH264\fframeExtractFilter.h
     文件        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

评论

共有 条评论