FLV音频帧信息

# include   < iostream >
# include   < fstream >
using   namespace   std ;

typedef   struct  _FLVHead
{
     unsigned   char  flv [ 3 ] ;
     unsigned   char  version ;
     unsigned   char  FlagsVideo : 1 ;
     unsigned   char  Flags : 1 ;
     unsigned   char  FlagsAudio : 1 ;
     unsigned   char  Flags1 : 5 ;
     unsigned   int  DataOffset ;
} FLVHead ;

typedef   struct  _AudioInfo
{
     unsigned   char  SoundType : 1 ;
     unsigned   char  SoundSize : 1 ;     
     unsigned   char  SoundRate : 2 ;
     unsigned   char  SoundFormat : 4 ;
} AudioInfo ;

typedef   struct  _FLVTag
{
     unsigned   int  SizeOfLastTag ;
     unsigned   int  Type : ;
     unsigned   int  DataSize : 24 ;
     unsigned   int  TimeStamp : 24 ;
     unsigned   int  ExtenTimeStamp : 8 ;
     unsigned   int  StreamID : 24 ;
     unsigned   int  AVData : 8 ;
} FLVTag ;

const   char *  SoundFormat [ ]   = {
"Linear PCM, platform endian" ,
"ADPCM" ,
"MP3" ,
"Linear PCM, little endian" ,
"Nellymoser 16-kHz mono" ,
"Nellymoser 8-kHz mono" ,
"Nellymoser" ,
"G.711 A-law logarithmic PCM" ,
"G.711 mu-law logarithmic PCM" ,
"reserved" ,
"AAC" ,
"MP3 8-Khz" ,
"Device-specific sound" ,
} ;
const   char *  SoundRate [ ]   =   {
"5.5-kHz" ,
"11-kHz" ,
"22-kHz" ,
"44-kHz" ,
} ;
const   char *  SoundSize [ ]   =  
{
"snd8Bit" ,
"snd16Bit" ,
} ;
const   char *  SoundType [ ]   =  
{
"sndMono" ,
"sndStereo" ,
} ;
unsigned   int  ReverseInt24 ( unsigned   int  B )
{
     unsigned   char *  A  =   ( unsigned   char *   ) & B ;
     return  A [ 0 ] < < 16 |
         A [ 1 ] < < 8 |
         A [ 2 ] ;
}
unsigned   int  ReverseInt32 ( unsigned   int  B )
{
     unsigned   char *  A  =   ( unsigned   char *   ) & B ;
     return  A [ 0 ] < < 24 |
         A [ 1 ] < < 16 |
         A [ 2 ] < < 8 |
         A [ 3 ] ;
}
void  ShowAudioInfo ( const  AudioInfo  *  paudioInfo )
{
     cout < < " SoundFormat : " < < SoundFormat [ paudioInfo - > SoundFormat ] < < endl ;
     cout < < " SoundRate : " < < SoundRate [ paudioInfo - > SoundRate ] < < endl ;
     cout < < " SoundSize : " < < SoundSize [ paudioInfo - > SoundSize ] < < endl ;
     cout < < " SoundType : " < < SoundType [ paudioInfo - > SoundType ] < < endl ;
}
void  ShowTagInfo ( const  FLVTag  *  pflvTag ,   const   unsigned   char *  buf )
{
     if ( pflvTag - > Type  = =  8 )
     {
         cout < < "Audio Tag" < < endl ;
        ShowAudioInfo ( ( AudioInfo  * ) buf  +  15 ) ;
     }
     else   if ( pflvTag - > Type  = =  18 )
     {
         cout < < "Script Tag" < < endl ;
     }
     else   if ( pflvTag - > Type  = =  9 )
     {
         cout < < "Video Tag" < < endl ;
     }
}

int  main ( )
{
     unsigned   char  buf [ 1024 ] ;
     char  flvname [ 255 ]   =   "101.flv" ;

     ifstream  flvfile ;  
    flvfile . open ( flvname , ifstream : : binary | ifstream : : in ) ;
     cout < < flvname < < endl ;
     if ( flvfile . is_open ( ) )
     {     
         long  seekpos  =  0 ;
        flvfile . seekg ( 0 ,   ios : : end ) ;
         long  length  =  flvfile . tellg ( ) ;
        flvfile . seekg  ( 0 ,   ios : : beg ) ;
        flvfile . read ( ( char * ) buf , 20 ) ;
        FLVHead     *  pflvhead  =   ( FLVHead  * ) buf ;
         unsigned   int  seekoffset  =  pflvhead - > DataOffset ;
         while ( ! flvfile . eof ( ) )
         {
            flvfile . seekg  ( seekoffset ,   ios : : beg ) ;
         flvfile . read ( ( char * ) buf , 1024 ) ;
            FLVTag  *  pflvTag  =   ( FLVTag  * ) buf ;
            pflvTag - > SizeOfLastTag  = ReverseInt32 ( pflvTag - > SizeOfLastTag ) ;
            pflvTag - > DataSize  =  ReverseInt24 ( pflvTag - > DataSize ) ;
            pflvTag - > TimeStamp  =  ReverseInt24 ( pflvTag - > TimeStamp ) ;
             cout < < "StreamID: " < < std : : dec < < pflvTag - > StreamID < < endl ;
             cout < < "AVData : " < < std : : dec < < pflvTag - > AVData < < endl ;
            pflvTag - > StreamID  =  ReverseInt24 ( pflvTag - > StreamID ) ;
             cout < < "Offset : 0x" < < std : : hex < < seekoffset < < endl ;
             cout < < "Size : " < < std : : dec < < pflvTag - > DataSize < < endl ;
            ShowTagInfo ( pflvTag ,  buf ) ;
            seekoffset  + =  pflvTag - > DataSize  +  15 ;
             //system("pause");

         }
     }
     return  0 ;

}

转自 http://www.diybl.com/course/3_program/c++/cppjs/20100308/196935.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值