有对AVI文件了解的吗?
我把音频数据保存成AVI文件,文件信息头都写了,
KMPlay能播放(但时间没走动,时间滚动轴也没动,可是声音能正常播放),暴风影音播放不了(注:只要格式没错暴风影音就能播放)
这种现象有可能是什么原因呢?
主要代码如下:一个是信息头,一个是写数据
有些参数怎么确定
//音频头int add_audio_stream_header(unsigned char *hdr){ unsigned int video_fourcc; video_fourcc = FOURCC("U "); PUT_32(hdr, FOURCC("LIST")); PUT_32(hdr + 4, 12 - 8 + 64 + 26); //(12-LIST -大小) + strh(56+8) +strf(8+56) + strf(8+) PUT_32(hdr + 8, FOURCC("strl")); //strh PUT_32(hdr + 12, FOURCC("strh")); PUT_32(hdr + 12 + 4, 64 - 8); //本结构的大小 PUT_32(hdr + 12 + 8, FOURCC("auds")); //数据种类 PUT_32(hdr + 12 + 12, video_fourcc); //音频加码驱动代号 或 1 PUT_32(hdr + 12 + 28, 1); //数据量,音频采样大小 和 采样数 的比率会影响音频 PUT_32(hdr + 12 + 32, 48000<< 2); //采样数 PUT_32(hdr + 12 + 40, /*abytes>> 2*/ avi_frame_count); //数据流的数量 PUT_32(hdr + 12 + 44, 48000 << 1); //建议缓冲区的大小 PUT_32(hdr + 12 + 52, 1); //音频采样大小 //strf PUT_32(hdr + 12 + 64, FOURCC("strf")); PUT_32(hdr + 12 + 64 + 4, 26 - 8); // ? 24 ??? PUT_16(hdr + 12 + 64 + 8, 85); //音解码驱动代号 有影响 PUT_16(hdr + 12 + 64 + 10, 2); //声道数 PUT_32(hdr + 12 + 64 + 12, 4); //采样率 PUT_32(hdr + 12 + 64 + 16, 19200/*AVI_AUDIO_SAMPLE << 2*/); //WAVE声音中每秒的数据量 PUT_16(hdr + 12 + 64 + 20, 1/*4*/); //数据块的对齐标志 PUT_16(hdr + 12 + 64 + 22, 16); //此结构的大小 16 return 12 + 64 + 26;}//写数据void write_frame(unsigned char *data, int length, unsigned int fourcc, int key) //2{ unsigned char hdr[16]; unsigned int offset; if( NULL == avifd ) return; /* Write the AVI index record */ //索引 PUT_32(hdr, fourcc); PUT_32(hdr + 4, key ? 0x10 : 0); //offset = fseek(avifd, 0, SEEK_CUR); // //@@@@ fseek(avifd, 0, SEEK_CUR); offset = ftell(avifd); //@@@@ PUT_32(hdr + 8, offset - 1024 - 8); //offset = 当前文件的位置 PUT_32(hdr + 12, length); fwrite( hdr, 1, 16,idxfd ); //写索引 /* Write the frame data to the AVI file */ PUT_32(hdr + 4, length); fwrite( hdr, 1, 8,avifd ); fwrite( data, 1, (length + 1) & ~0x1 ,avifd );/* word-align with junk */ //zhengshu bei}