DirectShow配合WindowsMedia Encoder如何创建asf文件(300分)

  • 主题发起人 DragonPC_???
  • 开始时间
D

DragonPC_???

Unregistered / Unconfirmed
GUEST, unregistred user!
我使用Windows Media Encoder和Cyber StreamAuthor将一些屏幕操作Capture下来做成流式
媒体ASF文件。

多个asf文件片段,有的asf文件我需要截取asf流中间的一部分部分出来,有的asf文件需要
合成为一个大的asf流文件,应该如何解决?
 
我曾经问过上海微软的一位Media高手,他说,要针对asf的编辑几乎是不可能的,
而且就算有这样的工具,也是把他还原成avi再转回来的!并且微软内部也没有这样的工具!
这是他说的!
但是最近我看到一个asf cut工具,在搜新上有下载的!
他可以作asf的编辑,而且速度还可以!不知他是怎么实现的!
你可以参考一下!
 
如果可以将asf转换为avi就好了,我看了半天Windows Media Encoder SDK、Windows Media Format SDK
和Widnows Media Player SDK 文档,头都总了七八斤,都找不到这种逆转换的说明,只看到将avi转换为
asf的方法(用Media Encoder COM object),转不回来的

to SuperJS兄
那个asf cut在哪里下载,我怎么找不到的?
 
http://www.geocities.com/myasftools/
这个冬冬明显是Delphi(或者BC++)写的,各位兄弟知道这个软件是如何剪切、合成asf
文件的吗,知道的回个贴,俺另开两个帖子共600分答谢
(我给分一向爽快,不信看看俺的已答问题)
 
avi转换为asf可以做到(用控件),但asf转换为avi好像不可以吧(没见过)!
下面的代码都是随手贴的,不知道是否可行,不清楚ASF文件的具体格式,纯粹就是流的截取和合并!

//有的asf文件需要截取asf流中间的一部分部分出来,应该如何解决?
用这个过程试试!
procedure Splitfile( const sourcefilename: String;
blocksize: Longint );
var
targetfilename: String;
filecounter: Integer;
bytesRemaining, bytesToWrite: LongInt;
source, target: TFileStream;
begin

if not FileExists( sourcefilename ) or (blocksize < = 0) then

Exit;
source := TFileStream.Create( sourcefilename, fmOpenRead or fmShareDenyNone);
try
filecounter := 0;
bytesRemaining := source.Size;
while bytesRemaining > 0do

begin

targetfilename := ChangeFileExt( sourcefilename, Format('.%.3d', [filecounter]));
if blocksize < bytesRemaining then

bytesToWrite := blocksize
else

bytesToWrite := bytesRemaining;
target := TFileStream.Create( targetfilename, fmCreate );
try
target.CopyFrom( source, bytesToWrite );
bytesRemaining := bytesRemaining - bytesToWrite;
Inc( filecounter );
finally
target.Free;
end;

end;

finally
source.Free;
end;

end;


//多个asf文件需要合成为一个大的asf流文件,应该如何解决?
procedure TForm1.Button1Click(Sender: TObject);
var
mem2,mem1:tfilestream;
ss:tmemorystream;
begin

mem1:=tfilestream.Create ('c:/1.asf', fmOpenRead );
mem2:=tfilestream.Create ('c:/2.asf', fmOpenRead );
ss:=tmemorystream.Create
ss.CopyFrom(mem1,mem1.size);
ss.Seek(0,soFromEnd);
ss.CopyFrom(mem2,mem2.size);
ss.SaveToFile('c:/3.asf');
mem2.Free;
mem1.Free;
end;


其实你就用Stream的Seek定位Pos,然后拷贝指定区域即可保存截取的流,流合并也如此!
我只是单纯从流的操作而言,也许这样会破坏数据结构。最好还是知道Asf文件的具体格式就好办了。
ASF_header structure 有吗??? 也许会有头绪!!!
呵呵!其实自己已经觉得有些无厘头了!
关注Other's Answer!
 
这样好像不行吧,asf文件格式是专利格式,我们无法完全知道,仅仅据我所知,现在的asf文
件具有index header,用于快速定位媒体流,所以早期的asf文件无法快速定位到某个时间位
置,新的asf文件就可以,使用Media player 6.4 和Media Player 7.1的时候就可以感觉的到。
 
asf结构跟rm其实很类似,主要是文件头的问题,我觉得把文件头结构和它的索引结构搞
清楚就好办了。
 
按照常理的剪切是肯定不行的!
因为没有办法可以完整把文件头中的marker和script command一起提取出来!
如果利用了这种特效的asf文件就被损坏了!
但是asf tools 确实做到了!奇怪中~
 
Asf里面应该包含多种流,可能要先分离,再读取,再同步定位截取操作才行。
不知道它的具体格式,我看就没有办法,虽然也可以截取,但那样破坏了原有数据格式了。
去看看有没有第三方控件吧!
 
有个工具叫VirtrulDub 1.3A版可以把asf文件还原成avi 和 wav,记住一定要1.3A
以上版本的!
 
VirtrulDub提供了汇编和C的源码,我看起来有如天书,◎#¥%……,怨只怨自己学
艺不精,罢了,结帐吧。
 
其实用directFilter 可以把ASF 和wmv 转换成AVI 的. 呵呵.可惜问题结束了.
 
顶部