#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:8 ;
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;
}
|