您的位置:首页 > 编程语言

(转)FLV文件格式解析部分代码

2012-03-21 17:19 393 查看
前面在FLV文件格式大揭秘中介绍了FLV文件格式,其中也谈到了曾经编写的代码解析flv文件。应网友要求,现在把代码贴出来,仅供大家参考。因为这代码还是在2006年写的,现在看来有些地方还不够准确,解析的也不够完全,所以仅供参考。

 

flvheadpacket.h

#include "packet.h"

class CFlvHeadPacket : public CPacket
{
public:
CFlvHeadPacket(void);
CFlvHeadPacket(UInt8* pContent, UInt32 nLength);
~CFlvHeadPacket(void);

};
flvheadpacket.cpp

#include "stdafx.h"
#include "flvheadpacket.h"

CFlvHeadPacket::CFlvHeadPacket(void)
{
m_nType = FLV_HEAD;
}

CFlvHeadPacket::CFlvHeadPacket(UInt8* pContent, UInt32 nLength)
{
m_nType = FLV_HEAD;
m_pContent = pContent;
m_nLength = nLength;
}

CFlvHeadPacket::~CFlvHeadPacket(void)
{
}

flvmetapacket.h

#include "packet.h"
class CFlvMetaPacket : public CPacket
{
public:
CFlvMetaPacket(void);
CFlvMetaPacket(UInt8* pContent, UInt32 nLength);
~CFlvMetaPacket(void);
};

flvmetapacket.cpp

#include "stdafx.h"
#include "flvmetapacket.h"

CFlvMetaPacket::CFlvMetaPacket(void)
{
m_nType = FLV_META;
}

CFlvMetaPacket::CFlvMetaPacket(UInt8* pContent, UInt32 nLength)
{
m_nType = FLV_META;
m_pContent = pContent;
m_nLength = nLength;
}

CFlvMetaPacket::~CFlvMetaPacket(void)
{
}

flvdatapacket.h

#include "packet.h"

enum{
FLV_UNKNOWN_FRAME,
FLV_VIDEO_FRAME,
FLV_AUDIO_FRAME
};

class CFlvDataPacket : public CPacket
{
public:
CFlvDataPacket(void);
CFlvDataPacket(UInt8* pContent, UInt32 nLength);
~CFlvDataPacket(void);

void    Print();
UInt8   m_nDataType;
UInt32  m_nTime;
UInt8   m_nFlag;
};

flvdatapacket.cpp

#include "stdafx.h"
#include "flvdatapacket.h"

CFlvDataPacket::CFlvDataPacket(void)
{
m_nType = FLV_DATA;
m_nDataType = FLV_UNKNOWN_FRAME;
}

CFlvDataPacket::CFlvDataPacket(UInt8* pContent, UInt32 nLength)
{
m_nType = FLV_DATA;
m_pContent = pContent;
m_nLength = nLength;

if ( m_pContent[0] == 8 )
m_nDataType = FLV_AUDIO_FRAME;
else if ( m_pContent[0] == 9 )
m_nDataType = FLV_VIDEO_FRAME;
else
m_nDataType = FLV_UNKNOWN_FRAME;

m_nTime = FOUR_CHARS_TO_INT(0,m_pContent[4],m_pContent[5],m_pContent[6]);

m_nFlag = m_pContent[11];
}

CFlvDataPacket::~CFlvDataPacket(void)
{
}

void CFlvDataPacket::Print()
{
printf("Type:%d,DataType=%d,Time=%d,Flag=%d,Length=%d/n",m_nType,m_nDataType,m_nTime,m_nFlag,m_nLength);
}

flvreader.h

#ifndef __FLVREADER_H__
#define __FLVREADER_H__

#define FLV_HEAD_LENGTH 13
#define FLV_DATA_HEAD_LENGTH 11

class CFlvDataPacket;
class CFlvHeadPacket;
class CFlvMetaPacket;

class CFlvReader
{
public:
CFlvReader(void);
~CFlvReader(void);

public:
SInt8*  m_sFile;
FILE*   m_pFile;
UInt32  m_nOffset;
BOOL                SetFile(SInt8* sFile);
FILESTAT64          GetFileStat64();
FILESTAT            GetFileStat();
CFlvHeadPacket*     ReadHeader();
CFlvMetaPacket*     ReadMeta();
CFlvDataPacket*     GetNextDataPacket();
};
#endif

flvreader.cpp

#include "stdafx.h"
#include "flvreader.h"
#include "flvdatapacket.h"
#include "flvheadpacket.h"
#include "flvmetapacket.h"

CFlvReader::CFlvReader(void)
{
m_sFile = NULL;
m_pFile = NULL;
m_nOffset = 0;
}

CFlvReader::~CFlvReader(void)
{
if ( m_pFile != NULL )
{
fclose( m_pFile );
m_pFile = NULL;
}
}

BOOL CFlvReader::SetFile(SInt8* sFile)
{
if ( m_pFile != NULL )
{
fclose( m_pFile );
m_pFile = NULL;
}
m_sFile     = sFile;
m_pFile     = fopen( m_sFile, "rb" );
return m_pFile != NULL;
}

CFlvHeadPacket* CFlvReader::ReadHeader()
{
UInt8*  pContent    = new UInt8[FLV_HEAD_LENGTH];
UInt32  nRead       = fread( pContent, sizeof(SInt8), FLV_HEAD_LENGTH, m_pFile );
if ( nRead == FLV_HEAD_LENGTH )
{
return new CFlvHeadPacket(pContent, FLV_HEAD_LENGTH);
}
else
{
delete pContent;
return NULL;
}
}

CFlvMetaPacket* CFlvReader::ReadMeta()
{
UInt8   buf[FLV_DATA_HEAD_LENGTH];
UInt32  nRead   = fread( buf, sizeof(UInt8), FLV_DATA_HEAD_LENGTH, m_pFile );
if ( nRead == FLV_DATA_HEAD_LENGTH )
{
if ( buf[0] == 18 )//meta
{
UInt32 nSize = FOUR_CHARS_TO_INT(0,buf[1],buf[2],buf[3]);
UInt8*  pContent = new  UInt8[nSize+FLV_DATA_HEAD_LENGTH+4];
memcpy(pContent,buf,FLV_DATA_HEAD_LENGTH);
nRead = fread(&pContent[FLV_DATA_HEAD_LENGTH],sizeof(UInt8), nSize+4, m_pFile);
if ( nRead = (nSize+4) )
{
return new CFlvMetaPacket(pContent,nSize+FLV_DATA_HEAD_LENGTH+4);
}
else
{
delete pContent;
return NULL;
}
}
}
return NULL;
}

CFlvDataPacket* CFlvReader::GetNextDataPacket()
{
UInt8   buf[FLV_DATA_HEAD_LENGTH];
UInt32  nRead   = fread( buf, sizeof(UInt8), FLV_DATA_HEAD_LENGTH, m_pFile );
if ( nRead == FLV_DATA_HEAD_LENGTH )
{
if ( buf[0] == 8 || buf[0] == 9 )
{
UInt32 nSize = FOUR_CHARS_TO_INT(0,buf[1],buf[2],buf[3]);
UInt8*  pContent = new  UInt8[nSize+FLV_DATA_HEAD_LENGTH+4];
memcpy(pContent,buf,FLV_DATA_HEAD_LENGTH);
nRead = fread(&pContent[FLV_DATA_HEAD_LENGTH],sizeof(UInt8), nSize+4,m_pFile);
if ( nRead = (nSize+4) )
{
return new CFlvDataPacket(pContent,nSize+FLV_DATA_HEAD_LENGTH+4);
}
else
{
delete pContent;
return NULL;
}
}
}
return NULL;
}

FILESTAT CFlvReader::GetFileStat()
{
FILESTAT    fileStat;
memset(&fileStat,0,sizeof(FILESTAT));

if ( m_pFile != NULL )
{
if ( _stat(m_sFile,&fileStat) != 0 )
{
printf( "/nGetFileStat Error!/n" );
}
}

return fileStat;
}

FILESTAT64      CFlvReader::GetFileStat64()
{
FILESTAT64  fileStat;
memset(&fileStat,0,sizeof(FILESTAT64));

if ( m_pFile != NULL )
{
if ( _stat64(m_sFile,&fileStat) != 0 )
{
printf( "/nGetFileStat64 Error!/n" );
}
}

return fileStat;
}


转自:http://blog.csdn.net/b4362928/article/details/4970249
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  flv null class delete audio video