1

问题

Windows Mobile / Directdraw:旋转视频流

视频预览正在运行,我现在只需要一种旋转图像的方法。我认为处理这个问题的唯一方法是编写一个自定义过滤器,CTransformFilter它会为你旋转相机图像。如果你能帮助我解决这个问题,例如通过我有限的 DirectDraw 知识帮助我开发这个过滤器,那么赏金就是你的。

背景/上一个问题

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

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

缺点是我从未真正使用过任何本机 Windows API,而且我的 C++ 相当糟糕。除此之外,我在某处读到 HTC 手机的 Direct Draw 支持特别糟糕,您将不得不使用未记录的本地 HTC 库调用来拍摄高质量的照片。

好消息是一家公司向我们提供了开发符合上述规格的控件。他们估计这需要大约 10 天的时间,这引发了我们是否可以在合理的时间内自行开发这种控制的讨论。

现在我的工作是研究哪种方案更好。不用说,研究整个架构和开发演示的时间太少了,这让我想到了以下问题:

问题不再相关!

  • 你们中有人有类似项目的经验吗?你有什么建议?
  • 是否有处理视频预览和图像捕获的良好 Direct Draw 源代码示例?
4

2 回答 2

2

好吧,如果您查看 EZRGB24 示例,您将了解简单视频变换滤镜的基础知识。

你需要对样本做两件事才能让它做你想做的事。

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

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

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

要解决 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 相同。

我希望这会有所帮助。

于 2010-03-01T19:00:50.643 回答
1

这个问题将帮助您了解有关 DirectDraw 的一些详细信息。前段时间我对此做了一些研究,我能找到的最好的就是这篇博文(在上面问题中也提到过)。这篇文章介绍了 SDK 中 CameraCapture 示例的扩展。

但是,不要抱有很高的期望。似乎预览和拍摄的照片只能在小分辨率下工作。尽管 DirectDraw 确实描述了一种配置分辨率的方法,但不能保证驱动程序会正确实现这一点。

所以根据我的经验,你读到的都是真的。唯一的方法是使用 HTC 驱动程序。因此,如果您不想在逆向工程中花费无数天以获得可疑的结果,请让其他人为您完成这项工作。如果您想试一试,请尝试xda-developers 论坛

于 2010-02-19T12:16:26.247 回答