自动视频录像-用于I/O性能测试



从事视频行业的程序员 经常需要录制视频文件 验证性能,
该类实现了固定文件录像,自动切片,应用层缓存       
支持多路录像使用多个对象即可。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;
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值