网站做百度推广需要哪些条件,怎么建立公司网站费用,wordpress 回复下载插件,广州网站建设大公司文章转载自#xff1a;http://blog.csdn.net/flyingqr/archive/2010/02/02/5282600.aspx 版权归原作者#xff0c;编辑#xff1a;小乙哥
MP4文件格式分为头部和数据两部分#xff0c;头部是由许多被称作Atom的结构单元嵌套或排列而成#xff0c;数据部分则完全为实际数据…文章转载自http://blog.csdn.net/flyingqr/archive/2010/02/02/5282600.aspx 版权归原作者编辑小乙哥
MP4文件格式分为头部和数据两部分头部是由许多被称作Atom的结构单元嵌套或排列而成数据部分则完全为实际数据不包含元信息因此具体解码时音视频帧的位置和大小都要在头部获取。详细内容见以下链接http://wqyuwss.52rd.net这里总结下音频解码信息获取的一些经验当然详细内容需要查看quick time file format的文档。MP4的音频解码信息保存在如下嵌套的Atom中{moov{mdia{minf{smhd{stbl{stsd}}}}}}stsd可能包括多个音频信息的描述结构如下 typedef struct stsdtable{ unsigned int size;//Atom大小 char format[4];//音频编码格式 int res1; int ref; short version;//版本 short pad1; int pad2; short channels;//声道 short bitspersample; short compress_id; short res2; short samplerate1;//采样率 short samplerate2; //{if(version1) int sampleperpacket; int bytesperpacket; int bytesperframe; int bytespersample; //}} stsdtable;
其中format对应音频编码格式PCM_S32BE, in32PCM_S32LE, in32PCM_S24BE, in24PCM_S24LE, in24PCM_S16BE, twos // 16 bits //PCM_S16LE, sowt // PCM_S16LE, lpcmPCM_F32BE, fl32PCM_F64BE, fl64PCM_S8, sowtPCM_U8, raw // 8 bits unsignedPCM_U8, NONE // uncompressedPCM_MULAW, ulaw //PCM_ALAW, alaw //ADPCM_IMA_QT, ima4 // IMA-4 ADPCM //MACE3, MAC3 // Macintosh Audio Compression and Expansion 3:1 ///MACE6, MAC6 // Macintosh Audio Compression and Expansion 6:1 //MP3, .mp3 // MPEG layer 3 */uint8_t moov[] moov;uint8_t trak[] trak;uint8_t mdia[] mdia;uint8_t minf[] minf;uint8_t stbl[] stbl;uint8_t stsd[] stsd;uint8_t stsc[] stsc;uint8_t stsz[] stsz;uint8_t stco[] stco;uint8_t ftyp[] ftyp;uint8_t mdat[] mdat;typedef struct Atom{ unsigned int size; uint8_t tag[4]; int ver_flag; unsigned int num_of_entries; unsigned int pos; uint8_t *data;} Atom;uint8_t kmp3[] {0x6D,0x73,0x00,0x55};uint8_t fmp3[] .mp3;uint8_t raw[] raw ;uint8_t wave[] wave;uint8_t mp4a[] mp4a;uint8_t enca[] enca;//encrypted to ISO/IEC 14496-12 or 3GPP standardsuint8_t smar[] smar;//encoded to 3GPP GSM 6.10 AMR narrowband standardsuint8_t sawb[] sawb;//encoded to 3GPP GSM 6.10 AMR wideband standardsuint8_t m4ds[] m4ds;//encoded to ISO/IEC 14496-10 AVC standardsuint8_t esds[] esds;uint8_t fram[] fram;#define MKTAG(a,b,c,d) (a | (b 8) | (c 16) | (d 24))typedef struct AVCodecTag { int id; unsigned int tag;} AVCodecTag;typedef struct stsdtable{ unsigned int size; char format[4]; int res1; int ref; short version; short pad1; int pad2; short channels; short bitspersample; short compress_id; short res2; short samplerate1; short samplerate2; //{if(version1) int sampleperpacket; int bytesperpacket; int bytesperframe; int bytespersample; //}} stsdtable;typedef struct sampletable{ unsigned int size; unsigned int id_of_sd;} sampletable;//MP4Analyze.cpp#include MP4Analyze.h#include vector#include map#include iostream#include string#ifdef WIN32#include winsock2.h#pragma comment(lib, Ws2_32.lib)#pragma warning (disable:4786)#endif#ifdef __GNUG__#include netinet/in.h#endifusing namespace std;int check_format(uint8_t *data, int size){ if(strncmp((char*)moov,(char*)(data4),4)0 || strncmp((char*)ftyp,(char*)(data4),4)0 ||strncmp((char*)mdat,(char*)(data4),4)0 ) return 0; return -1;}unsigned int get_size(const uint8_t *data,int size){ unsigned int tmp 0; for(int i0; isize; i) { tmp 8; tmp *data; } return tmp;}int seek_tag(uint8_t tag[],uint8_t *data, unsigned int size1,uint8_t **pos,unsigned int *size2){ if(data NULL || size1 0) return -1; unsigned int tag_size get_size(data,4); if(tag_size size1 8) return -1; unsigned int tmp 0; while(strncmp((char*)data4,(char*)tag,4) ! 0) { // printf(%s/n,data4); if(tag_size0) return -1; if(tag_size size1 8) { data tag_size; tmp tag_size; } else return -1; tag_size get_size(data,4); } printf(find :%c%c%c%c/n,tag[0],tag[1],tag[2],tag[3]); if(tmp tag_size size1 ) printf(warning: the atom may be not complete!/n); *pos data8; *size2 tag_size -8; return tmp;}
v文章转载自http://blog.csdn.net/flyingqr/archive/2010/02/02/5282600.aspx 版权归原作者编辑小乙哥vectorstsdtable get_audio_info(uint8_t *data, unsigned int size, vectorstsdtable stable)//stsd{ uint8_t * datapos data; Atom *stsd_audio (Atom *)data; int tmp_size 16; printf(size : %u/n,ntohl(stsd_audio-size)); printf(num_entr: %u/n,ntohl(stsd_audio-num_of_entries)); for(int i0; i ntohl(stsd_audio-num_of_entries); i) { if(tmp_size size)//注意 return stable; datapos tmp_size; stsdtable * audio_entry (stsdtable *)(datapos); stable.push_back(*audio_entry);//这里存入的是网络序的数据使用时需进行转换 tmp_size ntohl(audio_entry-size); printf(--tablesize: %d/n,ntohl(audio_entry-size)); printf(--format : %s/n,audio_entry-format); printf(--version : %d/n,ntohs(audio_entry-version)); printf(--channels: %d/n,ntohs(audio_entry-channels)); printf(--bitpersam: %d/n,ntohs(audio_entry-bitspersample)); printf(--IDcompress: %d/n,ntohs(audio_entry-compress_id)); printf(--samplerate: %d.%d/n,ntohs(audio_entry-samplerate1),ntohs(audio_entry-samplerate2)); tmp_size sizeof(stsdtable); if(ntohs(audio_entry-version)0) { tmp_size - 16; } datapos tmp_size; //if(ntohs(audio_entry-compress_id)-2)//此处尚需考证 if(ntohl(audio_entry-size) sizeof(stsdtable)) { printf(----atom size:%d/n,get_size(datapos,4)); printf(----atom name:%c%c%c%c/n,datapos[4],datapos[5],datapos[6],datapos[7]); if(strncmp((char*)datapos,(char*)esds,4)0) { //handle esds } } } return stable;}mapunsigned int,sampletable get_packet_offset(uint8_t *STBL[], mapunsigned int,sampletable table){ //table.insert(pairlong,sampletable(1,sample)); unsigned int num_sam_to_chunk get_size(STBL[0]-4,4);//stsc unsigned int num_sample get_size(STBL[1]-4,4);//stsz unsigned int num_chunk get_size(STBL[2]-4,4);//stco unsigned int chunk_index 0; unsigned int next_chunk_index 0; uint8_t *cur_sam_to_chunk STBL[0]; uint8_t *cur_sam_size STBL[1]; uint8_t *cur_chunk_offset STBL[2]; sampletable sample; printf(number of stsc entries:%d /nnumber of sample size:%d /nnumber of chunk offset:%d/n,num_sam_to_chunk,num_sample,num_chunk); for(unsigned int i 0; i num_sam_to_chunk; i)//对所有的entries { chunk_index get_size(cur_sam_to_chunk,4); next_chunk_index get_size(cur_sam_to_chunk12,4); sample.id_of_sd get_size(cur_sam_to_chunk8,4); if(i num_sam_to_chunk -1)//最后一个 { next_chunk_index num_chunk1; } printf(chunk_index:(%d---%d)/n,chunk_index,next_chunk_index); for(unsigned int kchunk_index; k next_chunk_index; k)//当前chunk序号到下一个chunk序号之间的chunk {//处理所有重复的chunk printf(chunk_index:%d sample num:%d/n,chunk_index,get_size(cur_sam_to_chunk4,4)); unsigned int offset get_size(cur_chunk_offset(chunk_index-1)*4,4); for(unsigned int j0; j get_size(cur_sam_to_chunk4,4); j)//chunk内地sample数目 {//处理该chunk中的sample sample.size get_size(cur_sam_size,4); printf(--sample offset:%d %x size:%d/n,offset,offset,sample.size); table.insert(pairunsigned int,sampletable(offset,sample)); offset offset sample.size; cur_sam_size 4; } system(pause); chunk_index; } cur_sam_to_chunk 12; } return table;}文章转载自http://blog.csdn.net/flyingqr/archive/2010/02/02/5282600.aspx 版权归原作者编辑小乙哥int seek_audio_atom( uint8_t *data1, unsigned int size1){ uint8_t tag[] mdiaminfsmhd; uint8_t *datapos; unsigned int tag_size; uint8_t *data; unsigned int size; int offset_of_atom 0; if((offset_of_atom seek_tag(moov, data1, size1, data, size)) -1) return -1; if(offset_of_atom size size1) { //some handles printf(moov atom is not complete,need more data); } data1 data; size1 size; uint8_t *nexttrak data; unsigned int traksize size; int i0; while(1) { printf(-----/n); if(seek_tag(trak, nexttrak, traksize, datapos, tag_size) ! -1) { nexttrak datapos tag_size; if(size1 (nexttrak - data1)) return -1; traksize size1 - (nexttrak - data1); data datapos; size tag_size; } else { return -1; } i0; while(i3) { if(seek_tag(tagi*4, data, size, datapos, tag_size) ! -1) { if(i2) break; data datapos; size tag_size; i; } else { break; } } if(strncmp(smhd,(char*)(datapos-4),4) 0) { if(seek_tag(stbl, data, size, datapos, tag_size)! -1) { printf(—find audio stbl—!/n); data datapos; size tag_size; if(seek_tag(stsd, data, size, datapos, tag_size) ! -1) { vectorstsdtable stable; //音频信息 get_audio_info(datapos-8, tag_size,stable); } uint8_t *STBL[3] {NULL,NULL,NULL};// uint8_t *datapos1; unsigned int tag_size1;// if(seek_tag(stsc, data, size, datapos1, tag_size1) ! -1) { STBL[0] datapos1 8; } uint8_t *datapos2; unsigned int tag_size2; if(seek_tag(stsz, data, size, datapos2, tag_size2) ! -1) { STBL[1] datapos2 12; } uint8_t *datapos3; unsigned int tag_size3; if(seek_tag(stco, data, size, datapos3, tag_size3) ! -1) { STBL[2] datapos3 8; } if(STBL[0] STBL[1] STBL[2] ) { mapunsigned int,sampletable postable;//音频帧信息 get_packet_offset(STBL,postable); } } return 0; } } return -1;}int main(char arg, char *argv[]){ FILE *mp4; coutplease input the file name :endl; string filename; cinfilename; mp4 fopen(filename.c_str(),rb); uint8_t buffer[300000]; fread(buffer,1,300000,mp4); seek_audio_atom((uint8_t*)buffer,300000); fclose(mp4); return 0;}