2010-03-29 58 views
2

我們目前正在使用Silverlight的VideoSink捕獲用戶的本地攝像頭視頻,還挺像這樣:如何檢測VideoSink.OnSample()提供的示例是否正確?

protected override void OnSample(long sampleTime, long frameDuration, byte[] sampleData) 
    { 
     if (FrameShouldBeSubmitted()) 
     { 
      byte[] resampledData = ResizeFrame(sampleData); 
      mediaController.SetVideoFrame(resampledData); 
     } 
    } 

現在,大部分我們測試過的機器,在字節提供的視頻樣本[] sampleData參數是顛倒的,也就是說,如果嘗試將RGBA數據轉換爲WriteableBitmap,則位圖將顛倒。這很奇怪,但很容易糾正,當然 - 您只需在編碼時逆轉陣列。

問題在於,至少在某些機器上(例如,我們的測試環境中的單個Macintosh),所提供的視頻樣本不再是倒置的,而是正面朝上,因此實際上會翻轉圖像在一面倒在遠處的圖像中。

我向MS報告這是一個錯誤,但他們(簡潔)的迴應是它是「As Designed」。澄清進一步的嘗試迄今被忽視。

現在,我認爲想象一下這個設計決定背後的討論會有點有趣:「好吧,只是爲了讓它變得有趣,讓我們在Mac上播放視頻版權,但讓我們把它顛倒爲Windows !」 「好想法!」 「是的,這會讓那些開發者猜測!」但除此之外,我無法在任何地方找到這個呃,「功能」,也不能找到任何文件說明人們應該如何能夠告訴給定的視頻樣本是顛倒的還是正確的。有關如何說明這一點的任何想法?

EDIT 3/29/10 4:50 pm - 我從MS那裏得到了一個迴應,說適當的告訴方法是通過VideoFormat對象的Stride屬性,也就是說,如果stride值是負數,圖像將會顛倒。但是,我自己的測試表明,除非我做錯了什麼,否則情況並非如此。至少在我自己的機器上,無論是步幅值是零還是負值(我看到的唯一選項),採樣的圖像仍然是顛倒的。

回答

2

我會建議看在VideoSink.OnFormatChange提供VideoFormat.Stride,但後來我發現你的編輯。我繼續在我的開發機器上測試它,圖像倒過來,並且像預期的那樣步伐是負面的。你最近再次檢查過嗎?

儘管stride對本機應用程序(在指針操作中使用跨度)非常有意義,但我同意當前行爲不符合您對現代API的期望。但是,性能方面,最好不要對從本地API接收的數據進行更改。

在這一點上,雖然我們在談論性​​能,但爲什麼不提供PixelFormatType.Format32bppArgb以外的其他格式的樣本,以便我們可以避免顏色空間轉換?順便說一下,有VideoCaptureDevice.DesiredFormat屬性只適用於分辨率,因爲沒有替代PixelFormatType.Format32bppArgb。

+0

我最近沒有測試過這個(Mac的支持已經採取了一個後座),但我會。我記得在測試這個測試時看到的是,無論步幅是零還是負,我都得到了一個顛倒的圖像。但我會再次檢查一下。我同意Silverlight網絡攝像頭和麥克風API是相當原始的。目前我遇到了很多問題,由於Silverlight沒有糾正某些音頻卡的同步問題(即根據系統時鐘,他們每20.5 ms而不是每20 ms提交或請求採樣),從而導致問題。 Uggh。 – 2010-10-15 23:54:09

+0

我終於開始修復我們的Mac支持。結果是,如果步幅大於0,則圖像正面朝上。如果步幅<= 0,則圖像顛倒。這不像文檔所說的那樣,但它似乎可靠地工作。 – 2010-12-07 22:02:49

相關問題