文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>FLV音频帧信息

FLV音频帧信息

时间:2010-03-05  来源:ssddyb

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


相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载