FLV文件格式解析部分代码

转自:http://www.lougoo.com/blog/article.asp?id=856

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

flvheadpacket.h
  1. #include "packet.h"   
  2.   
  3. class CFlvHeadPacket : public CPacket   
  4. {   
  5. public:   
  6.     CFlvHeadPacket(void);   
  7.     CFlvHeadPacket(UInt8* pContent, UInt32 nLength);   
  8.     ~CFlvHeadPacket(void);   
  9.   
  10. };  

 

flvheadpacket.cpp
  1. #include "stdafx.h"   
  2. #include "flvheadpacket.h"   
  3.   
  4. CFlvHeadPacket::CFlvHeadPacket(void)   
  5. {   
  6.     m_nType = FLV_HEAD;   
  7. }   
  8.   
  9. CFlvHeadPacket::CFlvHeadPacket(UInt8* pContent, UInt32 nLength)   
  10. {   
  11.     m_nType = FLV_HEAD;   
  12.     m_pContent = pContent;   
  13.     m_nLength = nLength;   
  14. }   
  15.   
  16. CFlvHeadPacket::~CFlvHeadPacket(void)   
  17. {   
  18. }  
flvmetapacket.h
  1. #include "packet.h"   
  2. class CFlvMetaPacket : public CPacket   
  3. {   
  4. public:   
  5.     CFlvMetaPacket(void);   
  6.     CFlvMetaPacket(UInt8* pContent, UInt32 nLength);   
  7.     ~CFlvMetaPacket(void);   
  8. };  

 

flvmetapacket.cpp
  1. #include "stdafx.h"   
  2. #include "flvmetapacket.h"   
  3.   
  4. CFlvMetaPacket::CFlvMetaPacket(void)   
  5. {   
  6.     m_nType = FLV_META;   
  7. }   
  8.   
  9. CFlvMetaPacket::CFlvMetaPacket(UInt8* pContent, UInt32 nLength)   
  10. {   
  11.     m_nType = FLV_META;   
  12.     m_pContent = pContent;   
  13.     m_nLength = nLength;   
  14. }   
  15.   
  16. CFlvMetaPacket::~CFlvMetaPacket(void)   
  17. {   
  18. }  

 

flvdatapacket.h
  1. #include "packet.h"   
  2.   
  3. enum{   
  4.     FLV_UNKNOWN_FRAME,   
  5.     FLV_VIDEO_FRAME,   
  6.     FLV_AUDIO_FRAME   
  7. };   
  8.   
  9. class CFlvDataPacket : public CPacket   
  10. {   
  11. public:   
  12.     CFlvDataPacket(void);   
  13.     CFlvDataPacket(UInt8* pContent, UInt32 nLength);   
  14.     ~CFlvDataPacket(void);   
  15.   
  16.     void    Print();   
  17.     UInt8   m_nDataType;   
  18.     UInt32  m_nTime;   
  19.     UInt8   m_nFlag;   
  20. };  

 

flvdatapacket.cpp
  1. #include "stdafx.h"   
  2. #include "flvdatapacket.h"   
  3.   
  4. CFlvDataPacket::CFlvDataPacket(void)   
  5. {   
  6.     m_nType = FLV_DATA;   
  7.     m_nDataType = FLV_UNKNOWN_FRAME;   
  8. }   
  9.   
  10. CFlvDataPacket::CFlvDataPacket(UInt8* pContent, UInt32 nLength)   
  11. {   
  12.     m_nType = FLV_DATA;   
  13.     m_pContent = pContent;   
  14.     m_nLength = nLength;   
  15.   
  16.     if ( m_pContent[0] == 8 )   
  17.         m_nDataType = FLV_AUDIO_FRAME;   
  18.     else if ( m_pContent[0] == 9 )   
  19.         m_nDataType = FLV_VIDEO_FRAME;   
  20.     else  
  21.         m_nDataType = FLV_UNKNOWN_FRAME;   
  22.   
  23.     m_nTime = FOUR_CHARS_TO_INT(0,m_pContent[4],m_pContent[5],m_pContent[6]);   
  24.   
  25.     m_nFlag = m_pContent[11];   
  26. }   
  27.   
  28. CFlvDataPacket::~CFlvDataPacket(void)   
  29. {   
  30. }   
  31.   
  32. void CFlvDataPacket::Print()   
  33. {   
  34.     printf("Type:%d,DataType=%d,Time=%d,Flag=%d,Length=%d/n",m_nType,m_nDataType,m_nTime,m_nFlag,m_nLength);   
  35. }   
flvreader.h
  1. #ifndef __FLVREADER_H__   
  2. #define __FLVREADER_H__   
  3.   
  4. #define FLV_HEAD_LENGTH 13   
  5. #define FLV_DATA_HEAD_LENGTH 11   
  6.   
  7. class CFlvDataPacket;   
  8. class CFlvHeadPacket;   
  9. class CFlvMetaPacket;   
  10.   
  11. class CFlvReader   
  12. {   
  13. public:   
  14.     CFlvReader(void);   
  15.     ~CFlvReader(void);   
  16.   
  17. public:   
  18.     SInt8*  m_sFile;   
  19.     FILE*   m_pFile;   
  20.     UInt32  m_nOffset;   
  21.     BOOL                SetFile(SInt8* sFile);   
  22.     FILESTAT64          GetFileStat64();   
  23.     FILESTAT            GetFileStat();   
  24.     CFlvHeadPacket*     ReadHeader();   
  25.     CFlvMetaPacket*     ReadMeta();   
  26.     CFlvDataPacket*     GetNextDataPacket();   
  27. };   
  28. #endif  
flvreader.cpp
  1. #include "stdafx.h"   
  2. #include "flvreader.h"   
  3. #include "flvdatapacket.h"   
  4. #include "flvheadpacket.h"   
  5. #include "flvmetapacket.h"   
  6.   
  7.   
  8. CFlvReader::CFlvReader(void)   
  9. {   
  10.     m_sFile = NULL;   
  11.     m_pFile = NULL;   
  12.     m_nOffset = 0;   
  13. }   
  14.   
  15. CFlvReader::~CFlvReader(void)   
  16. {   
  17.     if ( m_pFile != NULL )   
  18.     {   
  19.         fclose( m_pFile );   
  20.         m_pFile = NULL;   
  21.     }   
  22. }   
  23.   
  24. BOOL CFlvReader::SetFile(SInt8* sFile)   
  25. {   
  26.     if ( m_pFile != NULL )   
  27.     {   
  28.         fclose( m_pFile );   
  29.         m_pFile = NULL;   
  30.     }   
  31.     m_sFile     = sFile;   
  32.     m_pFile     = fopen( m_sFile, "rb" );   
  33.     return m_pFile != NULL;   
  34. }   
  35.   
  36. CFlvHeadPacket* CFlvReader::ReadHeader()   
  37. {   
  38.     UInt8*  pContent    = new UInt8[FLV_HEAD_LENGTH];   
  39.     UInt32  nRead       = fread( pContent, sizeof(SInt8), FLV_HEAD_LENGTH, m_pFile );   
  40.     if ( nRead == FLV_HEAD_LENGTH )   
  41.     {   
  42.         return new CFlvHeadPacket(pContent, FLV_HEAD_LENGTH);   
  43.     }   
  44.     else  
  45.     {   
  46.         delete pContent;   
  47.         return NULL;   
  48.     }   
  49. }   
  50.   
  51. CFlvMetaPacket* CFlvReader::ReadMeta()   
  52. {   
  53.     UInt8   buf[FLV_DATA_HEAD_LENGTH];   
  54.     UInt32  nRead   = fread( buf, sizeof(UInt8), FLV_DATA_HEAD_LENGTH, m_pFile );   
  55.     if ( nRead == FLV_DATA_HEAD_LENGTH )   
  56.     {   
  57.         if ( buf[0] == 18 )//meta   
  58.         {   
  59.             UInt32 nSize = FOUR_CHARS_TO_INT(0,buf[1],buf[2],buf[3]);   
  60.             UInt8*  pContent = new  UInt8[nSize+FLV_DATA_HEAD_LENGTH+4];   
  61.             memcpy(pContent,buf,FLV_DATA_HEAD_LENGTH);   
  62.             nRead = fread(&pContent[FLV_DATA_HEAD_LENGTH],sizeof(UInt8), nSize+4, m_pFile);   
  63.             if ( nRead = (nSize+4) )   
  64.             {   
  65.                 return new CFlvMetaPacket(pContent,nSize+FLV_DATA_HEAD_LENGTH+4);   
  66.             }   
  67.             else  
  68.             {   
  69.                 delete pContent;   
  70.                 return NULL;   
  71.             }   
  72.         }   
  73.     }   
  74.     return NULL;   
  75. }   
  76.   
  77. CFlvDataPacket* CFlvReader::GetNextDataPacket()   
  78. {   
  79.     UInt8   buf[FLV_DATA_HEAD_LENGTH];   
  80.     UInt32  nRead   = fread( buf, sizeof(UInt8), FLV_DATA_HEAD_LENGTH, m_pFile );   
  81.     if ( nRead == FLV_DATA_HEAD_LENGTH )   
  82.     {   
  83.         if ( buf[0] == 8 || buf[0] == 9 )   
  84.         {   
  85.             UInt32 nSize = FOUR_CHARS_TO_INT(0,buf[1],buf[2],buf[3]);   
  86.             UInt8*  pContent = new  UInt8[nSize+FLV_DATA_HEAD_LENGTH+4];   
  87.             memcpy(pContent,buf,FLV_DATA_HEAD_LENGTH);   
  88.             nRead = fread(&pContent[FLV_DATA_HEAD_LENGTH],sizeof(UInt8), nSize+4,m_pFile);   
  89.             if ( nRead = (nSize+4) )   
  90.             {   
  91.                 return new CFlvDataPacket(pContent,nSize+FLV_DATA_HEAD_LENGTH+4);   
  92.             }   
  93.             else  
  94.             {   
  95.                 delete pContent;   
  96.                 return NULL;   
  97.             }   
  98.         }   
  99.     }   
  100.     return NULL;   
  101. }   
  102.   
  103. FILESTAT CFlvReader::GetFileStat()   
  104. {   
  105.     FILESTAT    fileStat;   
  106.     memset(&fileStat,0,sizeof(FILESTAT));      
  107.   
  108.     if ( m_pFile != NULL )   
  109.     {   
  110.         if ( _stat(m_sFile,&fileStat) != 0 )   
  111.         {   
  112.             printf( "/nGetFileStat Error!/n" );   
  113.         }   
  114.     }   
  115.   
  116.     return fileStat;   
  117. }   
  118.   
  119. FILESTAT64      CFlvReader::GetFileStat64()   
  120. {   
  121.     FILESTAT64  fileStat;   
  122.     memset(&fileStat,0,sizeof(FILESTAT64));   
  123.   
  124.     if ( m_pFile != NULL )   
  125.     {   
  126.         if ( _stat64(m_sFile,&fileStat) != 0 )   
  127.         {   
  128.             printf( "/nGetFileStat64 Error!/n" );   
  129.         }   
  130.     }   
  131.   
  132.     return fileStat;   
  133. }   
posted @ 2009-05-08 13:41  k1988  阅读(338)  评论(0编辑  收藏  举报