我们在做avi的录制时,最重要的结构体是
typedef struct tagAVI_FILE_INFO
{
AVI_HEADER_INFO file_header; //在录制avi文件(一)——avi文件的结构 有详细列举
AVI_IndexRecorder index_recorder;
void* index_tmpstream;
int32 index_writealready;
int32 sec_per_frame;
uint32 video_frames;
uint32 video_length;
uint32 audio_frames;
uint32 audio_length;
uint32 movi_length;
uint32 movi_start;
uint32 trunk_position;
char audio_tags[8];
uint32 audio_cachebytes;
char* audio_cachebuffer;
uint32 data_cachebytes;
char* data_cachebuffer;
void* file_stream;
int32 file_position;
int32 (*read_func) (void *file, char* buffer, int32 readbytes);
int32 (*write_func)(void *file, char* buffer, int32 writebytes);
int32 (*seek_func) (void *file, int32 ioffset, int32 mode);
int32 (*tell_func) (void *file);
}avi_record_infor_t;
typedef struct
{
char tags[8];
uint32 total_entries;
uint32 cache_entries;
AVI_IndexTable *cache_table; } AVI_IndexRecorder;
typedef struct
{
uint32 chunk_id; /* 4 bytes in file */
uint32 chunk_flags; /* 4 bytes in file */
uint32 chunk_offset; /* 4 bytes in file */
uint32 chunk_size; /* 4 bytes in file */
} AVI_IndexTable;
1、保存avi文件的头信息
调用流程
media_recorder_file_open //首先,有fileopen的操作,使以后基于文件的操作都有了句柄
->me_muxer_open
->muxer_avi_init
->avi_record_init / avi_write_headerinfor
avi_record_init : 主要是初始化结构体AVI_HEADER_INFO,具体初始化的值在录制avi文件(一)——avi文件的结构 有详细列举。
avi_write_headerinfor : 将AVI_HEADER_INFO file_header数据copy到data_cachebuffer ; 并创建临时文件index_tmpstream保存index表。
2、保存音频视频数据
调用流程
media_recorder_audio_write_frames/media_recorder_video_write_frames
->muxer_avi_write_audio_frames/muxer_avi_write_video_frames
->avi_write_audio_frames/avi_write_video_frames
avi_write_audio_frames : 将音频数据保存到文件,并将对应的index信息保存到临时文件index_tmpstream,具体流程参考录制avi文件(二)——设置数据缓冲区
avi_write_video_freames:将视频数据保存到文件,并将对应的index信息保存到临时文件index_tmpstream,具体流程参考录制avi文件(二)——设置数据缓冲区
3、保存index文件
调用流程
media_recorder_file_close
->me_recorder_close
->me_muxer_close
->muxer_avi_release
->avi_record_release
->avi_mux_indextable2datafile
avi_mux_indextable2datafile: 将临时文件index_tmpstream中的index数据通过data_cachebuffer保存到avi的文件file_stream中。