我有很多使用Skype API编写Delphi 6 Pro应用程序的经验.我不使用COM对象,而是使用SendMessage()
系统直接与Skype客户端连接.我当前的应用程序充当带视频传输的全双工音频代理.要传输音频,我使用带有PORT参数的ALTER CALL通过一对插座与Skype客户端建立双工音频连接.为了发送视频,我有一个基于DSPACK的DirectX过滤器,我指示Skype客户端选择作为所选的视频设备.这工作正常,但由于它是Skype API,我有一个与Skype客户端作为一个单独实体连接的尴尬.
现在,SkypeKit显然允许开发人员以更加集成的方式集成Skype.我即将深入研究它,我希望听到那些从Skype API切换到SkypeKit的开发人员.一些问题:
SkypeKit是否有任何遗漏,通过Skype API提供,即使不是不可能,您的应用转换也很困难?
您是否有任何关于尽可能顺利过渡的提示,特别是当您避开任何设计选择时,当您远离SkypeKit路径时,这些设计选择真的会回来困扰您?
您是否发现其他开发人员的任何网络资源或文档真的有助于节省您的时间或麻烦?(如果是这样,请分享链接).
我正在使用Delphi 5.
我想知道使用'TFilterGraph'完成avi文件播放的时间.我想自动一个接一个地运行多个avi文件.所以我下载了DSPack并使用了'TFilterGraph'和'TVideoWindow'组件.avi文件视频正常显示.我如何知道avi视频或任何视频已完成播放,以便我可以选择下一个avi或任何其他视频文件播放?
procedure TForm1.Button2Click(Sender: TObject);
begin
videowindow1.FilterGraph:=filtergraph1; //query interfaces to video window
filtergraph1.Active:=true;
filtergraph1.RenderFile('I:\Project Part 1\Clips\More Clips\D.avi');
filtergraph1.Play;
end;
Run Code Online (Sandbox Code Playgroud) 我有一个Delphi 6 Pro应用程序,它使用DSPACK组件库从系统的首选音频输入设备向Skype发送音频.我正在使用TSampleGrabber组件进入Filter Graph链,然后将音频缓冲区发送到Skype.问题是我每秒只能听一次音频.换句话说,TSampleGrabber实例的OnBuffer()事件仅在Buffer参数中每秒触发一次具有完整秒数的数据.我需要知道如何修改我的Filter Graph链,以便以比每秒一次更快的间隔从输入设备抓取数据.如果可能的话,我想尽快每50毫秒或至少每100毫秒做一次.
My Filter Graph链由一个TFilter组成,该TFilter映射到顶部的系统首选音频输入设备.我将该滤波器的输出引脚连接到"WAV Dest"指定TFilter的输入引脚,这样我就可以获得PCM WAV格式的采样.然后,我将'WAV Dest'滤波器的输出引脚连接到TSampleGrabber实例的输入引脚.我需要更改什么才能使TSampleGrabber OnBuffer()事件以更快的间隔触发?
更新:根据Roman R的回答,我能够实现我在下面展示的解决方案.一个说明.他的链接引导我访问以下有助于解决方案的博文:
http://sid6581.wordpress.com/2006/10/09/minimizing-audio-capture-latency-in-directshow/
// Variable declaration for output pin to manipulate.
var
intfCapturePin: IPin;
...............
// Put this code after you have initialized your audio capture device
// TFilter instance *and* set it's wave audio format. My variable for
// this is FFiltAudCap. I believe you need to set the buffer size before
// connecting up the pins of the Filters. The media type was
// retrieved …
Run Code Online (Sandbox Code Playgroud) 我看到了一些主题,比如如何使用/安装自定义Directshow过滤器来注册过滤器,但没有代码如何使用它.任何人都可以展示一个示例如何实际使用该过滤器(pushsource,pushdesktop)保存到AVI?
DSpack具有示例代码,用于播放与DirectShow兼容的视频设备并同时捕获视频帧.TVideoWindow附加到FilterGraph以显示视频(Firgure-1).如果您删除TVideoWindow,则操作系统(Windows)将自动调出ActiveMovie并在单独的窗口中显示视频(图2).
有没有办法使用DSPack捕获视频帧而不使用任何GUI组件而不显示视频?
DSPack论坛提到了NullRenderer过滤器,但没有关于如何使用它的文档或示例.看起来我们可以实现这一点,如果我们直接在GraphEdit中用Null Render手动替换Video Renderer(图3).
我们如何通过在代码中进行所有操作来实现图3中所示的结果?DSPack没有解释如何创建Null渲染器.
Figure-1: The graph of the default example code
Run Code Online (Sandbox Code Playgroud)
Figure-2: Shows what happens if I remove the TVideoWindow
Run Code Online (Sandbox Code Playgroud)
Figure-3: Shows what happens if I replace Video Renderer with a
Null Renderer and manually connect them in the GraphEdit.
Run Code Online (Sandbox Code Playgroud)
这就是我最终做的事情(到目前为止)
请拨打以下ReassignSampleGrabberOutput
之前filterGraph.Play;
procedure TForm1.ReassignSampleGrabberOutput;
var
nullRenderer : IBaseFilter;
nullRendererPins: IEnumPins;
nullRendererPin : IPin;
graph: IGraphBuilder;
begin
nullRenderer := CreateComObject(CLSID_NullRenderer) as IBaseFilter;
FilterGraph1.QueryInterface(IID_IGraphBuilder, graph);
graph.AddFilter(nullRenderer, 'Null Renderer');
nullRenderer.EnumPins(nullRendererPins);
nullRendererPins.Reset;
if nullRendererPins.Next(1, nullRendererPin, nil) = S_OK …
Run Code Online (Sandbox Code Playgroud) 我有一个Delphi 6程序,通过套接字从外部程序接收音频.现在我想将该音频提供给我创建的DirectShow过滤器图形,该图形将音频路由到PC上的不同输出过滤器.我正在使用DSPACK进行DirectShow过滤器图形工作.我将使用其中一个DSPACK示例来说明如何创建推送源过滤器作为我的起点.
是否可以将DirectShow过滤器直接嵌入到我的主EXE中,或者我是否必须创建外部DLL或AX文件并在其上运行regsvr32?我想避免创建一个外部模块,否则我将不得不在它和我的主程序之间创建一个参数和数据传递桥梁,我宁愿消除这项工作.我想知道是否有一种方法可以简单地在我的主程序中包含推送源过滤器代码,并巧妙地将Windows作为DirectShow过滤器使用,如果可能的话.