我想知道如何才能够将多个AVI文件合并成一个大的AVI文件(200分)

  • 主题发起人 主题发起人 leser
  • 开始时间 开始时间
L

leser

Unregistered / Unconfirmed
GUEST, unregistred user!
我有很多小的AVI视频文件,但是播放时感觉很麻烦,我想将他们全部合并成一个大的AVI文件,我用DELPHI该如何能够做到将他们全部合并成一个文件,并能够正常连续播放。

希望知道者能够贴出代码。谢谢
 
代码不会,不过adobe的视频软件ae,premier可以
 
我有
不过是从C翻译过来的
你自己找找吧
 
用copy 1.avi,3.avi toatal.avi
具体语法记不清楚了,好像上个月电脑报介绍过
 
但能连续放吗?如果不行,那可以用流文件写啊
 
可能大的avi文件,不能播放,
我用delphi7中的控件播放100M的文件
根本不能播放
 
LiGen错误,用copy 1.avi,3.avi toatal.avi不行
这样Copy 1.avi+2.avi 3.avi就可以了
 
只是简单地用COPY把所有文件串起来?对AVI好象不大行吧?
 
用如下方法可以连接文件
var
ms1,ms2:TMemoryStream;
begin

try
ms1 := TMemoryStream.Create;
ms2 := TMemoryStream.Create;

ms2.LoadFromFile('c:/1.avi');
ms1.CopyFrom(ms2,ms2.Size);
ms1.Seek(ms2.Size,0);
ms2.LoadFromFile('c:/2.avi');
ms1.CopyFrom(ms2,ms2.Size);
ms1.SaveToFile('c:/1and2.avi');
finally
ms1.Free;
ms2.Free;
end;

end;
虽然可以连接起来,但是除了第一个连接的小文件可以播放以外后边连接的就不能播放了,这个可能和AVI的文件头有关系,mpg格式的这样连接后是可以连续播放的。
 
另外用“流”的这种方法比较占资源,如果连接比较大的文件时需要做处理才行。
 
如果只能播放第一小节,那就等于失败。另外若是各个小文件尺寸不一致,连接后播放时就会出现重影(指MPEG文件)。我一直想解决这个问题,有谁能告诉我MPEG文件的格式?怎样从文件中提取出帧尺寸、帧速率等信息?
 
哈哈
AVI的分割比较容易
合并就很复杂了
因为它有很多索引值.要计算出来的/
 
给你切割AVI的关键部分代码吧,从一个C语言代码翻译过来的.合并的话应该反过来即可.
MPEG的也一样.
http://www.138soft.com/htm/AuthorSoft/download/mpegproducer.zip
rocedure fnChopAvi(FileName:String);
var
FileStream,FileStreamWrite:TFileStream;
nOriginallistOffset:integer;

nFrameCount,nExcessFrameCount:integer;
nAudioFrameCount,nExcessAudioFrameCount:integer;
caTempFilename:String;//tmpxxxxx.avi
//save previous movi offset, used in idx1 offset modifing
nThismoviOffset:integer;
StrTemp:String;//=caBufChar[0]+caBufChar[1]+caBufChar[2]+caBufChar[3];
i,j:integer;
TempByte:Byte;
nTempPosidx1:integer;
//used inside "for loop" bellow
nTempInt:integer;//more temp var.
nSizeTillidx1:integer;
nTotalSize:integer;
nNowOffset:integer;
begin

FileStream:=TFileStream.Create(FileName,fmOpenRead or fmShareDenyNone);
nOriginallistOffset := naListOffset[2];

//<<<<<<<<<<<<<<<<<
//notice these line, the value has been added for convinience
//>>>>>>>>>>>>>>>>>
inc(naListOffset[1],12);//move offset to movi data, 01wb...
inc(naListOffset[2],8);//move offset to idx1 data
naListOffset[5] := naListOffset[1];

//chopavi in while loop
while(TRUE)do

begin

nFrameCount:=0;nExcessFrameCount:=0;
nAudioFrameCount:=0;nExcessAudioFrameCount:=0;
//save previous movi offset, used in idx1 offset modifing
nThismoviOffset := naListOffset[5];


//==============calculate how many frame should be cut in one file========
FileStream.Seek(naListOffset[2],soFrombegin
ning);
//how many frame should be in a single file
//any single file should be start with keyframe, virtualdub said.
while(True)do

begin

if(FileStream.Position >= naListOffset[3]) then
//reach JUNK
begin

naListOffset[4] := FileStream.Position;
Break;
end;


FileStream.Read(caBufChar,4);//jump 01wb or 00dc
StrTemp:=caBufChar[0]+caBufChar[1]+caBufChar[2]+caBufChar[3];
//skip audio frame
if UpperCase(StrTemp)=(UpperCase('01wb')) then

begin

Inc(nAudioFrameCount);
FileStream.Seek(12,soFromCurrent);//move to next index
continue;
end
else
//video frame
begin

FileStream.Read(nBufInt,Sizeof(integer));
FileStream.Seek(8,soFromCurrent);

if(nBufInt = $10) then
//is keyframe
begin

if(nFrameCount <= LEAST_FRAME) then

begin

inc(nFrameCount);
continue;
end
else

begin

//is keyframe &amp;&amp;
is larger than LEAST_FRAME
//check if previous frame is audio frame
FileStream.Seek(-32,soFromCurrent);
FileStream.Read(caBufChar,4);
StrTemp:=caBufChar[0]+caBufChar[1]+caBufChar[2]+caBufChar[3];
FileStream.Seek(28,soFromCurrent);
if UpperCase(StrTemp)<>UpperCase('01wb')then
//if previous not a audio frame
begin

inc(nFrameCount);
continue;
end;


//move pointer back 1 + 1 step backward
//because we count excess 1 keyframe
//and I pretend that before video keyframe is audio frame
//because virtualdub told that avi begin
with audio frame
//and save it in naListOffset[4]
 
谢谢jingtao, 谢谢高手!你的内容涉及不少,我得回去好好琢磨一下。
 
后退
顶部