2010-02-18 66 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