DSPack 定位播放问题(100分)

  • 主题发起人 主题发起人 asiatony
  • 开始时间 开始时间
A

asiatony

Unregistered / Unconfirmed
GUEST, unregistred user!
用DSPack 2.3.4 做定位播放器,播放的是xvid的avi文件
procedure play;
begin

if not FilterGraph.Active then
FilterGraph.Active := true;
FilterGraph.ClearGraph;
FilterGraph.RenderFile('C:/1234.avi');
SoundLevel.Position := FilterGraph.Volume;
FilterGraph.play;
end;


procedure locate;
var
zero, duration: int64;
FMediaSeeking: IMediaSeeking;
begin

//ONE_SECOND = 10000000;
Zero := strtoint(edit1.text) * 10000000;
//从第n秒开始播放
duration := 0;
try
FilterGraph.QueryInterface(IMediaPosition, FMediaPosition);
myresult := FMediaSeeking.SetPositions(Zero,AM_SEEKING_AbsolutePositioning,Duration,AM_SEEKING_NoPositioning);
finally
FMediaSeeking:=nil;
end;

end;


play后, 设置edit1 再locate.

定位 前3分34秒都没有问题,从3分35秒后就没有反应了,都是从最开始播放.
跟踪发现
当edit1.text=214 即3分34秒时 zero的值为2140000000, 可以正常定位到正确的位置播放
当edit1.text=215 即3分35秒时 zero的值为负数,就无法正常定位了.
zero我已定义为int64了.

请教各位大侠了.

谢谢
 
修改些行
Zero := strtoint(edit1.text) * 10000000;
//从第n秒开始播放

Zero := strtoint(edit1.text);
Zero:= Zero * 10000000;
//从第n秒开始播放
 
设置edit1 再locate. 再play

如果要Play后,再设置edit1 ,这里最好停一下, 再locate.再Play

//从哪里开始播放
procedure TFilterGraph.SetCurrPos(Value: int64);
var
MediaSeeking: IMediaSeeking;
RefTime: int64;
begin

if Succeeded(QueryInterface(IMediaSeeking, MediaSeeking)) then

begin

RefTime := MiliSecToRefTime(Value)

MediaSeeking.SetPositions(RefTime,AM_SEEKING_AbsolutePositioning, Int64(nil^), AM_SEEKING_NoPositioning);
MediaSeeking := nil;
end;

end;


//从哪里播放到哪里

procedure TFilterGraph.SetPositions(StartPos, EndPos: int64);
var
MediaSeeking: IMediaSeeking;
RefTime1, RefTime2: int64;
begin

if Succeeded(QueryInterface(IMediaSeeking, MediaSeeking)) then

begin

RefTime1 := MiliSecToRefTime(StartPos)
RefTime2 := MiliSecToRefTime(EndPos)

MediaSeeking.SetPositions(RefTime1, AM_SEEKING_AbsolutePositioning, RefTime2, AM_SEEKING_AbsolutePositioning);
MediaSeeking := nil;
end;

end;
 
zhongs, 分2步计算和1步计算有什么区别? 能解释一下么?

谢谢lqcros, 使用了MiliSecToRefTime 可以了.

目前我是在formcreate时先播放, 在定位按钮里写locate, 当窗体创建时就开始播放了,此时再去点击定位按钮,就可以跳到指定位置播放.代码如下:
var
StartPos: int64;

procedure TfrmViewVideo.FormCreate(Sender: TObject);
begin

if not FilterGraph.Active then
FilterGraph.Active := true;
FilterGraph.ClearGraph;
FilterGraph.RenderFile('c:/1234.avi');
SoundLevel.Position := FilterGraph.Volume;
StartPos := XXXXX;
FilterGraph.play;
// FilterGraph.Stop;
// LocateVideo;
// FilterGraph.Play;
end;


procedure TfrmViewVideo.LocateVideo;
var
FMediaSeeking: IMediaSeeking;
RefTime: int64;
begin

RefTime := MiliSecToRefTime(StartPos);
if Succeeded(QueryInterface(IMediaSeeking, FMediaSeeking)) then

begin

FMediaSeeking.SetPositions(RefTime,AM_SEEKING_AbsolutePositioning,Int64(nil^), AM_SEEKING_NoPositioning);
FMediaSeeking:=nil;
end;

end;


procedure TfrmViewVideo.ToolButton2Click(Sender: TObject);
begin

LocateVideo;
end;


但我希望做到的是在formcreate时,就在指定位置开始播放. 我是先locate 再播放的,可无法定位播放,总是从最开始播放, 这样写问题出在什么地方呢?
procedure TfrmViewVideo.FormCreate(Sender: TObject);
begin

if not FilterGraph.Active then
FilterGraph.Active := true;
FilterGraph.ClearGraph;
FilterGraph.RenderFile('c:/1234.avi');
SoundLevel.Position := FilterGraph.Volume;
StartPos := XXXXX;
LocateVideo;
FilterGraph.Play;
end;


这样我也试了也不行
FilterGraph.Play
FilterGraph.Stop;
or FilterGraph.Pause;
LocateVideo;
FilterGraph.Play
 
strtoint(edit1.text) * 10000000 因为计算这个表达式时,已经超出了integer的范围,
Zero := strtoint(edit1.text) * 10000000;
// 是先integer溢出再转为int64
正确也可以这样先转换后计算
Zero := Int64( strtoint(edit1.text)) * Int64(10000000);
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
1K
import
I
I
回复
0
查看
680
import
I
后退
顶部