• 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. }   
  • 相关阅读:
    新的
    曾经写过得太监小说3《缱绻修真界》
    Python的from和import用法
    python几个有意思的小技巧
    leetcode 最长回文串
    leetcode-快速排序C++自写
    leetcode 面试题 01.06. 字符串压缩
    leeetcode 剑指 Offer 29. 顺时针打印矩阵
    leetcode 70. 爬楼梯 续
    leetcode 1143. 最长公共子序列-华为
  • 原文地址:https://www.cnblogs.com/k1988/p/2165729.html
Copyright © 2020-2023  润新知