本文章是由機器翻譯。

展現自我

展現自我-使用 Microsoft Expression Encoder 3 SDK 編碼影片

Adam Miller

在其中一個的所有時間,克拉克工時我最喜歡的電影場景隱藏聖誕節會呈現時,Griswold (Chevy 追擊中 「 聖誕節休假 」) 取得困在他 attic。若要保持暖,他 dons 粉紅色的手套,綠色的帽子和從 dusty 箱子褐色毛皮偷提取。底部的箱子他從他年輕,尋找家庭電影的內容,並傳遞時間,觀賞它們 (與在他的眼睛 tears)、 使用舊的影片投影機。

家庭電影有來自長的方式,此後,但人們仍然必須應付相同的問題:我如何告訴我的電影至朋友和家人?就像 YouTube、 Vimeo 與 Facebook 站台共用簡單 ; 但 100-plus 每分鐘的高畫質視訊的 MB 數,在取得那些網站資料可以是耗時的工作。有可能是,您的可攜式裝置、 遊戲系統或家庭劇院媒體中心 won’t 甚至播放檔案。若要解決這些問題,您需要將視訊轉換成另一種格式。這個程序就是所謂的編碼方式。

關於運算式編碼器

Microsoft 視訊編碼工具,運算式編碼器 3,是系列的用於建立 Web 和桌面應用程式的吸引人的使用者介面的產品中運算式的一部份。運算式編碼器進來空閒及付費版本 ; 付費的版本是運算式 Studio 3 套件 ($ 599) 和運算式 Web 3 套件 ($ 149) 的一部分。免費下載不支援 Silverlight 平滑資料流或為一個的來源視訊 H.264 視訊或使用 H.264 編碼方式,但它不會讓您編碼視訊 Windows 媒體檔案,而且它有不錯的 SDK。許多程式碼範例,這份文件中需要付費的 
version 的程式 ; 但是,所有程式碼範例會建置在 SDK 的可用版本。您只要收到一個 InvalidMediaException 或一個 FeatureNotAvailableException 時執行。

如果您 aren’t 準備購買運算式套件,您可以開始使用運算式編碼器從 microsoft.com/expression 下載免費的版本。’s 也可當做運算式 [專業版] MSDN 訂閱 」 或 「 MSDN 高級訂閱與 Visual Studio 專業版的一部分。請記住,因此該 $ 149 專業的視訊編碼與此功能集的軟體應用程式,廣泛的輸入的格式和支援的輸出目標是相對 steal。類似的視訊編碼解決方案會耗用 upward 的 $ 3000。

無論您選擇的哪一個版本要安裝編碼器 3 QFE。它新增其他檔案類型,並輸入的裝置的支援,可以改善效能,在特定的情況下,並包含次要的 Bug 修正。運算式編碼器] 頁面,Microsoft 運算式 Web 站台上找不到 QFE 安裝程式。

支援的格式

輸入支援的視訊格式如下:

  • Windows 媒體視訊 (.wmv)
  • DVD 視訊 (.vob)
  • MPEG (.mpg、.mpeg)
  • 音訊視訊交錯 (.avi)
  • Microsoft 數位視訊錄製 (.dvr 毫秒)

下列的格式 (再加上一些其他的格式),則會加入付費的版本:

  • MPEG-4 (.mp4、.m4v)
  • Quicktime (.mov)
  • AVC HD (.mts)
  • 行動裝置視訊 (.3gp、.3g2)

在大多數的情況下,運算式編碼器支援任何媒體檔案 Windows Media Player 可以播放。如果您想要以支援更多的檔案,才能夠在 Windows 媒體播放機中播放這些您可以安裝轉碼器封包,例如 K 精簡的轉碼器套件 ( codecguide.com ) 或社群組合轉碼器套件 ( cccp project.net )。兩者都根據開放原始碼 ffdshow 專案和將 Matroska (.mkv) 容器和 Ogg (.ogg) 視訊檔案中加入 VP6 編碼 Flash (.flv) 檔案、 H.264 視訊的支援。

可用的版本的運算式編碼器支援僅在 Microsoft VC-1 輸出的轉碼器。但是,這仍允許您進行視訊編碼 Silverlight (位元單一速率只)、 Xbox 360、 Zune 和 Zune HD。而且,VC-1 轉碼器是沒有 slouch ; 其壓縮是好 (如果在某些情況下不佳) 為 H.264。升級至付費的版本可讓您輸出 Silverlight 平滑串流視訊 (多重-位元速率),也表示您可以編碼視訊播放 iPhone,PS3,Flash 玩家 (10 支援 H.264/.mp4 版本)] 及 [其他無數的裝置上的 H.264。

編碼 101

支援特定的輸出裝置,需要變更某些視訊設定檔] 設定,所以需要瞭解視訊編碼方式的基本概念。re-encoding 視訊是實際解壓縮視訊和 re-compressing 使用另一個的轉碼器或以手動方式變更屬性,例如,大小]、 [長寬比] 或 [畫面播放速率的程序。雖然不減色壓縮方式它們很少用因為產生的視訊檔案仍會相當大。因此若要減少視訊儲存 (以及因此傳輸) 所需的空間數量,一項稱為一個的轉碼器的演算法用來壓縮及解壓縮視訊。壓縮的視訊資料流是根據規格,稱為容器 (例如 WMV 或 MP4) 來儲存。容器和轉碼器是通常不是獨占合約,雖然 H.264 MP4] 容器中找到最常見的轉碼器可以用其他的轉碼器。

位元速率,以千位元] 秒表示定義多少資料應該被用來儲存壓縮的視訊。減少位元速率會告訴要壓縮在較高速率降低視訊品質視訊編碼器。有不同的方法可以告訴編碼器如何判斷視訊 ’s 位元速率。最簡單的方式是視訊的使用位元一個常數速率 (CBR),這會強制使用相同數量的資料的每隔一秒編碼器。可變位元速率 (VBR) 可以用來分辨出編碼器什麼檔案的整體的位元速率應該但允許編碼器升起或降低位元速率的根據視訊的特定區段的所需的資料量。變數限制的位元速率是無限制的 VBR 類似,不同之處在於您提供使用的平均位元速率不僅也 can’t 超過了最大位元速率。

Silverlight 平滑串流視訊的編碼方式時,變數限制的位元速率將會很有用。它可幫助確保位元速率 doesn’t 超過用戶端的頻寬,強制用戶端要求較低品質的資料流。CBR 和 VBR 表示指定整體的視訊檔案大小來使用的壓縮量。

或者,您可以分辨出使用品質 VBR 編碼器。而非指定視訊的整體大小,您指定百分比的品質 (也就是多少資料) 的解壓縮的來源視訊保留。花較少的資料比保留高品質的卡通化,例如,性質或動作填滿的視訊。因此如果您有高品質的來源,且您的目標是要將來源轉換為另一種格式,但保留最佳品質請考慮使用品質為基礎的 VBR。這些定義只在提示的最 iceberg,但它們是選擇輸出設定的核心。它們套用至程式碼,尋找其他編碼方式的定義,在本文 範例。

使用 SDK

若要依照下列程式碼範例,要使用良好品質視訊。如果有任何高解析度的視訊,把周圍 don’t,您可以取得一些不錯的 HD 視訊,從 microsoft.com/windows/windowsmedia/musicandvideo/hdvideo/contentshowcase.aspx 。我 Adrenaline 快攻視訊做為來源使用這些範例。

在安裝運算式編碼器 3 之後, 建立新的 Visual Studio C# 主控台應用程式專案。新增 Microsoft.Expression.Encoder.dll Microsoft.Expression.Encoder.Utilities.dll] 中位於 \Program 檔案 (x86) \Microsoft Expression\Encoder 3\SDK 的參考。您也需要將參考加入您 [加入參考] 對話方塊中的 [.NET] 索引標籤中找到的 WindowsBase。許多類別可用以將會 Microsoft.Expression.Encoder] 命名空間中,新增一個使用它的陳述式。

第一個要具現化的項目將會 MediaItem 物件。MediaItem 建構函式會採用字串做為唯一的參數建構函式。傳遞至做為來源編碼專案使用的檔案的路徑:

MediaItem src = new MediaItem(@"C:\WMdownloads\AdrenalineRush.wmv");

建立 MediaItem 物件會只是第二個或兩個。 SDK 正在進行收集資訊,例如其高度、 寬度、 畫面格速率 (個別圖像應該會顯示在螢幕上頻率) 和工期視訊來源的相關工作在幕後,不過,公平的數量。 音訊資料流相關的資訊也會收集這一次。

接下來您建立工作類別 (其中有只有無參數的建構函式) 的執行個體,並將您 MediaItem 新增至其清單 MediaItems。 工作類別做為您想要的輸出格式 (稱為設定檔) 的管理員:

Job job = new Job();
job.MediaItems.Add(src);

現在您必須告訴作業期間編碼所使用的音訊和視訊設定檔 ; 最簡單的方法是使用其中一個使用者介面中所定義的設定檔。 若要建立 Zune HD 視訊,就例如您可以使用 VC1ZuneHD 預設:

job.ApplyPreset(Presets.VC1ZuneHD);

最後,指定輸出目錄,並開始編碼方式的程序:

job.OutputDirectory = @"C:\EncodedFiles";
job.Encode();

Program.cs 檔案應該類似於 的 圖 1

圖 1 建立為 Zune HD 視訊

using Microsoft.Expression.Encoder;

namespace TestApp
{
  class Program
  {
      static void Main(string[] args)
      {
          MediaItem src = new MediaItem
              (@"C:\WMdownloads\AdrenalineRush.wmv");
          Job job = new Job();
          job.MediaItems.Add(src);
          job.ApplyPreset(Presets.VC1ZuneHD);
          job.OutputDirectory = @"C:\EncodedFiles";
          job.Encode();
      }
  }
}

有 ’s 一個要執行應用程式之前的最後一個項目:如果您使用 64 位元版本的 Windows,您需要修改 x86 中建立專案。 在 Visual Studio] 功能表中選取 [專案] 和 [專案] 名稱內容]。 在開啟該對話方塊,選取 [組建] 索引標籤,並變更平台目標從 「 任何 CPU 」 到 「 x 86 」。

現在,您已經準備好執行應用程式,以及建立在 Zune HD 播放視訊。 編碼的處理程序需要幾分鐘才能完成,而且是非常耗用 CPU 資源。 從正在平行計算的任務,因此多核心的電腦在這裡有大的優勢視訊編碼方式的優點。

運算式編碼器也包含預設的編碼方式,例如 YouTube、 Vimeo 與 Facebook 的線上服務。 720p Panasonic Lumix DMC ZS3 數位相機從錄製的視訊會消耗約 110 MB 每分鐘的錄製的視訊。 預設 (也 720 p) 轉換使用 YouTube HD 視訊到只是 16 MB 降低視訊。 這使得上載,並在本機儲存更有效率。 轉換以.mp4 檔案也可與許多多個視訊編輯程式相容。

自訂設定

若要以手動方式產生相同輸出為 [VC1ZuneHD 預設,您需要使用 圖 2 編譯,設定視訊及音訊 profiles.For 程式碼的程式碼類似於 的 圖 2 您需要將參考加入至 Microsoft.Expression.Encoder.Utilities 和 System.Drawing。 也加入 Microsoft.Expression.Encoder.Profiles 和 System.Drawing 使用陳述式。 OutputFormat 基本上會指定輸出檔的容器。 基本上說出因為編碼方式的 Silverlight 只要一點運作以不同的方式 (如我稍後討論)。

圖 2 視訊和音訊設定檔設定值,如 Zune HD

MediaItem src = new MediaItem(@"C:\WMdownloads\AdrenalineRush.wmv");

src.OutputFormat = new WindowsMediaOutputFormat();

src.OutputFormat.VideoProfile = new AdvancedVC1VideoProfile();
src.OutputFormat.VideoProfile.Bitrate = new 
    VariableConstrainedBitrate(1000, 1500);
src.OutputFormat.VideoProfile.Size = new Size(480, 272);
src.OutputFormat.VideoProfile.FrameRate = 30;
src.OutputFormat.VideoProfile.KeyFrameDistance = new TimeSpan(0, 0, 4);
src.OutputFormat.AudioProfile = new WmaAudioProfile();
src.OutputFormat.AudioProfile.Bitrate = new 
    VariableConstrainedBitrate(128, 192);
src.OutputFormat.AudioProfile.Codec = AudioCodec.WmaProfessional;
src.OutputFormat.AudioProfile.BitsPerSample = 24;


Job job = new Job();
job.MediaItems.Add(src);
job.OutputDirectory = @"C:\EncodedFiles";
job.Encode();

VideoProfile 指定視訊轉碼器,與詳細的設定,以使用編碼時一起使用。 同樣地,[AudioProfile 指定音訊轉碼器,以使用它的設定。 第一個參數建構一個 VariableConstrainedBitrate 時, 指定平均位元速率,和第二個參數指定的最大位元速率。 大小] 設定值是表示應該納入編碼的視訊的方塊。 視訊的 Adrenaline 快攻正確地縮放的大小是實際 480 x 272 来維持長寬] 比例,但如果輸入 480 x 480 結果視訊仍會是 480 x 272。

圖 2 ’s KeyFrameDistance 屬性是指視訊編碼的概念,我還 haven’t 討論。 最視訊編碼的運作方式是儲存只變更框架中的下一個,而不是整張圖片,每個視訊畫面的方式。 主要畫面格是包含整個影像的框架。 每隔四秒時,此程式碼會建立主要畫面格。 當視訊,如場景的變更有大的變更,但您也應該建立它們在預先定義的時間間隔,以支援搜尋在影片播放時,就會自動建立主要畫面格。

資料流的 Silverlight 平滑

Silverlight 平滑串流動態切換播放基礎上目前的網路狀況的媒體檔案的 「 位元速率。 平滑資料流的專案包含個別.ismv 的檔案,以及支援平滑串流播放的.ism 和.ismc 中繼資料檔中儲存的視訊。

若要建立 Silverlight 平滑資料流的專案,必須進行多項變更。 第一次,變更 [KeyFrameDistance 為兩秒。 如果 [KeyFrameDistance 就會留在四個的秒數,但是當播放程式切換 bitrates,您可能會注意到 hiccups 中播放,仍然會播放視訊。 Silverlight 播放程式將要求是更一致,如果有 ’s 每個要求的開頭的主要畫面格播放的視訊,兩秒的區塊中。 您也需要加入下面這一行:

src.OutputFormat.VideoProfile.SmoothStreaming = true;

將 SmoothStreaming 設定為 True 會告訴輸出.ismv 檔案視訊,並建立.ism 和 ismc 檔案編碼器。 您需要新增多個資料流至 [VideoProfile 有一個位元速率 isn’t 真的平滑的串流專案,所以來建立多個的輸出 bitrates。 執行這項操作使用 的 圖 3 類似的程式碼。

圖 3 的 新增資料流的 Silverlight 平滑

MediaItem src = new MediaItem(@"C:\WMdownloads\AdrenalineRush.wmv");
src.OutputFormat = new WindowsMediaOutputFormat();

src.OutputFormat.VideoProfile = new AdvancedVC1VideoProfile();
src.OutputFormat.VideoProfile.KeyFrameDistance = new TimeSpan(0, 0, 2);
src.OutputFormat.VideoProfile.SmoothStreaming = true;
src.OutputFormat.VideoProfile.Streams.Clear();
src.OutputFormat.VideoProfile.Streams.Add(new StreamInfo(new 
    VariableConstrainedBitrate(2000, 3000), new Size(1280, 720)));
src.OutputFormat.VideoProfile.Streams.Add(new StreamInfo(new 
    VariableConstrainedBitrate(1400, 1834), new Size(848, 476)));
src.OutputFormat.VideoProfile.Streams.Add(new StreamInfo(new 
    VariableConstrainedBitrate(660, 733), new Size(640, 360)));

src.OutputFormat.AudioProfile = new WmaAudioProfile();
src.OutputFormat.AudioProfile.Bitrate = new 
    VariableConstrainedBitrate(128, 192);
src.OutputFormat.AudioProfile.Codec = AudioCodec.WmaProfessional;
src.OutputFormat.AudioProfile.BitsPerSample = 24;

Job job = new Job();
job.MediaItems.Add(src);
job.OutputDirectory = @"C:\EncodedFiles";
job.Encode();

以下程式碼會指定三個不同的 bitrates 和 
encode 的大小。 最佳的品質視訊大小必須縮小為位元速率會降低。 在指定您自己 bitrates 時您可以使用運算式編碼器 3 UI 中的 IIS 平滑資料流] 設定。 請注意它 ’s 不可能取得編碼比原始程式檔的更高解析度的視訊的品質。 然後,它只會編碼在較高的位元速率,比原始程式檔中,如果使用較弱的壓縮方法的有意義。 如果能夠判斷位元速率,原始程式檔的 SDK,將會出現在 MediaItem ’s SourceVideo 設定檔屬性:

int bitrate = ((ConstantBitrate)src.SourceVideoProfile.Bitrate).Bitrate;

如果 SDK couldn’t 取得原始程式檔的位元速率,您可以得到很接近的估計值,根據檔案大小。 這裡 ’s 公式:

大約的位元速率中 KB/s = (檔案大小,以 KB 為單位 * 8 / 視訊的持續時間,以秒為單位)-以 KB/s 的音訊位元速率

您可以使用 System.IO.FileInfo 類別以取得原始程式檔的大小和以取得工期 MediaItem.FileDuration] 屬性和音訊位元速率 SDK。 如果您 don’t 知道音訊位元速率,使用 128 或 160 來估計 (大部分的音訊 bitrates 是介於 64 到 192 之間 ;) 您也可以取得 Windows 媒體播放機屬性] 視窗中的音訊位元速率 (請按 Alt] 以顯示 [的] 功能表然後檔案 | 內容)。

監視進度

因為編碼的工作可能需要小時才能完成,’s 可以看到編碼的進度,很有幫助。 SDK 提供簡單的方法,用來監視透過事件,您可以加入的處理常式編碼的處理程序:

job.EncodeProgress += new EventHandler<EncodeProgressEventArgs>(OnProgress);

加入如下所示的處理事件的方法:

static void OnProgress(object sender, EncodeProgressEventArgs e)
{
  Console.Clear();
  Console.WriteLine((100 * (e.CurrentPass - 1) + e.Progress) / e.TotalPasses + "%");
}

multi-pass 編碼方式是與這個程式碼範例相關的新概念。 使用變數的位元速率編碼時, 處理程序是在稱為 傳遞 的兩個步驟。 第一個] 程序期間視訊來源被分析,以判斷哪些部分是最複雜,並可受益於更高的位元速率。 第二個] 程序期間會使用在第一階段期間取得的資訊編碼視訊。 因此,使用 [常數的位元速率如果 ’s 不需要使用 CurrentPass 或 TotalPasses EncodeProgressEventArgs 類別屬性。

結合影片

如果您想要進行編碼的視訊的組件,或將多個視訊組合成一個 SDK 提供支援。 修改開始,並停止來源媒體項目的時間,您可以修改的多媒體項目] 屬性。 要編碼只有前六秒的視訊,使用類似的程式碼:

src.Sources[0].Clips[0].StartTime = new TimeSpan(0);
src.Sources[0].Clips[0].EndTime = new TimeSpan(0, 0, 6);

新增為原始程式檔的其他視訊,您可以額外的視訊附加至您 MediaItem 的 [來源] 屬性。 這會將編碼來源檔案,以單一輸出檔案的順序:

MediaItem src = new MediaItem(@"C:\WMdownloads\AdrenalineRush.wmv");
src.Sources.Add(new Source(@"C:\WMdownloads\Video2.wmv"));

即時編碼方式

運算式編碼器也支援編碼方式從即時來源,例如網路攝影機。 概念 (和程式碼) 是類似編碼視訊的檔案,但您會使用一組不同的類別。 這些是 Microsoft.Expression.Encoder.Live 命名空間中找到。

若要使用的第一個類別是 LiveJob。 LiveJob 的作用類似 Encoder.Job—it 控點的編碼視訊的工作。 但是,即時的案例中,OutputFormat 是 LiveJob 的屬性,而非 MediaItem 物件 (也就是不需要)。 當 LiveJob 物件具現化時,它會尋找連接到電腦的視訊輸入裝置,並填入 VideoDevices 和 AudioDevices 屬性。 您接著可以使用這些作為輸入的來源的編碼器。 圖 4 顯示範例。

圖 4 的 編碼方式的即時視訊

using (LiveJob job = new LiveJob())
{
  LiveDevice videoDevice = job.VideoDevices[0];
  LiveDevice audioDevice = job.AudioDevices[0];
  LiveDeviceSource liveSource = job.AddDeviceSource(videoDevice, 
      audioDevice);
  job.ActivateSource(liveSource);
  WindowsMediaBroadcastOutputFormat outputFormat = new 
     WindowsMediaBroadcastOutputFormat();
  outputFormat.BroadcastPort = 8080;
  job.OutputFormat = outputFormat;
  Console.WriteLine("Press enter to stop encoding...");
  job.StartEncoding();
  Console.ReadLine();
  Console.WriteLine("Stopping");
  job.StopEncoding();
}

這將會開始使用網路攝影機 (假設您有一個連線) 的即時編碼工作階段及廣播連接埠 8080 您本機電腦上。若要檢視即時編碼,開啟 Windows 媒體播放程式],然後選取 [檔案 | 開啟 URL,並輸入 mms://localhost:8080。有些緩衝之後, 您應該會看到視訊從您的網路攝影機雖然您發現一個 20 到 30 秒延隔時間,因為要進行編碼,並傳輸資料流所需的時間。可能,您可以使用 Windows 媒體服務或 IIS 媒體服務為來源此視訊廣播世界。

其他工具

如果 aren’t 確定是否選擇的編碼方式設定會為您提供您所需要的輸出品質,運算式編碼器 3 UI 會提供方便的功能稱為 A / B 比較。這可讓您進行編碼的視訊周圍目前播放位置 5 秒。編碼的視訊的分割畫面會與您的視訊來源 (請參閱 的 圖 5) 讓您可以輕易地比較與原始的編碼視訊的品質。

圖 5 A / B 比較運算式編碼器 3 中

您可儲存目前的設定使用者定義的預設即可編輯 | 將目前設定儲存為預設。預設會儲存為 XML 檔案可以使用 SDK 中:

job.ApplyPreset(@"C:\WMdownloads\NewPreset.xml");

如果您已經 ’re 思考自動化視訊轉換程序,與主控台應用程式會是的簡單,看一下轉換媒體 PowerShell 模組的運算式編碼器,可用在 convertmedia.codeplex.com 。這個 PowerShell 模組換行運算式編碼器 SDK 提供命令列的編碼介面,而不需撰寫任何程式碼。如同所有的 CodePlex 專案是開放原始碼。

希望您現在瞭解視訊編碼方式與相關的核心術語與可使用哪些轉碼器和位元速率的明智的決策。您也知道如何使用運算式編碼器 3 SDK 編碼視訊的 Xbox 360、 iPhone 和 Silverlight,等的特定目標,以及即時資料流視訊。因此 don’t 等待困在您 attic 像克拉克工時若要瞭解您的家庭錄影帶和遺忘的回憶值 Griswold。將它們轉換成將會讓他們可存取世界的格式。

Adam Miller 是為在 Lincoln,Neb.Nebraska 通用的軟體工程師 您可以遵循 Miller ’s 部落格,在 blog.milrr.com.

多虧給來檢閱這份文件的技術專家下列:Ben Rush