- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 Vmr 9 而不是默认的 Vmr 7,所以我使用 CoCreateInstance 创建它并使用 AddFilter 方法添加到图表中。接下来,我使用 RenderFile 方法构建图形。现在渲染器已连接,所以我查询 IVideoWindow 接口(interface)并使用在子线程中创建的窗口句柄调用 put_Owner 方法。当调用 Run 方法时,视频显示在窗口中,但窗口不处理消息,因此您不能移动它或调整它的大小。无窗口模式工作正常。为什么窗口会这样?
#include <dshow.h>
#include <D3D9.h>
#include <Vmr9.h>
#pragma comment(lib, "Strmiids.lib")
#pragma comment(lib, "D3d9.lib")
#define WM_GRAPHNOTIFY WM_APP + 1
DWORD HandleGraphEvent(IMediaEventEx* media_event)
{
long EvCode;
LONG_PTR param1, param2;
while (media_event->GetEvent(&EvCode, ¶m1, ¶m2, 0) == S_OK)
{
media_event->FreeEventParams(EvCode, param1, param2);
switch (EvCode)
{
case EC_COMPLETE:
printf("All data is rendered\n");
return 0;
case EC_USERABORT:
printf("User has closed the window\n");
return 0;
case EC_ERRORABORT:
printf("Error occured\n");
return 0;
}
}
return 1;
}
struct WindowThreadParam
{
HANDLE event;
HWND window;
IMediaEventEx* media_event;
};
LRESULT WINAPI WindowProcedure(HWND window, unsigned int msg, WPARAM wp, LPARAM lp)
{
WindowThreadParam* param = (WindowThreadParam*)lp;
switch (msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_GRAPHNOTIFY:
HandleGraphEvent(param->media_event);
default:
return DefWindowProc(window, msg, wp, lp);
}
}
DWORD WINAPI WindowThread(WindowThreadParam* param)
{
LPCWSTR myclass = TEXT("myclass");
WNDCLASSEX wndclass =
{ sizeof(WNDCLASSEX), CS_DBLCLKS, WindowProcedure,
0, 0, GetModuleHandle(0), LoadIcon(0, IDI_APPLICATION),
LoadCursor(0, IDC_ARROW), HBRUSH(COLOR_WINDOW + 1),
0, myclass, LoadIcon(0, IDI_APPLICATION) };
HWND window = NULL;
if (RegisterClassEx(&wndclass))
{
window = CreateWindowEx(0, myclass, TEXT("title"),
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, GetModuleHandle(0), 0);
if (window)
{
ShowWindow(window, SW_SHOWDEFAULT);
param->window = window;
SetEvent(param->event);
MSG msg;
while (GetMessage(&msg, 0, 0, 0)) DispatchMessage(&msg);
}
else SetEvent(param->event);
UnregisterClass(myclass, GetModuleHandle(0));
}
else SetEvent(param->event);
return 0;
}
void _tmain(int argc, _TCHAR* argv[])
{
HANDLE event_handle;
event_handle = CreateEvent(NULL, 0, 0, NULL); // auto, unsignaled
WindowThreadParam param;
ZeroMemory(¶m, sizeof(param));
param.event = event_handle;
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WindowThread, ¶m, 0, NULL);
IMediaControl *pControl = NULL;
IMediaEventEx *pEvent = NULL;
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr))
{
printf("ERROR - Could not initialize COM library");
return;
}
IGraphBuilder* graph_builder;
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&graph_builder);
IBaseFilter* Vrm;
hr = CoCreateInstance(CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&Vrm);
hr = graph_builder->AddFilter(Vrm, L"Video Mixing Renderer");
hr = graph_builder->RenderFile(L"anim.avi", NULL);
hr = graph_builder->QueryInterface(IID_IMediaControl, (void **)&pControl);
hr = graph_builder->QueryInterface(IID_IMediaEventEx, (void **)&pEvent);
IVideoWindow* VideoWindow;
RECT window_client_area;
WaitForSingleObject(param.event, INFINITE);
if (param.window)
{
// set window
hr = graph_builder->QueryInterface(IID_IVideoWindow, (void**)&VideoWindow);
hr = VideoWindow->put_Owner((OAHWND)param.window);
hr = VideoWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
// set video position
GetClientRect(param.window, &window_client_area);
hr = VideoWindow->SetWindowPosition(0, 0, window_client_area.right, window_client_area.bottom);
param.media_event = pEvent;
hr = pEvent->SetNotifyWindow((OAHWND)param.window, WM_GRAPHNOTIFY, (LONG_PTR)¶m);
}
hr = pControl->Run();
// allow child thread to run
getchar();
pControl->Release();
pEvent->Release();
graph_builder->Release();
CoUninitialize();
}
最佳答案
您的主线程在 getchar();
中休眠当它应该实现消息泵和传递窗口消息时,既作为 COM 要求,又作为 VMR 在主线程中创建的帮助程序窗口。
您的后台线程在这里无关紧要,因为您控制的 DirectShow 事件发生在 _tmain
中.
关于c++ - 视频窗口无响应,窗口模式,DirectShow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30128907/
我目前正在处理 Windows Media Foundation。但是,由于 Microsoft H.264 解码器的一些问题和一些缺少自定义格式的解码器,我想知道是否可以直接使用 CLSID 实例化
IMediaEvent 和 IMediaEventEx 没有说明图中哪个过滤器发送了检索到的 DirectShow 事件。有什么办法可以找到这些信息。特别是对于图中的过滤器之一发送 EC_ERRORA
我已经阅读了 DirectShow 上的 MSDN 文档,但它仍然令人困惑。我觉得我需要更多关于对象的上下文:图形、图钉、过滤器...等。谷歌搜索并没有给我太多的工作。我需要什么才能理解 Direct
正如我刚刚发现的那样,友好的名称不能保证是唯一的。如果我可以从该标识符实例化过滤器而无需枚举它们,则可加分。 最佳答案 可以通过 WaveOutId 识别包装 WaveOut 设备的渲染器过滤器。那些
我想捕获当前帧及其前一帧以进行分析并生成一个新帧来显示。是说我必须写一个变换DirectShow过滤器吗?但我是 DirectShow 的新手。我被MSDN的大量文档弄糊涂了。所以我想知道是否有任何简
enter code here我必须动态停止和启动 Video Renderer Filter。在不创建新图表的情况下,使用“普通”直接展示架构是不可能的。但是使用 GMFBridge 似乎是可能的。
在网上搜索了几个小时后,我非常想找到解决方案。我已经在 DirectShow 中启动并运行 OGG Theora 解码器,它输出 YV12 和 YUY2 颜色模型。 现在,我想为这个输出制作一个 RG
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
长篇故事: 有一个 H264/MPEG-4 源 我可以用 RTSP 协议(protocol)连接这个源。 我可以使用 RTP 协议(protocol)获取原始 UDP 数据包。 然后将这些原始 UDP
这可能是一个愚蠢的问题,但我很难概念化我需要在这里做什么......过去我使用 DirectShow 连接到相机并使用源过滤器捕获 AVI,AVI多路复用器、压缩过滤器、运行图表等……小菜一碟。在这种
我有一些自定义 DirectShow 过滤器(用于编码/解码/多路复用/多路分离)。 我想在 Media Foundation 上将它们用作 MFT。 我听过一些人说: “微软声称所有 DirectS
我做了一个简单的图表来编写 MKV 文件。但我不想使用文件编写器。我想使用 SampleGabber 并使用简单的程序获取流。问题是我从 Matroska muxer 以外的任何地方获取数据!(我该怎
我正在使用使用 DirectShow 库的 WPF 应用程序,它可以很好地抓取图像或记录实时提要,但我希望最终用户不应该看到任何网络摄像头正在拍照,即我想要用户不应看到正在呈现来自网络摄像头的提要的图
我应该写一个直接显示过滤器 从实时源获取输入(视频、音频)。 它应该将数据(视频,音频:已编码)提供给解码器过滤器 MyCustomDirectShowSourceFilter ---> Decode
我在从 DirectShow 筛选器图表编辑器连接到远程图表时遇到问题。当我运行创建直接显示图形的应用程序时,在我的 Windows XP 计算机上,图形显示在远程图形列表中,但在 Windows 7
什么是微软的 DirectShow ,以及它与以下内容有何关系: 编解码器? 容器? 编解码器和容器之间的确切区别是什么? 最佳答案 用简单的英语: 编解码器是一种算法和/或代码,可将音频或视频从 R
我开发了一个使用 DirectShow 从外部设备捕获视频的 Windows 应用程序。图像分辨率为 640x480,未经压缩保存的视频尺寸非常大(大约每秒 27MB)。 我的目标是尽可能地减小这个大
我正在尝试用 C# 制作一个允许用户录制视频的网络摄像头应用程序。我一直在使用 DirectShow.Net 来预览网络摄像头并拍摄快照。但需要能够在预览网络摄像头的同时捕捉视频和音频。我尝试过的一件
我已经找了很长时间,但是找不到解决方案。 如何从USB(符合Directshow规范)输入设备捕获音频并直接传递到PC扬声器(“音频渲染器”)? 我相信这不是一项艰巨的任务,但是我确实在网络上找不到任
我正在从我的应用程序执行 VLC 以从 DirectShow 音频捕获设备捕获和编码。 VLC 通过 STDOUT 将编码数据发送到我的应用程序。我需要一种枚举 DirectShow 音频捕获设备的方
我是一名优秀的程序员,十分优秀!