2010-02-18 104 views
1

问题的DirectDraw:旋转视频流

Windows Mobile/Directdraw: Rotate video stream

视频预览是工作,所有我现在需要的是旋转图像的方式。我认为处理这个问题的唯一方法是编写一个基于CTransformFilter的自定义过滤器,它将为您旋转相机图像。如果你能帮助我解决这个问题,例如通过帮助我使用有限的DirectDraw知识开发此过滤器,赏金是您的。

背景/前一个问题

我目前正在开发针对移动设备(HTC HD2的Windows Mobile 6)的应用程序。该程序需要做的一件事就是使用内置相机拍照。以前,我是通过Windows Mobile 6 SDK提供的CameraCaptureDialog来做到这一点的,但我们的客户想要一个更加用户友好的解决方案。

想法是在控件中预览摄像机的视频流,并在单击控件时使用摄像机的照片功能拍摄高分辨率图片(> = 2百万像素)。我们对这个主题进行了一些研究,发现实现这个目标的最好方法似乎是使用Direct Draw。

缺点是我从来没有真正使用过任何本地windows API,而且我的C++相当糟糕。除此之外,我在某处读到HTC手机的直接绘图支持是特别糟糕的,您将不得不使用未公开的原生HTC图书馆电话来拍摄高质量图片。

好消息是,一家公司向我们提供了开发符合上述规格的控制系统。他们估计需要10天左右,如果我们能在合理的时间内自行开发这种控制,就会引发讨论。

现在我的工作是研究哪种方法更好。毋庸置疑,研究整个architecture并开发演示程序的时间太少,这导致我出现以下问题:

问题不再相关!

  • 您是否有过类似项目的经验?你有什么建议?
  • 是否有一个很好的直接绘制源代码示例,处理视频预览和图像捕获?
+0

顺便说一句,你说DirectShow不DirectDraw。技术非常不同。 – Goz 2010-03-01 22:43:16

回答

2

那么,如果你看看EZRGB24的例子,你会得到一个简单的视频转换过滤器的基础知识。

有两件事你需要做的样品,让它做你想做的。

1)您需要将x,y复制到y,x。
2)您需要告诉媒体样本,样本现在是高度x宽度而不是宽度x高度。

请记住,最终图像将具有完全相同数量的像素。

解决1比较简单。您可以通过执行“x +(y * Width)”来计算像素的位置。所以你通过每一个x和y来计算这个位置,然后写入“y +(x * Height)”。这将转置图像。当然,没有第二步,这看起来完全错误。

要解决2,您需要获取输入样本的AM_MEDIA_TYPE。然后你需要找出formatType是什么(可能是FormatType_VideoInfo或FormatType_VideoInfo2)。因此,您可以将AM_MEDIA_TYPE的pbFormat成员转换为VIDEOINFOHEADER或VIDEOINFOHEADER2(取决于FormatType)。您现在需要将VIDEOINFOHEADER [2] :: bmiHeader.biWidth和biHeight分别设置为输入媒体样本的biHeight和biWidth(分别)。其他一切应与输入AM_MEDIA_TYPE相同。

我希望能有所帮助。

1

这个question将帮助你得到一些关于DirectDraw的细节。前段时间我做了一些研究,最好的我可以找到这个博客post(在上面的问题中也提到过)。该文章介绍了SDK中CameraCapture示例的扩展。

但是,没有太高的期望值。预览和拍摄的照片似乎只能以小分辨率工作。尽管DirectDraw的配置方式为describe,但不能保证驱动程序能正确实施。

所以根据我的经验你读的是真的。唯一的方法就是使用HTC驱动程序。所以,如果你不想在逆向工程上花费无尽的时间来获得令人怀疑的结果,那么让其他人为你做这项工作。如果您想尝试一下,请尝试xda-developers forum