2009-05-01 20 views
1

是否容易編寫一些.Net代碼來記錄屏幕和音頻(從計算機話筒),然後輸出到wmv文件。任何參考代碼?使用Windows Media編碼器記錄屏幕

順便說一句:我搜索了WME SDK的所有代碼,沒有這樣的代碼。

謝謝! George

+0

http://www.codeproject.com/KB/dialog/screencap.aspx?display=Print提到它反正... – rogerdpack 2010-07-27 21:41:17

回答

2

微軟和內容mafi^H^H^H^Hindustry正在盡最大努力使這不可能。與瀏覽任何官方提供的文檔/示例代碼相比,您將更好地搜索「開源屏幕音頻捕獲」 - 如果微軟提供了任何相關的信息,我將會非常驚訝。

+0

@hlovdal,1。我只是用Google搜索「開源屏幕音頻捕獲」 ,我找到了一些,但沒有捕獲屏幕到視頻,而是捕獲圖像。 2.我閱讀SDK文檔WME,它提到了錄製屏幕+音頻是一項功能,但沒有示例代碼可以引用。我相信應該有一些。有任何想法嗎? :-( – George2 2009-05-01 12:05:32

+0

不,我不知道任何細節 – hlovdal 2009-05-02 22:27:42

1

時退房SDK that's available for Techsmith Camtasia

的Camtasia是各種視頻及音頻信號源,編解碼器等支持全屏桌面應用程序記錄,他們的SDK,暴露出作爲ActiveX控件(你可以調用從.NET很開心)。

+0

@Dylan,我找不到任何SDK文檔或下載從Camtasia的網站鏈接你能找出 – George2 2009-05-01 12:02:11

+0

我道歉 - ?看來他們的SDK已經停產( http://www.techsmith.com/sdk.asp) 對不起。 – 2009-05-04 10:13:41

1

有DirectShow兼容的過濾器用於屏幕截圖。這將允許您使用任何錄製程序來捕獲屏幕內容或使用.NET自行編寫應用程序(但這並不容易)。

我使用的一個是: http://www.hmelyoff.com/index.php?section=9

編輯:我有沒有樣品或經驗的WME SDK。但我建議使用DirectShow路由來避免在主機系統上使用WME,缺乏對它的支持,以及只需瞭解DirectShow(或自己動手)而不是一些隨機API。

要使用Hmelyoff濾鏡,它就像網絡攝像頭一樣工作。它的另一個視頻捕獲源可用於任何需要視頻輸入的應用程序。它的工作方式是將每個幀的viedo緩衝區的部分複製到它的輸出引腳(使用像BitBlt這樣的API函數)。

一些示例代碼是here

或者,如果您只想與DirectShow接口,最簡單的方法是使用庫爲您執行COM交互。 http://directshownet.sourceforge.net/是一個很好的。

再次編輯:捕捉視頻與捕捉幀相同。它每秒捕獲幀30次。 CPU豬?這是,不要指望得到完整的幀率。

如果你問的是如何將幀保存爲視頻,那麼你將需要將數據傳遞給視頻編碼器。您需要連接到DirectShow才能執行此操作。

+0

@Nick,我會花一些時間來學習hmelyoff,我也想在同一時間來研究微軟內置的解決方案。:-)其實我讀了WME SDK文檔,它提到它通過.Net代碼支持屏幕捕獲功能。但是我找不到任何樣本代碼,您是否有任何相關的源代碼可供參考? – George2 2009-05-01 12:13:50

+0

另一個問題,我需要15分鐘來研究hmelyoff,但我沒有找到它描述的概念/ hmelyoff的架構和快速啓動樣本任何啓動文件。我找到的所有示例代碼和API的列表,對於初學者來說都不太好。你有任何這樣的文件引用我閱讀? :-) – George2 2009-05-01 12:19:20

+0

@Nick,謝謝你的評論。我的要求是不能捕捉屏幕爲靜態圖像,但拍攝視頻(我想捕獲所有的Windows /鼠標的移動,以顯示如何使用一些軟件的一些演示)。我閱讀CodeGuru文檔,它似乎將捕獲屏幕視爲靜態圖像,而不是捕獲視頻? – George2 2009-05-01 13:26:19

0

最好的辦法是將.net媒體編碼器庫導入到.net應用程序的com接口中,並將其用於您的應用程序中。

0

是的,這是完全可行的與WME: http://www.c-sharpcorner.com/UploadFile/armoghanasif/CaptureDesktopActivities11122005013755AM/CaptureDesktopActivities.aspx

我已經在過去做了,一旦你開始調整編碼設置,你可以得到非常好的質量的視頻。特別是如果WMV對你來說是一個可行的選擇。如果沒有,您將不得不使用其他應用程序重新編碼爲另一種格式。

我發現調整的最簡單方法是使用WME桌面應用程序進行測試和記錄不同的設置,並保存這些配置文件,這是我後來從我的應用程序加載程序。

0

您可以使用Microsoft Expression Encoder的4,既要錄製視頻和音頻。它只用C#工作。 以下代碼應該很熟悉。

void Encode(string jobPath) 
    { 
     using (Job j = new Job()) 
     { 

      MediaItem mediaItem = new MediaItem(jobPath); 
      var size = mediaItem.OriginalVideoSize; 
      WindowsMediaOutputFormat WMV_Format = new WindowsMediaOutputFormat(); 
      WMV_Format.VideoProfile = new Microsoft.Expression.Encoder.Profiles.AdvancedVC1VideoProfile(); 
      WMV_Format.AudioProfile = new Microsoft.Expression.Encoder.Profiles.WmaAudioProfile(); 
      WMV_Format.VideoProfile.AspectRatio = new System.Windows.Size(16, 9); 
      WMV_Format.VideoProfile.AutoFit = true; 

      if (size.Width >= 1920 && size.Height >= 1080) 
      { 
       WMV_Format.VideoProfile.Size = new System.Drawing.Size(1920, 1080); 
       WMV_Format.VideoProfile.Bitrate = new Microsoft.Expression.Encoder.Profiles.VariableUnconstrainedBitrate(6000); 
      } 
      else if (size.Width >= 1280 && size.Height >= 720) 
      { 
       WMV_Format.VideoProfile.Size = new System.Drawing.Size(1280, 720); 
       WMV_Format.VideoProfile.Bitrate = new Microsoft.Expression.Encoder.Profiles.VariableUnconstrainedBitrate(4000); 
      } 
      else 
      { 
       WMV_Format.VideoProfile.Size = new System.Drawing.Size(size.Width, size.Height); 
       WMV_Format.VideoProfile.Bitrate = new Microsoft.Expression.Encoder.Profiles.VariableUnconstrainedBitrate(2000); 
      } 
      mediaItem.VideoResizeMode = VideoResizeMode.Letterbox; 
      mediaItem.OutputFormat = WMV_Format; 
      j.MediaItems.Add(mediaItem); 
      j.CreateSubfolder = false; 
      j.OutputDirectory = @"D:\output"; 
      j.EncodeProgress += new EventHandler<EncodeProgressEventArgs>(j_EncodeProgress); 
      j.Encode(); 
     } 
    } 
+0

將代碼添加到您的答案中是否值得顯示OP如何實現? – Bugs 2016-11-15 11:35:32