资源简介
读取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
相关资源
- 基于RTPRTCP和RTSP协议的流媒体快速流间
- webcam_v4l2_x264
- 使用mp4v2将H264+AAC合成mp4
- RTP传输h264码流
- H264 verilog 源码
- RTSP/RTP 嵌入式流媒体服务器的实现
- Linux基于Live555从共享内存 获取rstp实时
- RTP打包与解析,荷载PS和H264
- rtsp tcp获取h264裸码流
- RTP实时传输H.264
- RtspServerForHisiv500
- TS流解析源码,本地文件可直接转化
- H.264&H.265视频压缩编码参考码率表
- RFC3550_RTP协议中文版.pdf免费
- 基于Live555的从多个摄像头实时获取
- 最简RTSP客户端程序
- 最简 jrtplib 收发数据
- linux下的实时语音聊天程序源码adpcm编
- V4L2视频采集与h264编码
- mitty多普达smartphone刷机工具
- linux 语音实时对讲
- RTPC sar面目标成像
- rtp/rtcp协议实现源码
- 水杉导出pmx插件 ExportPMX
- linux c下acc打包成RTP并在VLC上播放
- Live555基于h264嵌入式linux下rtsp项目的裁
- ffmpeg摄像头数据h264编码并封装avi
- Codejock ChartPro vfp 使用
- rtp解包组包.zip
- 从网络抓包中提取RTP包,RTP解包为H
评论
共有 条评论