一个难题,头发抓掉了好多都解决不了! ( 积分: 100 )

  • 主题发起人 主题发起人 chrysalis
  • 开始时间 开始时间
C

chrysalis

Unregistered / Unconfirmed
GUEST, unregistred user!
各位:
我现在想做一个播放器,难点如下:
1、一个播放器,可以选择时间段内播放。
例:一个4分钟的AVI视频文件,选择播放点为二分钟的时候,结束点为三分钟的时候,我要播放器在这段时间内播放,请问有没有什么解决办法?
2、我想实现这个播放器有切割文件的功能,既我可以切割选择的时候段内的播放的文件度保存。
请问如何解决,目前我用DirectShow做的,各位看一下,最好有实例,谢谢!
 
各位:
我现在想做一个播放器,难点如下:
1、一个播放器,可以选择时间段内播放。
例:一个4分钟的AVI视频文件,选择播放点为二分钟的时候,结束点为三分钟的时候,我要播放器在这段时间内播放,请问有没有什么解决办法?
2、我想实现这个播放器有切割文件的功能,既我可以切割选择的时候段内的播放的文件度保存。
请问如何解决,目前我用DirectShow做的,各位看一下,最好有实例,谢谢!
 
没有人知道吗?
 
恩~~~~~~没用过DXShow
我一直用DSPack 不过差不多,前一阵我改他里面的代码 发现他控制播放进度是用过
IMediaSeeking接口类型的变量实现的,而IMediaSeeking接口是DXSshow里定义的,像这样:

type //这是我在DirectShow9.pas里找到的
{$HPPEMIT 'typedef System::DelphiInterface<IMediaSeeking> _di_IMediaSeeking;'}
{$EXTERNALSYM IMediaSeeking}
IMediaSeeking = interface(IUnknown)
['{36B73880-C2C8-11CF-8B46-00805F6CEF60}']
(*** IMediaSeeking methods ***)
function GetCapabilities(out pCapabilities: DWORD): HResult;
stdcall;
function CheckCapabilities(var pCapabilities: DWORD): HResult;
stdcall;
function IsFormatSupported(const pFormat: TGUID): HResult;
stdcall;
function QueryPreferredFormat(out pFormat: TGUID): HResult;
stdcall;
function GetTimeFormat(out pFormat: TGUID): HResult;
stdcall;
function IsUsingTimeFormat(const pFormat: TGUID): HResult;
stdcall;
function SetTimeFormat(const pFormat: TGUID): HResult;
stdcall;
function GetDuration(out pDuration: int64): HResult;
stdcall;
function GetStopPosition(out pStop: int64): HResult;
stdcall;
function GetCurrentPosition(out pCurrent: int64): HResult;
stdcall;
function ConvertTimeFormat(out pTarget: int64;
pTargetFormat: PGUID;
Source: int64;
pSourceFormat: PGUID): HResult;
stdcall;
function SetPositions(var pCurrent: int64;
dwCurrentFlags: DWORD;
var pStop: int64;
dwStopFlags: DWORD): HResult;
stdcall;
function GetPositions(out pCurrent, pStop: int64): HResult;
stdcall;
function GetAvailable(out pEarliest, pLatest: int64): HResult;
stdcall;
function SetRate(dRate:do
uble): HResult;
stdcall;
function GetRate(out pdRate:do
uble): HResult;
stdcall;
function GetPreroll(out pllPreroll: int64): HResult;
stdcall;
end;




FMediaSeeking: IMediaSeeking;

var
StopPosition, CurrentPosition: int64;
begin

if assigned(FMediaSeeking) then

begin

//CurrentPosition就是当前要播放的位置,数值应该是毫秒级的整数..具体是多少我没算过..-_-! 因为我用的都是按整个时间进度百分比算的,不过应该不难
FMediaSeeking.GetStopPosition(StopPosition);
FMediaSeeking.SetPositions(CurrentPosition,AM_SEEKING_AbsolutePositioning,
StopPosition , AM_SEEKING_NoPositioning);
end;

end;
 
没人知道了?
 
我说的那个方法不行吗?
 
TO:hs-kill
你的方法不能实现,你有做过的源码吗?
还有没有其它人帮帮忙!
 
我一直用DSPack。。。用那个接口,随便改改DSPack的源码很容易实现。。。

看看别人的吧
 
后退
顶部