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

转载 2012年03月21日 17:19:31

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


FLV文件格式解析部分代码

转自:http://www.lougoo.com/blog/article.asp?id=856前面在FLV文件格式大揭秘中介绍了FLV文件格式,其中也谈到了曾经编写的代码解析flv文件。应网友要求,...
  • k1988
  • k1988
  • 2009年05月08日 13:41
  • 2655

流媒体-FLV格式详解及数据分析

一、FLV文件格式 FLV包括文件头(File Header)和文件体(File Body)两部分。文件结构如图所示: 二、FLV文件头 header部分记录了flv的类型、版本等信息...
  • mm792261167
  • mm792261167
  • 2017年04月06日 17:08
  • 4287

也说FLV格式分析(C语言从0开始,详解,完整版)

也说FLV格式分析(C语言完整版) 最近想写一个在线视频播放软件,经研究得知某视频网站会将一个视频成很多段来投放从而方便在线缓冲,以及加Ad之类的目的。下载后大概如下图所示(星哥的九品芝麻官)...
  • spygg
  • spygg
  • 2016年12月27日 16:09
  • 1887

C++ 解析flv文件

#include "stdafx.h" #include typedef struct FLV_HEADER { BYTE btSignature[3]; BYTE btVersion; B...
  • sz76211822
  • sz76211822
  • 2016年12月20日 11:15
  • 492

wav格式音频转换成flv格式音频(一)

根据前一篇文章中对flv格式的分析,flv格式包括file header和file body两部分,因此可以如下定义file header以及Previous Tag Size#0,如下: cons...
  • linyanwen99
  • linyanwen99
  • 2012年04月26日 18:02
  • 1347

媒体格式分析之flv -- 基于FFMPEG

http://www.cnblogs.com/qingquan/archive/2011/08/11/2135531.html 本来是应该先写一个媒体文件格式的简单讲解的,还没来得及写,以后再写。今...
  • yuuuuy
  • yuuuuy
  • 2013年11月05日 17:17
  • 767

视音频编解码学习工程:FLV封装格式分析器

本文介绍一个自己的开源小项目:FLV封装格式分析器。FLV全称是Flash Video,是互联网上使用极为广泛的视频封装格式。像Youtube,优酷这类视频网站,都使用FLV封装视频。我这个项目规模不...
  • leixiaohua1020
  • leixiaohua1020
  • 2014年01月12日 00:01
  • 34898

flv文件格式解析

1.header header部分记录了flv的类型、版本等信息,是flv的开头,一般都差不多,占9bytes。具体格式如下: 文件类型 3 bytes “FLV”...
  • u010246197
  • u010246197
  • 2016年09月19日 14:47
  • 287

FLV 文件格式解析

FLV文件格式解析   (2009-10-02 23:44:18) 转载▼ 标签:  flv   tag   adobe   it ...
  • sdsdfser
  • sdsdfser
  • 2014年02月24日 11:51
  • 463

flv 文件格式解析

Overview Flash Video(简称FLV),是一种流行的网络格式。目前国内外大部分视频分享网站都是采用的这种格式. File Structure 从整个文件上开看,FLV是由...
  • coloriy
  • coloriy
  • 2017年09月11日 14:51
  • 172
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(转)FLV文件格式解析部分代码
举报原因:
原因补充:

(最多只允许输入30个字)