关于MPG文件的操作(200分)

  • 主题发起人 叶不归
  • 开始时间

叶不归

Unregistered / Unconfirmed
GUEST, unregistred user!
两个mpg文件(1.mpg,2.mpg),我想把它们合并成1个(3.mpg),

有人说直接物理连接就行了,于是我照做了,可是用MediaPlay打开3.mpg文件一看,

播放时长还是1.mpg的,怎么得到3.mpg实际的播放时长呢?

备注:
物理连接:
var Old, New: TFileStream;
begin

Old := TFileStream.Create('1.mpg', fmOpenReadWrite);
New := TFileStream.Create('2.mpg', fmOpenRead);
Old.Size := Old.Size + New.Size;

Old.Seek(0, 2);
Old.CopyFrom(New, 0);
Old.Free;
New.Free;
end;
 
忙碌中...
 
有人来聊聊吗?帮帮up也好啊
 
现在不忙了,开始提问.
1. 3.mpg中有2.mpg的内容吗?
2. 用超级解霸打开,看看长度与用MediaPlayer一样吗?
3. 1.mpg和2.mpg的码流一样吗?
 
Lee,
1. 有,3.mpg 就是1.mpg+2.mpg
2. 不好意思,我没有超解,而且程序里是用mcisendmessage,因此就算超解怎X我也不用。
3. 1和2大小,码流...完全一致。
 
呵呵,不是要你在程序中用超解,而是超解和MediaPlayer算mpg流长度的方法不一样.
看看结果后我好知道大概是什么问题.
呵呵,知道我的邮箱吧,把1and2都寄给我吧.
 
to lee,
1and2,是1.mpg和2.mpg吗?这里没有, 在宿舍才有。
就普通的mpg测就行了,你拿一个mpg复制一下,就有1和2了……

你知道mediaplay是怎么算时长的吗?他那个mediaplay.Length是怎么来的?
 
hehe,还是用的的mpg吧.
不是所有的mpg的格式都是一样的.
 
没人了吗?是不是嫌分太少,不够尽管说话。
 
收到你的mail了.
突然发现我的ultra edit到期了,问我要注册码,正在满世界找呢?
你有吗?ultra edit 32的.
 
呵呵,还死活找不到.把原理跟你说说吧.
打开第一个文件,看看结尾处有没有 00 00 01 B9如果有,就从把文件中最后一个 00 00 01 BA
后的部分删除(包括00 00 01 BA本身4个字节)
打开第二个文件,把第二个00 00 01 BA前的部分删除(不包括这4个字节本身).
然后合并,1在前2在后.
试试吧.
good luck
 
00 00 01 BA 好象是MPEG2格式文件的头4个字节呀,怎么会...
不明白,真的不明白...,不明白中...
 
呵呵,把第二个文件的第一个描述结构的包和第一个文件的结束标记删掉后合并.是不是就可以了呢?
 
关注中......
 
刚才做了一下测试 :
选用两个MPG ,1.mpg , 2.mpg(同一个复制来的,内容完全一样)
超解播放显示 1:33
MediaPlay播放显示 2:05

用下面的代码把 1.mpg 和 2.mpg 合并成 3.mpg

procedure TForm1.Button1Click(Sender: TObject);
var Source1,Source2,Target: TFileStream;
begin

Source1 := TFileStream.Create('1.mpg',FmOpenRead);
Source2 := TFileStream.Create('2.mpg',FmOpenRead);
Target := TFileStream.Create('3.mpg',fmcreate);
Target.Position := 0;
Target.CopyFrom(Source1,0);
Target.Seek(0,soFromEnd);
Target.CopyFrom(Source2,0);
Source1.Free;
source2.Free;
Target.Free;
end;


用超解和MediaPlay分别播放 3.mpg
超解显示 3:06
MediaPlay 显示 4:05
而且两种播放器均能正常播放 3.mpg , 内容就是两个 1.mpg 连续播放了2次.

呵呵, 和楼主的测试不太一样啊~

使我不明白的是 , 为什么这样的合成文件也能被播放器正确识别呢?? :)~~

继续关注......
 
呵呵, 又做了一个测试 :

找两个不同编码的MPG文件 1.mpg , 2.mpg 合成 3.mpg

如果 1.mpg + 2.mpg = 3.mpg then
3.MPG中的 2.MPG部分播放不正常, 出现声音和画质的
失真.

如果 2.MPG + 1.MPG = 3.MPG then
3.MPG中的 1.MPG部分播放不正常, 出现声音和画质的
失真.

由此可见 , 当直接连接两个MPG文件时, 只有第一个文件的文件头能被播放器正确识别 .

我想应该是这样的.
 
尽管没试过,不过应该可以这样连接
1.mpg全部取过来,2.mpg从00 00 0a ba开始,把它追加到1.mpg后面,可以合并成新得
mpg文件。但是这样的合并要正确解码得话,得有一个条件,那就是文件的基本信息
应该一样,主要比较00 00 01 b3后面的内容可以知道
2。如果你是vcd格式的mpg文件,恭喜你,你可以利用下面的公式取得总时间长度,
time=FileSize/75/2352
3.如果不是标准的vcd格式,你只好以这种方式来了
a.算出000001ba的个数count
b.count/75就是大致的时间--秒为单位
 
to yan_hui:
文件格式、解码程序不一样啊!我的mpg是Ulead编制的,解码也是Ulead的。

to LeeChange:
不行:(

to lvxq:
我回去试试你的方法。

各位大侠,问题没有解决请继续。
 
顶部