在我最喜歡的一個(gè)電影場(chǎng)景中,Clark W. Griswold(《瘋狂圣誕假期》中由 Chevy Chase 飾演)在藏圣誕禮物時(shí)將自己困在了閣樓上。為了保暖,他戴上了從落滿灰塵的衣柜中找到的 粉紅色手套、綠色帽子和棕色毛皮披肩。在衣柜底部,他發(fā)現(xiàn)了從少年時(shí)期開始錄制的家庭電 影。他含著眼淚,用一臺(tái)老舊的電影放映機(jī)看完了這些電影。 從那時(shí)起,家庭電影已經(jīng)經(jīng)歷了一段漫長(zhǎng)的歷程,但是人們?nèi)匀槐煌粋€(gè)問題所困擾:如何 向親朋好友展示我的電影?我們可以通過 YouTube、Vimeo 和 Facebook 這樣的網(wǎng)站輕松共享 視頻,但是對(duì)于每分鐘上百兆字節(jié)的高清視頻來說,將數(shù)據(jù)上傳到這些網(wǎng)站是一項(xiàng)非常費(fèi)時(shí)的 任務(wù)。您的便攜式設(shè)備、游戲系統(tǒng)或家庭影院媒體中心甚至有可能播放不了這些文件。為了解 決這些問題,您需要將視頻轉(zhuǎn)換為其他格式。這個(gè)過程稱為“編碼”。 關(guān)于 Expression Encoder Microsoft 視頻編碼工具 Expression Encoder 3 是 Expression 系列產(chǎn)品的一部分,該系 列產(chǎn)品可用來為 Web 和桌面應(yīng)用程序創(chuàng)建引人注目的用戶界面。Expression Encoder 同時(shí)提 供免費(fèi)版和付費(fèi)版。付費(fèi)版包含在 Expression Studio 3 Suite(599 美元)和 Expression Web 3 Suite(149 美元)中。免費(fèi)下載版不支持編碼成 Silverlight Smooth Streaming 或 H.264 視頻,也不支持 H.264 視頻源,但是支持編碼成 Windows Media Video 文件,并帶有 一個(gè)不錯(cuò)的 SDK。本文中的許多代碼示例要求使用付費(fèi)版的程序,但是所有的代碼示例都可以 在免費(fèi)版的 SDK 中編譯生成,只是會(huì)在運(yùn)行時(shí)收到 InvalidMediaException 或 FeatureNotAvailableException 提示。 如果您不打算購(gòu)買 Expression Suite,可以通過以下鏈接下載免費(fèi)版的 Expression Encoder:microsoft.com/expression。Expression Professional MSDN 訂閱或 Visual Studio Professional with MSDN Premium 訂閱中也包含 Expression Encoder。請(qǐng)注意,您只 需花費(fèi) 149 美元就可以購(gòu)買到帶有此功能包且支持各種輸入和輸出格式的專業(yè)視頻編碼軟件應(yīng) 用程序,這真是一個(gè)相當(dāng)優(yōu)惠的價(jià)格。而購(gòu)買類似的視頻編碼解決方案則要付出多達(dá) 3,000 美 元。 無論您選擇哪種版本,都要安裝 Encoder 3 QFE。它增加了對(duì)更多文件類型和輸入設(shè)備的支 持,改善了某些情況下的程序性能,并修復(fù)了一些小的錯(cuò)誤。QFE 安裝程序可在 Microsoft Expression 網(wǎng)站的 Expression Encoder 頁(yè)面獲得。 支持的格式 支持以下輸入視頻格式: Windows Media Video (.wmv) DVD 視頻 (.vob) MPEG(.mpg、.mpeg) Audio Video Interleave (.avi) Microsoft Digital Video Recording (.dvr-ms) 付費(fèi)版軟件增加了對(duì)以下格式的支持(另外還支持一些其他格式): MPEG-4(.mp4、.m4v) Quicktime (.mov) AVC HD (.mts) 移動(dòng)設(shè)備視頻(.3gp、.3g2) 在大多數(shù)情況下,Expression Encoder 支持 Windows Media Player 能夠播放的任何媒體 文件。如果您要支持更多文件格式(并且能夠在 Windows Media Player 中播放),您需要安 裝一個(gè)編解碼器,例如 K-Lite Codec Pack (codecguide.com) 或 Community Combined Codec Pack (cccp-project.net)。這兩種編解碼器都基于開源 ffdshow 項(xiàng)目,并且會(huì)添加對(duì) VP6 編 碼的 Flash (.flv) 文件、Matroska 容器中的 H.264 視頻 (.mkv) 以及 Ogg 視頻 (.ogg) 文 件的支持。 免費(fèi)版的 Expression Encoder 僅支持 Microsoft VC-1 作為輸出編解碼器。然而,您仍然 能夠?yàn)?Silverlight(僅單比特率)、Xbox 360、Zune 和 Zune HD 編碼視頻。而且,VC-1 編 解碼器也不錯(cuò),其壓縮能力與 H.264 不相上下(某些情況下可能更好)。升級(jí)到付費(fèi)版軟件, 您就可以輸出 Silverlight Smooth Streaming 視頻(多比特率)和 H.264 視頻,這意味著您 編碼的視頻能夠在 iPhone、PS3、Flash 播放器(版本 10 支持 H.264/.mp4)和其他無數(shù)設(shè)備 上播放。 編碼基礎(chǔ)知識(shí) 如果要支持特定的輸出設(shè)備,則需要更改視頻配置文件的一些設(shè)置,所以您需要了解視頻編 碼的一些基本知識(shí)。對(duì)視頻進(jìn)行重新編碼實(shí)際上是對(duì)視頻進(jìn)行解壓縮,然后使用其他編解碼器 或是手動(dòng)更改視頻屬性(例如大小、長(zhǎng)寬比或幀速率),對(duì)其重新壓縮。盡管存在無損壓縮方 法,但并不常用,因?yàn)橛眠@些方法壓縮出來的視頻文件仍舊太大。因此,為了減少存儲(chǔ)(以及 傳輸)視頻所需的空間,就需要一種算法(我們稱之為編解碼器)來壓縮和解壓縮視頻。壓縮 后的視頻流隨即按照某種規(guī)范(我們稱之為容器,如 WMV 或 MP4)存儲(chǔ)起來。容器和編解碼器 通常不是綁定使用的,因此盡管 H.264 是 MP4 容器中最常見的編解碼器,但也可以使用其他 編解碼器?!?/p> 比特率,以每秒千比特來表示,用于定義應(yīng)該使用多少數(shù)據(jù)來存儲(chǔ)壓縮的視頻。降低比特率 即是讓編碼器用較高的比率來壓縮視頻,因此會(huì)降低視頻的質(zhì)量。有不同的方法可用于指示編 碼器如何確定視頻的比特率。最簡(jiǎn)單的方法就是使用恒定比特率 (CBR),強(qiáng)迫編碼器對(duì)每一秒 視頻使用相同數(shù)量的數(shù)據(jù)??勺儽忍芈?(VBR) 用來告訴編碼器,文件的整體比特率應(yīng)該是多少 ,但是允許編碼器根據(jù)視頻的特定區(qū)段所需的數(shù)據(jù)量,來提高或降低比特率。限制可變比特率 類似于不受限的 VBR,唯一的差別是您不僅要指定一個(gè)平均比特率,還要指定一個(gè)最高比特率 作為上限。 在對(duì) Silverlight Smooth Streaming 視頻進(jìn)行編碼時(shí),限制可變比特率非常有用。它有助 于確保比特率不會(huì)超出客戶端帶寬,避免迫使客戶端請(qǐng)求質(zhì)量較差的視頻流。CBR 和 VBR 通過 指定整體視頻文件的大小來指明要使用的壓縮量。 或者,您也可以讓編碼器使用基于質(zhì)量的 VBR。您不用指定視頻的整體大小,而是指定一個(gè) 質(zhì)量百分比,也就是在解壓后要保留的源視頻中數(shù)據(jù)量。例如,相對(duì)于自然風(fēng)光或動(dòng)作視頻, 卡通視頻只需保留較少的數(shù)據(jù)量就可以保持高質(zhì)量的視頻。因此,如果您擁有高質(zhì)量的源視頻 ,并且希望將其轉(zhuǎn)換成其他格式并保留最佳質(zhì)量,可以考慮使用基于質(zhì)量的 VBR。這些定義只 是冰山一角,但它們是選擇輸出設(shè)置的核心概念。在本文中,您還能夠看到其他的編碼定義應(yīng) 用在不同的代碼示例中。 我會(huì) 使用 Adrenaline Rush 視頻作為這些示例的源。 安裝完 Expression Encoder 3 后,創(chuàng)建一個(gè)新的 Visual Studio C# 控制臺(tái)應(yīng)用程序項(xiàng)目 。添加對(duì) Microsoft.Expression.Encoder.dll 和 Microsoft.Expression.Encoder.Utilities.dll 的引用,這兩個(gè)文件位于 \Program Files (x86)\Microsoft Expression\Encoder 3\SDK。您還需要添加對(duì) WindowsBase 的引用(您可以 在“添加引用”對(duì)話框的“.NET”選項(xiàng)卡中找到 WindowsBase)。用到的許多類位于 Microsoft.Expression.Encoder 命名空間中,所以要為其添加一條 using 語句。 要實(shí)例化的第一項(xiàng)是 MediaItem 對(duì)象。MediaItem 構(gòu)造函數(shù)使用一個(gè)字符串作為構(gòu)造函數(shù) 的唯一參數(shù)。該參數(shù)用于傳遞將在編碼項(xiàng)目中用作源的文件的路徑:
創(chuàng)建 MediaItem 對(duì)象僅需一兩秒鐘的時(shí)間,但 SDK 會(huì)在后臺(tái)進(jìn)行大量的工作:收集關(guān)于源 視頻的信息,例如高、寬、幀速率(在屏幕上顯示各幅圖像的頻率)和持續(xù)時(shí)間。同時(shí)還會(huì)收 集有關(guān)音頻流的信息。 接下來創(chuàng)建 Job 類的實(shí)例(僅包含一個(gè)無參數(shù)的構(gòu)造函數(shù)),然后將您的 MediaItem 添加 到該實(shí)例的 MediaItems 列表中。Job 類充當(dāng)了所需輸出格式(稱為配置文件)的管理器:
現(xiàn)在您需要指示 Job 類在編碼過程中要使用哪些音頻和視頻配置文件,最簡(jiǎn)單的方法是使 用在用戶界面中定義的某個(gè)配置文件。例如,若要為 Zune HD 創(chuàng)建視頻,可以使用 VC1ZuneHD 預(yù)設(shè)配置:
最后,指定輸出目錄并開始編碼過程:
您的 Program.cs 文件應(yīng)當(dāng)與圖 1 類似。 圖 1 為 Zune HD 創(chuàng)建視頻
在運(yùn)行應(yīng)用程序之前,還有最后一件事要做:如果您使用的是 64 位 Windows,您需要修改 項(xiàng)目,將其編譯目標(biāo)設(shè)為 x86 平臺(tái)。在 Visual Studio 菜單欄中,選擇“項(xiàng)目”和“(項(xiàng)目名 稱) 屬性”。在打開的對(duì)話框中,選擇“生成”選項(xiàng)卡并將“目標(biāo)平臺(tái)”的值由“任何 CPU” 改為“x86”。 現(xiàn)在您就可以運(yùn)行應(yīng)用程序,并創(chuàng)建可在 Zune HD 上播放的視頻了。編碼過程需要幾分鐘 的時(shí)間,而且極占 CPU 資源。作為并行計(jì)算任務(wù)運(yùn)行,對(duì)于視頻編碼過程非常有益,所以多核 計(jì)算機(jī)在這里非常有優(yōu)勢(shì)。 Expression Encoder 還包含一些用于針對(duì)在線服務(wù)(例如 YouTube、Vimeo 和 Facebook) 進(jìn)行編碼的預(yù)設(shè)配置。用我的 Panasonic Lumix DMC-ZS3 數(shù)碼攝像機(jī)拍攝的 720p 視頻每分鐘 大約要消耗 110MB 空間。而使用 YouTube HD 預(yù)設(shè)配置(同樣為 720p)轉(zhuǎn)換視頻,則可以把 視頻減小至僅僅 16MB。這極大地提高了上傳和本地存儲(chǔ)的效率。將視頻轉(zhuǎn)換為 .mp4 文件,還 能讓它與更多的視頻編輯程序兼容。 自定義設(shè)置 若要手動(dòng)實(shí)現(xiàn)和 VC1ZuneHD 預(yù)設(shè)配置相同的效果,您需要使用與圖 2 中類似的代碼來設(shè)置 視頻和音頻配置文件。對(duì)于圖 2 中要編譯的代碼,您需要添加對(duì) Microsoft.Expression.Encoder.Utilities 和 System.Drawing 的引用。還要為 Microsoft.Expression.Encoder.Profiles 和 System.Drawing 添加 using 語句。 OutputFormat 本質(zhì)上用來指定輸出文件的容器。我提到“本質(zhì)上”是因?yàn)?Silverlight 的編 碼原理只有少許不同(稍后我要談到這一點(diǎn))。 圖 2 Zune HD 的視頻和音頻配置文件設(shè)置
VideoProfile 指定要使用的視頻編解碼器,以及編碼時(shí)要使用的詳細(xì)設(shè)置。同樣, AudioProfile 指定要使用的音頻編解碼器及其設(shè)置。構(gòu)造 VariableConstrainedBitrate 時(shí), 第一個(gè)參數(shù)用于指定平均比特率,第二個(gè)參數(shù)用于指定最高比特率。大小設(shè)置用于指定容納編 碼后的視頻的框。對(duì)于 Adrenaline Rush 視頻,正確的大小設(shè)置實(shí)際上應(yīng)為 480x272 以維持 長(zhǎng)寬比。但如果我輸入 480x480,得出的視頻依然是 480x272。 圖 2 中的 KeyFrameDistance 屬性指的是一種視頻編碼概念,這個(gè)概念我還沒有談到。大 多數(shù)視頻編碼方式是只保存一幀到下一幀之間的變化,而不是保存每個(gè)視頻幀的整個(gè)畫面。關(guān) 鍵幀是包含整個(gè)畫面的幀。本代碼每四秒創(chuàng)建一個(gè)關(guān)鍵幀。每當(dāng)視頻中有重大變化(例如場(chǎng)景 變化)時(shí),就會(huì)自動(dòng)創(chuàng)建關(guān)鍵幀,但是您還應(yīng)當(dāng)按照預(yù)定義的間隔創(chuàng)建關(guān)鍵幀,以方便在電影 播放時(shí)進(jìn)行視頻檢索。 Silverlight Smooth Streaming Silverlight Smooth Streaming 可以根據(jù)當(dāng)前的網(wǎng)絡(luò)狀況動(dòng)態(tài)切換正在播放的媒體文件的 比特率。Smooth Streaming 項(xiàng)目由存儲(chǔ)在 .ismv 文件、.ism 和 .ismc 元數(shù)據(jù)文件中的各個(gè) 視頻組成,后兩者支持 Smooth Streaming 播放。 若要?jiǎng)?chuàng)建 Silverlight Smooth Streaming 項(xiàng)目,必須進(jìn)行多處更改。首先,將 KeyFrameDistance 改為兩秒。如果 KeyFrameDistance 保留為四秒,視頻仍可以播放,但是當(dāng) 播放器切換比特率時(shí),您會(huì)注意到播放時(shí)會(huì)出現(xiàn)停頓。Silverlight 播放器將請(qǐng)求視頻按照兩 秒鐘一個(gè)塊來播放,因此如果在每個(gè)請(qǐng)求開始的時(shí)候有一個(gè)關(guān)鍵幀,播放會(huì)更加流暢。您還需 要添加以下行:
將 SmoothStreaming 設(shè)為 true,可讓編碼器將視頻輸出為 .ismv 文件,并創(chuàng)建 .ism 和 ismc 文件。只具備一個(gè)比特率不是一個(gè)真正流暢的流項(xiàng)目,所以為了創(chuàng)建多個(gè)輸出比特率,您 需要向 VideoProfile 添加多個(gè)流。使用類似圖 3 中的代碼來實(shí)現(xiàn)這個(gè)目的。 圖 3 添加 Silverlight Smooth Streaming
這些代碼指定了三種不同的比特率和大小來進(jìn)行編碼。為了獲得最佳效果,視頻大小需要隨 比特率的降低而縮小。指定自己的比特率時(shí),您可以使用 Expression Encoder 3 UI 中的 IIS Smooth Streaming 設(shè)置。請(qǐng)注意,以高出源文件的分辨率來對(duì)視頻進(jìn)行編碼,是不可能獲得更 高質(zhì)量的。唯一有可能的是,如果使用較弱的壓縮方法,則可以以高出源文件的比特率來對(duì)視 頻進(jìn)行編碼。如果 SDK 能夠確定源文件的比特率,將會(huì)顯示在 MediaItem 的 SourceVideo Profile 屬性中:
如果 SDK 無法獲得源文件的比特率,您可以根據(jù)文件大小估算出一個(gè)相當(dāng)接近的值。這是 具體的估算公式: 以 kb/s 為單位的大概比特率 =(以千字節(jié)為單位的文件大小 * 8 / 以秒為單位的視頻持 續(xù)時(shí)間)- 以 kb/s 為單位的音頻比特率 您可以使用 System.IO.FileInfo 類來獲得源文件大小,用 SDK 來獲得持續(xù)時(shí)間 (MediaItem.FileDuration 屬性)以及可能的音頻比特率。如果您不知道音頻比特率,可以使 用 128 或 160 來估算(大多數(shù)的音頻比特率都介于 64 和 192 之間),您還可以通過 Windows Media Player 的“屬性”窗口(按 Alt 鍵顯示菜單,然后選擇“文件”|“屬性”) 獲得音頻比特率。 監(jiān)視進(jìn)度 因?yàn)橐豁?xiàng)編碼任務(wù)要花費(fèi)數(shù)小時(shí)才能完成,能夠看到編碼進(jìn)度是非常有幫助的。SDK 提供了 一種簡(jiǎn)單的方法,即通過事件來監(jiān)視編碼進(jìn)度,您可以為該事件添加處理程序: job.EncodeProgress += new EventHandler<EncodeProgressEventArgs> (OnProgress); 添加一個(gè)類似如下的方法來處理事件:
多通路編碼是一個(gè)與本代碼示例相關(guān)的新概念。使用可變比特率進(jìn)行編碼時(shí),過程分為兩步 ,稱為通路。在第一個(gè)通路中,分析源視頻以確定哪部分最復(fù)雜,并能夠通過提高比特率獲益 。在第二個(gè)通路中,使用在第一個(gè)通路中獲得的信息對(duì)視頻進(jìn)行編碼。因此,如果您使用了恒 定比特率,就沒有必要使用 EncodeProgressEventArgs 類的 CurrentPass 或 TotalPasses 屬 性。 合并視頻 如果您只想對(duì)視頻的一部分進(jìn)行編碼,或者要合并多個(gè)視頻,SDK 也提供了支持。若要修改 源媒體項(xiàng)的開始和結(jié)束時(shí)間,您可以修改 Clips 屬性。如果只想對(duì)視頻的前六秒進(jìn)行編碼,可 以使用類似以下的代碼:
若要添加其他視頻作為源文件,您可以將其他視頻附加到 MediaItem 的 Sources 屬性中。 這會(huì)將源文件按順序編碼到單一輸出文件中:
實(shí)時(shí)編碼 Expression Encoder 還支持對(duì)來自實(shí)時(shí)源(如網(wǎng)絡(luò)攝像頭)的內(nèi)容進(jìn)行編碼。這個(gè)概念( 和代碼)與對(duì)視頻文件進(jìn)行編碼類似,但是您需要使用一組不同的類。這些類可以在 Microsoft.Expression.Encoder.Live 命名空間中找到。 首先要使用的類是 LiveJob。LiveJob 類似 Encoder.Job,也是用來處理視頻編碼工作的。 但在實(shí)時(shí)方案中,OutputFormat 是 LiveJob 的屬性,而不是 MediaItem 對(duì)象(已經(jīng)不需要該 對(duì)象)。當(dāng) LiveJob 對(duì)象被實(shí)例化時(shí),它會(huì)尋找與計(jì)算機(jī)連接的視頻輸入設(shè)備,并填充 VideoDevices 和 AudioDevices 屬性。您隨后便可以將其用作編碼器的輸入源。圖 4 顯示了 一個(gè)示例。 Figure 4 對(duì)實(shí)時(shí)視頻進(jìn)行編碼
這將使用網(wǎng)絡(luò)攝像頭(假設(shè)您已經(jīng)連接)啟動(dòng)一個(gè)實(shí)時(shí)編碼會(huì)話,并在您本地計(jì)算機(jī)的端口 8080 上進(jìn)行廣播。若要查看實(shí)時(shí)編碼,請(qǐng)打開 Windows Media Player 并選擇“文件”|“打 開 URL”,然后輸入 mms://localhost:8080。經(jīng)過短時(shí)間的緩沖后,您應(yīng)當(dāng)可以看到來自網(wǎng)絡(luò) 攝像頭的視頻,但是會(huì)存在一段 20 至 30 秒的延遲。存在這段延遲是因?yàn)榫幋a和傳輸視頻流 需要一段時(shí)間。您應(yīng)該可以使用此視頻作為 Windows Media Services 或 IIS Media Services 的源,對(duì)外進(jìn)行廣播。 其他工具 如果不確定您選擇的編碼設(shè)置是否可以帶來所需的輸出質(zhì)量,可以使用 Expression Encoder 3 UI 提供的名為 A/B Compare 的方便功能。該功能使您可以對(duì)位于當(dāng)前播放位置附 近五秒鐘的視頻進(jìn)行編碼。編碼后的視頻將會(huì)與原始視頻分屏并列顯示出來(請(qǐng)參見圖 5), 這樣您就可以輕松比較編碼后的視頻和原始視頻的質(zhì)量。 圖 5 Expression Encoder 3 的 A/B Compare 功能 您隨后可以將當(dāng)前設(shè)置保存為用戶定義的預(yù)設(shè)配置,方法是單擊“編輯”|“將當(dāng)前設(shè)置保 存為預(yù)設(shè)配置”。該預(yù)設(shè)配置將保存為一個(gè) XML 文件,可供在 SDK 中使用:
如果您已經(jīng)想象過,通過控制臺(tái)應(yīng)用程序自動(dòng)執(zhí)行視頻轉(zhuǎn)換過程是多么簡(jiǎn)單的一件事,請(qǐng)看 看 Expression Encoder 的 Convert-Media PowerShell 模塊:convertmedia.codeplex.com。 這個(gè) PowerShell 模塊包含了 Expression Encoder SDK,提供了一個(gè)命令行編碼界面,無需編 寫任何代碼。就像所有 CodePlex 項(xiàng)目一樣,它是一個(gè)開源模塊。 現(xiàn)在,希望您已經(jīng)了解與視頻編碼相關(guān)的核心術(shù)語,并且在考慮使用哪些編解碼器和比特率 時(shí)能夠做出明智的決定。您還知道如何使用 Expression Encoder 3 SDK 針對(duì)特定目標(biāo)(例如 Xbox 360、iPhone 和 Silverlight,以及實(shí)時(shí)流式視頻)進(jìn)行視頻碼。所以,不要等到像 Clark W. Griswold 一樣將自己困在閣樓上,才意識(shí)到家庭視頻和被遺忘的記憶有多么重要。 將它們轉(zhuǎn)換成所有人都可以觀看的格式。 |
|