- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个用Delphi 6和DSPACK组件库编写的DirectShow推源视频过滤器。只要使用该过滤器的Skype客户端不是5.x或更高版本,该过滤器在Skype调用期间即可正常运行。使用5.x,Skype客户端会变得非常缓慢,直到挂起为止,然后出现各种严重的崩溃,包括数据执行保护警告和典型的Microsoft“此程序已崩溃”对话框。有时它会立即崩溃,而另一些时间则是在通话约30秒或更长时间后崩溃。
我还可以在以下情况下运行视频过滤器,而不会出现错误:
在选择要与Skype一起使用的视频设备时在视频过滤器预览窗口中看到的Skype 5.x(不在通话中,而是在“视频选项”选择对话框页面上)。
Skype 4.x客户端(在呼入和呼出中完美运行)
图形编辑
DSPACK TVideoWindow实例
其他利用网络摄像头提要的程序
我在网上做了一些研究,并发现了很多有关Skype 5.x和崩溃的投诉。我读过的线程建议下载5.7 beta。我尝试过,但没有帮助。它运行得更好一些,但是仍然崩溃。
作为一个简单的测试,我更改了FillBuffer()方法,以提供在启动时加载的静态位图,而不是通常中继到Skype的外部视频流。它仍然崩溃。此外,我什至尝试将FastMM4设置为推入源过滤器DLL,以便对每个FillBuffer()调用以及将媒体样本传递到下游引脚的调用进行全内存扫描。没有任何错误。
由于Skype显然可以与其他网络摄像头驱动程序一起使用,或者网络上会有强烈的抗议声,我的过滤器可能会做什么,但它不喜欢这样做?
更新:经过进一步测试,我遇到了一些奇怪的事情。最初,我的过滤器中的GetMediaType()调用具有4种格式。我将其分解为1种格式:将压缩设置为BI_RGB的24位格式,因为这是我从外部收到的,然后传递给Skype。登录后,当它进行DirectShow筛选器扫描时,我立即开始从Skype遇到快速故障,并且该故障发生在我的GetStreamCaps()调用期间。由于Skype具有反调试代码,因此我在每一行之后都在我的GetStreamCaps()调用中精心添加了跟踪消息,并发现它是在我第一次尝试访问其媒体格式变量时发生的(请参阅下文)。看来我无法访问Skype传递给DirectShow筛选器的内存区域。为什么只提供一种媒体格式而不提供以前的4种媒体格式会使故障更快地发生是未知的。
这只是我的推测,但是在Skype和我的过滤器之间是否可能发生某种奇怪的内存区域访问特权错误? Skype偶尔会在我发起呼叫之前报告数据执行保护错误,以及其他一般崩溃,这一事实使我想知道是否发生了异常情况。当您尝试写入标记为代码块的区域时,发生DEP错误。就像Skype传递给我的指针所指向的是我无法写入的某个陌生或受保护的地方。
简而言之,现在在我每次发起呼叫之前,Skype每次在调用GetStreamCaps()时访问我的DirectShow过滤器时都会发生100%错误,或者甚至可以访问视频设备选择屏幕。这是相关的代码片段:
function TBCPushPinDesktop.GetStreamCaps(iIndex: Integer; out ppmt: PAMMediaType; out pSCC): HResult;
var
pvi:PVIDEOINFOHEADER;
begin
ppmt := CreateMediaType(@Fmt);
pvi:=PVIDEOINFOHEADER(ppmt.pbFormat);
// Error occurs at THIS statement, the first attempt to write to the memory area
// provided by Skype.
pvi.bmiHeader.biCompression := BI_RGB;
.... SNIP ....
end;
// this also comes in useful when using the IEnumMediaTypes interface so
// that you can copy a media type, you can do nearly the same by creating
// a CMediaType object but as soon as it goes out of scope the destructor
// will delete the memory it allocated (this takes a copy of the memory)
function CreateMediaType(pSrc: PAMMediaType): PAMMediaType;
var pMediaType: PAMMediaType;
begin
ASSERT(pSrc<>nil);
// Allocate a block of memory for the media type
pMediaType := CoTaskMemAlloc(sizeof(TAMMediaType));
if (pMediaType = nil) then
begin
result := nil;
exit;
end;
// Copy the variable length format block
CopyMediaType(pMediaType,pSrc);
result := pMediaType;
end;
//----------------------------------------------------------------------------
// Copies a task-allocated AM_MEDIA_TYPE structure.
//----------------------------------------------------------------------------
procedure CopyMediaType(pmtTarget: PAMMediaType; pmtSource: PAMMediaType);
begin
// We'll leak if we copy onto one that already exists - there's one
// case we can check like that - copying to itself.
ASSERT(pmtSource <> pmtTarget);
//pmtTarget^ := pmtSource^;
move(pmtSource^, pmtTarget^, SizeOf(TAMMediaType));
if (pmtSource.cbFormat <> 0) then
begin
ASSERT(pmtSource.pbFormat <> nil);
pmtTarget.pbFormat := CoTaskMemAlloc(pmtSource.cbFormat);
if (pmtTarget.pbFormat = nil) then
pmtTarget.cbFormat := 0
else
CopyMemory(pmtTarget.pbFormat, pmtSource.pbFormat, pmtTarget.cbFormat);
end;
if (pmtTarget.pUnk <> nil) then pmtTarget.pUnk._AddRef;
end;
最佳答案
很多信息,但我可以掌握以下内容:
ppmt := CreateMediaType(@Fmt);
pvi:=PVIDEOINFOHEADER(ppmt.pbFormat);
// Error occurs at THIS statement, the first attempt to write to the memory area
// provided by Skype.
pvi.bmiHeader.biCompression := BI_RGB;
.pbFormat
。或者,否则,您可以正确地将其初始化为
NULL
,然后作为真实指针进行访问。
NULL
版本,或者
.cbFormat
在此处为零。
关于delphi - 在通话过程中,我的DirectShow筛选器使Skype 5.x崩溃。在4.x,Graph Edit和其他程序中运行良好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8949964/
我有 Site {{$url}} 和 $(function(){ $('#pencil').click
我在每一行都有一个编辑按钮,我已经设置了 defaultColDef: { editable: false, } 在网格选项中 当我点击编辑按钮时,我希望该行处于编辑模式。如果我设置
我在每一行都有一个编辑按钮,我已经设置了 defaultColDef: { editable: false, } 在网格选项中 当我点击编辑按钮时,我希望该行处于编辑模式。如果我设置
我有一个 html 文件,我想编辑其中的字段。以下是我的 html 代码: ID GROUP NAME GROUP DESCRIPTION IS A
我希望管理员能够编辑普通用户无法编辑的字段。例如作者或订阅者等。 我试过这个:Django admin: How to display a field that is marked as editab
如何将PS文件中间的数据移动到Mainframe的左侧?有什么快捷命令吗? 我有一个数据集,第 13 列有数据,必须将其移动到第 11 列,任何短键都可以移动它。 想要将 DS 中的其余行作为第一行对
我在 div 中有一个可编辑元素,它本身是可点击的。每当我单击 x-editable anchor 元素时,单击会在 DOM 中冒泡并触发对父 div 的单击。我怎样才能防止这种情况发生?我知道可以使
我有一个类似这样的模型: class Product(models.Model): third_party_id = models.CharField(max_length=64, blank
我有一个包含 2 个可编辑文本字段的页面 {{creator.name}} Tell us about yourself in less than 100 words
这是我的架构: id: 'EntryCode', fields: { EntryCode: {editable: true, validation: {required: true}, nul
有人可以帮助确定这个问题 - http://jsfiddle.net/xBB5x/8823/ 我正在尝试实现 x-editable (bootstrap 2) typeahead 功能。 上面的 js
如果我使用例如 g_object_set (renderer, "background", "red", "background-set", FALSE, NULL); 对于文本渲染器, TreeVi
我在创建和编辑页面上都使用了 Angular 文件,但我想知道是否有办法阻止用户在/edit 页面上编辑 Geo Segment 的名称。 geo-region-detail.html: G
我正在尝试向 QListWidget 添加一个项目,选择该项目,然后开始编辑新项目。 该项目被添加,它被选中,但该行没有被引入 QLineEdit,或者它试图使用的任何东西。 这是我的小部件的代码,相
我有一个表格,其中的单元格和列中有多个值。当用户单击 TD 单元格上的任意位置时,我希望它: 成为文本区域 将当前文本粘贴到文本区域 在其下方放置一个取消按钮 一旦按下取消按钮,我希望一切都变回以前的
在我的程序中,会有一个机会编辑框,它可以更改“掉率”或“获胜率” 但我想将其更改为如果用户输入大于 100 的数字并点击编辑框,编辑框文本将变回 100。 我不知道如何实现这个。 最佳答案 看看下面的
我想创建我的编辑表单,以便它将当前用户信息简单地显示为文本,而不是在文本字段中,当用户单击文本时,它将变成文本字段,用户可以编辑他的信息。仅当用户单击提交按钮时,更改才会反射(reflect)在数据库
我有一个 QTreeWidgetItem 添加到 QTreeWidget: QTreeWidgetItem* item = new QTreeWidgetItem(ui->trwPairs); ite
我检查了最新的 Dropbox 和 Excel for iOS。在 Dropbox 中,我们有一个编辑按钮。单击它会打开 Excel 的扩展程序,您可以在其中编辑文件。 保存后,更改也会反射(refl
我目前正在使用pycord创建一个Python语言的不和谐机器人。我有一个发送消息的命令,其中嵌入了两个字段。一个名为Yes,值为0;另一个名为No,值也为0。在选择菜单中,我创建了两个选项。选项是和
我是一名优秀的程序员,十分优秀!