1394采集视频文件大于4G自动切割

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1394采集视频文件大于4G自动切割相关的知识,希望对你有一定的参考价值。

用1394卡采集的时候 文件大于4G自动切割成 04.001 04.002与04.avi
三个文件 在本机器上打开04.avi就可以看全部的也就是自动加载另外两个
但把这三个文件拷贝到别的机器上就看不了
谁有办法能吧文件合并 或者 让在别的机器上能看?

思想很简单,将原来的文件统一当作二进制文件依次读取,然后依次写入一个新的二进制文件中,这样就完成了合并操作;反向操作就可以分割文件了……

先自己定义一个通用的文件表示,比如说下列格式:文件名长度(4字节),文件名,文件长度(4字节),文件内容。然后新建一个文件,将你要加入的文件依次写进(当作二进制文件)。

至于还原吗,先读入合并后的文件,然后依次按以下过程还原文件:读入文件名长度,按此长度得到文件名,读入文件长度,按此长度得到文件的内容,写到磁盘上即可。具体的编程见以下例子:

//以下为文件合并与分解函数,合并文件后的文件中各子文件顺序存放,格式为:

//文件名长度(int)、文件名、文件长度(int)、文件内容

//---------------------------------------------------------------------------

//将文件SoruceFile合并到文件DestFile中

bool MergeFile(AnsiString SourceFile,AnsiString DestFile)

int iSourceFileHandle,iDestFileHandle,iSize,iBytesRead,iBytesWrite;
char sTemp[MAX_PATH];
iSourceFileHandle=FileOpen(SourceFile,fmOpenRead|fmShareDenyNone);
if(iSourceFileHandle<0)

sprintf(sTemp,"无法打开文件%s.",SourceFile.c_str());
mErrorMsg(sTemp);
return false;

if(FileExists(DestFile))
iDestFileHandle=FileOpen(DestFile,fmOpenWrite);
else
iDestFileHandle=FileCreate(DestFile);
if(iDestFileHandle<0)

sprintf(sTemp,"无法打开文件%s.",DestFile.c_str());
mErrorMsg(sTemp);
FileClose(iSourceFileHandle);
return false;

FileSeek(iDestFileHandle,0,2); //指针移到文件尾
char *Buffer=new char[1024];

__try

AnsiString FileName=ExtractFileName(SourceFile); //不带路径的文件名
iSize=FileName.Length();
if(FileWrite(iDestFileHandle,(char *)&iSize,sizeof(iSize))!=sizeof(iSize))

mErrorMsg("写文件名长度时出错.");
return false;

if(FileWrite(iDestFileHandle,FileName.c_str(),iSize)!=iSize)

mErrorMsg("写文件名时出错.");
return false;

iSize=FileSeek(iSourceFileHandle,0,2); //文件长度
if(FileWrite(iDestFileHandle,(char *)&iSize,sizeof(int))!=sizeof(iSize))

mErrorMsg("写文件长度时出错.");
return false;

FileSeek(iSourceFileHandle,0,0); //指针移到文件头
//拷贝文件
do

iBytesRead=FileRead(iSourceFileHandle,Buffer,1024);
iBytesWrite=FileWrite(iDestFileHandle,Buffer,iBytesRead);
if(iBytesWrite!=iBytesRead)

mErrorMsg("写入数据时出错.");
return false;

while(iBytesRead==1024);


__finally

FileClose(iSourceFileHandle);
FileClose(iDestFileHandle);
delete [] Buffer;

return true;


//---------------------------------------------------------------------------

//从合并所得的文件中分离出各个文件,bProgress决定是否显示进度条

bool SeperateFile(AnsiString SourceFile,AnsiString DestPath,bool bProgress)

int iSourceFileHandle=-1,iDestFileHandle=-1,iSize,iBytesRead,iBytesWrite;
AnsiString DestFile;
char *Buffer=NULL;
char sTemp[MAX_PATH];
iSourceFileHandle=FileOpen(SourceFile,fmOpenRead);
if(iSourceFileHandle<0)

sprintf(sTemp,"无法打开文件%s.",SourceFile.c_str());
mErrorMsg(sTemp);
return false;

int iFileSize=FileSeek(iSourceFileHandle,0,2); //得到文件长度
if(bProgress) //显示进度条

DlgProgress->Initialize(iFileSize,"恢复数据库从“"+SourceFile+"”到“"+DestPath+"”");
DlgProgress->Show();

FileSeek(iSourceFileHandle,0,0); //回到文件头
Buffer=new char[1024];
__try

while(FileSeek(iSourceFileHandle,0,1)<iFileSize)//是否时文件尾

if(bProgress&&g_bProcessEndByUser) //用户通过进度条终止
break;
int iStepBy=0; //进度条推进的步长
//读入文件名长度
iBytesRead=FileRead(iSourceFileHandle,(char *)&iSize,sizeof(iSize));
if(iBytesRead!=sizeof(iSize))

mErrorMsg("读入文件名长度时出错.");
return false;

iStepBy+=iBytesRead;
//读入文件名
Buffer[iSize]=0; //写入文件名字符串结束符
iBytesRead=FileRead(iSourceFileHandle,Buffer,iSize);
if(iBytesRead!=iSize)

mErrorMsg("读入文件名时出错.");
return false;

iStepBy+=iBytesRead;
//读入文件长度
iBytesRead=FileRead(iSourceFileHandle,(char *)&iSize,sizeof(iSize));
if(iBytesRead!=sizeof(iSize))

mErrorMsg("读入文件名长度时出错.");
return false;

iStepBy+=(iBytesRead+iSize);
if(bProgress)
DlgProgress->Step(iStepBy);
DestFile=DestPath+AnsiString(Buffer);
iDestFileHandle=FileCreate(DestFile);
if(iDestFileHandle<0)

sprintf(sTemp,"无法创建文件%s.",DestFile.c_str());
mErrorMsg(sTemp);
return false;

//拷贝数据
for(int i=0;i<iSize/1024;i++)

iBytesRead=FileRead(iSourceFileHandle,Buffer,1024);
iBytesWrite=FileWrite(iDestFileHandle,Buffer,1024);
if(iBytesRead!=1024||iBytesWrite!=1024)

mErrorMsg("拷贝数据时出错.");
return false;


iSize=iSize%1024; //剩下的未读入数据
if(iSize==0)

FileClose(iDestFileHandle);
iDestFileHandle=-1;
continue;

iBytesRead=FileRead(iSourceFileHandle,Buffer,iSize);
iBytesWrite=FileWrite(iDestFileHandle,Buffer,iSize);
if(iBytesRead!=iSize||iBytesWrite!=iSize)

mErrorMsg("拷贝数据时出错.");
return false;

FileClose(iDestFileHandle);
iDestFileHandle=-1;



__finally

FileClose(iSourceFileHandle);
if(iDestFileHandle>0)
FileClose(iDestFileHandle);
delete [] Buffer;
if(bProgress&&DlgProgress->Visible)
DlgProgress->Close();

return true;
参考技术A FAT32的文件系统不支持大于4G的文件,所以无法合并,请将你的文件系统改为NTFS,采集后就是一个完整的文件,也可以合并大于4G的文件了! 参考技术B 简单的合并软件可以用“超级解霸”、“Total Video Converter”,专业的可以用Adobe Premiere pro 2.0本回答被提问者采纳

以上是关于1394采集视频文件大于4G自动切割的主要内容,如果未能解决你的问题,请参考以下文章

视频采集卡的类别和功能?

linux备份到FAT32U盘大于4G会自动切分吗

使用ffmpeg从视频文件中提取音频文件视频抽帧和切割视频

JavaCV开发详解之27补充篇1:使用javacv把音视频切割成多个音频分片文件,以mp3为例,把视频切割成MP3分片文件

JavaCV开发详解之27补充篇1:使用javacv把音视频切割成多个音频分片文件,以mp3为例,把视频切割成MP3分片文件

Ffmpeg 实现文件切割