首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

有对AVI文件了解的吗?该怎么处理

2012-02-20 
有对AVI文件了解的吗?我把音频数据保存成AVI文件,文件信息头都写了,KMPlay能播放(但时间没走动,时间滚动轴

有对AVI文件了解的吗?
我把音频数据保存成AVI文件,文件信息头都写了,
KMPlay能播放(但时间没走动,时间滚动轴也没动,可是声音能正常播放),暴风影音播放不了(注:只要格式没错暴风影音就能播放)

这种现象有可能是什么原因呢?

主要代码如下:一个是信息头,一个是写数据

有些参数怎么确定

C/C++ code
//音频头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}


[解决办法]
是不是文件格式没对,还是信息不全

找些avi格式资料看看

http://www.xici.net/b571992/d31844976.htm
[解决办法]
不懂,友情帮顶
[解决办法]
应该还要在文件尾写index吧
[解决办法]
typedef struct _avimainheader {
FOURCC fcc; // 必须为‘avih’
DWORD cb; // 本数据结构的大小,不包括最初的8个字节(fcc和cb两个域)
DWORD dwMicroSecPerFrame; // 视频帧间隔时间(以毫秒为单位)
DWORD dwMaxBytesPerSec; // 这个AVI文件的最大数据率
DWORD dwPaddingGranularity; // 数据填充的粒度
DWORD dwFlags; // AVI文件的全局标记,比如是否含有索引块等
DWORD dwTotalFrames; // 总帧数
DWORD dwInitialFrames; // 为交互格式指定初始帧数(非交互格式应该指定为0)
DWORD dwStreams; // 本文件包含的流的个数
DWORD dwSuggestedBufferSize; // 建议读取本文件的缓存大小(应能容纳最大的块)
DWORD dwWidth; // 视频图像的宽(以像素为单位)
DWORD dwHeight; // 视频图像的高(以像素为单位)
DWORD dwReserved[4]; // 保留
} AVIMAINHEADER;

热点排行