使用avilib庫進行avi文件的讀寫
#include <stdio.h>
#include <stdlib.h>
#ifdef _WIN32
#include <windows.h>
#else
typedef long DWORD;
#endif
#include "avilib.h"
/*
avi轉avi
by notsobad
使用avilib進行avi文件的讀寫
這個例子是用來將一個avi寫入另一個avi
just a simple test
*/
int main(int argc, const char **argv)
{
char * vidbuf = malloc(327680);
char * audbuf = malloc(100000);
long framesize;
avi_t *avifile;
avi_t* pAviHandle;
int frame;
int frames;
int framew = 0;
int frameh = 0;
double framerate = 0.0f;
pAviHandle = AVI_open_output_file("test.avi");
if(!pAviHandle)
{
printf("avi file open failed /n");
return -1;
}
avifile = AVI_open_input_file("../vp31.avi", 1); //打開源文件
frames = AVI_video_frames(avifile);
framew = AVI_video_width(avifile);
frameh = AVI_video_height(avifile);
framerate = AVI_frame_rate(avifile);
AVI_set_video(pAviHandle,framew,frameh,framerate,AVI_video_compressor(avifile));//設置video文件頭
AVI_set_audio(pAviHandle, AVI_audio_channels(avifile),
AVI_audio_rate(avifile),
AVI_audio_bits(avifile),
AVI_audio_format(avifile),
AVI_audio_mp3rate(avifile));
//設置audio文件頭
//framesize=(long)framew*frameh*3/2;
if (AVI_seek_start( avifile )) //尋找文件開始
{
printf("bad seek start/n");
return -2;
}
for (frame = 0; frame < frames;frame++)//read and write avi per fream
{
int iskeyframe;//if it's keyframe
AVI_set_video_position(avifile, frame);//將avi文件移動到第fream幀
long audio_bytes=AVI_audio_size(avifile,frame);//get audo size
AVI_read_frame(avifile,(char *)vidbuf,&iskeyframe);//read fream set video into vidbuf
AVI_read_audio(avifile, (char *)audbuf,audio_bytes);//set audio into audbuf
/*
long AVI_audio_size(avi_t *AVI, long frame)
int AVI_write_audio(avi_t *AVI, char *data, long bytes)
long AVI_read_audio(avi_t *AVI, char *audbuf, long bytes)
*/
AVI_write_frame(pAviHandle,vidbuf,AVI_frame_size(avifile, frame),iskeyframe);//write video fream by fream
AVI_write_audio(pAviHandle,audbuf,audio_bytes);//write audio fream by fream
}
AVI_close(pAviHandle);
AVI_close(avifile);
return 1;
}
avilib庫下載:http://download.csdn.net/detail/u011403718/9670611