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

前面在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;    
}    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值