从事视频行业的程序员 经常需要录制视频文件 验证性能,
该类实现了固定文件录像,自动切片,应用层缓存
支持多路录像使用多个对象即可。fileindex需要加锁
使用 :
FileRecord ObjRecord[8];
ObjRecord[channel].Record(channel,data,len);
FileRecord.h
#ifndef _FILE_RECORD_H
#define _FILE_RECORD_H
#include <stdlib.h>
#include <stdio.h>
class FileRecord
{
public:
FileRecord();
~FileRecord();
public:
int Record(int channel,const char* data,int len);
private:
int _size;
FILE* _fp;
char _filename[128];
char* _databuf;
char* _pos;
char* _dataend;
int _datasize;
};
#endif
FileRecord.cpp
#include "FileRecord.h"
#include <string.h>
#include <errno.h>
static int fileindex = 0;
const static int FIX_SIZE = 1024*1024*64;
const static int DATA_BUF_SIZE = 1024*1024*2;
FileRecord::FileRecord()
{
_fp = NULL;
_size = 0;
_databuf = new char[DATA_BUF_SIZE];
_pos = _databuf;
_datasize = 0;
_dataend = _databuf+DATA_BUF_SIZE;
}
FileRecord::~FileRecord()
{
if (_fp)
fclose(_fp);
_fp = NULL;
if (_databuf)
delete[] _databuf;
_databuf = NULL;
}
int FileRecord::Record(int channel,const char* data,int len)
{
if (!_fp)
{
char buf[128]={0};
sprintf(buf,"/mnt/usb/CH%02d%05d.raw",channel,fileindex++);
strcpy(_filename,buf);
_fp = fopen(buf,"wb");
_size = 0;
_pos = _databuf;
_datasize = 0;
if (!_fp)
{
printf("[FileRecord::Record] fopen F=%s err=%s!\n",buf,strerror(errno));
return -1;
}
printf("[FileRecord::Record] fopen F=%s OK!\n",buf,strerror(errno));
}
if (_dataend-_pos>=len)//写入缓存
{
memcpy(_pos,data,len);
_pos += len;
_datasize += len;
}
else//剩余大小不够放入则写入文件
{
int tmplen = fwrite(_databuf,_datasize,1,_fp);
if (tmplen != 1)
{
printf("[FileRecord::Record] fwrite F=%s err=%s!\n",_filename,strerror(errno));
return -2;
}
_size += _datasize;
//缓存写入文件后缓存复位
_pos = _databuf;
_datasize = 0;
//是否需要切片
if (_size>=FIX_SIZE)
{
fclose(_fp);
_fp = NULL;
printf("[FileRecord::Record] fclose F=%s OK!\n",_filename);
}
}
return 0;
}