標籤:
上次本來說好,今天咱們來討論 socket 相關的話題,但,對於 socket ,老周還有一些問題沒弄清楚,等弄清楚了,再和大夥伴們一起探討。故,今天咱們扯一扯多媒體轉碼的事。
聽起來挺複雜的,不過,由於有現成的API,使得在UWP中完成轉碼並不算複雜,我一說,大家就會懂的。
不說F話,直入正題吧。多媒體轉碼相關的API在 Windows.Media.Transcoding 命名空間下,具體的使用步驟如下:
a、new一個MediaTranscoder執行個體,不用教你了吧。
b、正常情況下,不用修改什麼屬性,直接可以幹活。調用 PrepareXXXXTranscodeAsync 方法做好轉碼操作的準備。如果輸入/輸出的是媒體檔案(如MP4、MP3、WMV、Mkv等),那就調用PrepareFileTranscodeAsync方法;如果是以流的形式輸入/輸出的,就調用PrepareStreamTranscodeAsync方法。
c、調用 PrepareXXXXXXX後,會得到一個 PrepareTranscodeResult 執行個體,注意啊,此時轉碼操作還沒開始呢,別興奮得太早了,此前只是分析階段,看看你輸入的檔案的人品夠不夠格,如果夠格就可以轉碼,不夠格就沒辦法了。實際上是分析系統當前所支援的解碼/編碼器。
d、訪問 PrepareTranscodeResult 對象的 CanTranscode 屬性以確定能不能轉碼,你要確認它返回 true 才能進行轉碼。要想知道無法轉碼的原因,可以訪問FailureReason屬性,它是個枚舉值,我就不一一說了,看名字就懂的,不懂就查字典。
e、確認可以轉碼後,調用 PrepareTranscodeResult對象的 TranscodeAsync() 方法,就會開始轉碼了,這是可以非同步等待的方法,別問我是啥,回家複習一下 C# 5 新特性就明白了。
由於轉碼的過程較長,具體看檔案類型,反正我轉碼一集電視劇的mkv檔案為mp4檔案,用了15分鐘左右,可能是我的電腦配置拖了後腿。所以,最好可以監測轉碼的進度,並在使用者介面上即時顯示處理進度,不然的話,不懂事的小孩子會以為你的程式掛了。
比較提升人品的做法是調用AsTask擴充方法,把基於RT的非同步作業轉化為基於.NET的Task模型的操作,這樣一來,既可以用.net中的Progress<T>來報告進度,用CancellationTokenSource來取消操作。
放心,後面老周會給大夥上核心代碼,其他代碼的話,自己下載樣本源碼看吧,看懂了不要問我,看不懂也不要問我。
看,啟動轉碼操作的代碼如下:
int n = cmbOutputFmt.SelectedIndex; MediaEncodingProfile profile = null; if (n == 0) //mp4 profile = MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD720p); else // wmv profile = MediaEncodingProfile.CreateWmv(VideoEncodingQuality.HD720p); // 開始轉碼 btnSelInputfile.IsEnabled = btnSelOutputfile.IsEnabled = btnTranscode.IsEnabled = false; btnCancelTranscode.IsEnabled = true; var prptransres = await transcoder.PrepareFileTranscodeAsync(inputFile, outputFile, profile); if (prptransres.CanTranscode) { if (canceltsrc != null) { canceltsrc.Dispose(); canceltsrc = null; } canceltsrc = new CancellationTokenSource(); var progress = new Progress<double>(ps => { tbmsg.Text = $"當前處理進度:{ps:N0}%"; }); await prptransres.TranscodeAsync().AsTask(canceltsrc.Token, progress); tbmsg.Text = "轉碼完成。"; } else { tbmsg.Text = "此格式暫不受支援。"; }
注意,在調用PrepareFileTranscodeAsync方法時,需要提供一個MediaEncodingProfile執行個體,這個傢伙用來幹嗎?它用來描述轉碼的目標類型的屬性的配置,記住,是描述輸出媒體的格式,不是輸入媒體。
比如我要把一個視頻檔案轉碼為一個.mp4檔案,那麼這個參數就要一個描述MP4的配置資訊,使用CreateMp4靜態方法可以直接獲得執行個體。
要取消轉碼過程,可以調用CancellationTokenSource執行個體的Cancel方法,調用後會取消操作,當會得到一個異常,在調試時會拋出,在直接運行時你自己想辦法過濾。
好,重點知識講完了,其他代碼不重要,可以自行查看樣本項目。
看看運行結果,老周拿出收藏多年的六小齡童版《西遊記》電視劇來轉換為MP4。。
這些轉碼API支援輸入.mkv、.avi、.mov、.asf、.flac等檔案格式,至於說.ra和.rmvb就別做夢了,畢竟已經過時的格式。
樣本原始碼下載
===========================================================
哦,差點忘了講故事。
有人會問,老周,你不編程的時候,平時都幹些什麼。
編程是職業,至於業餘嘛,老周乾的事情可多了,只要不違法,不違德的事都可以幹。有人找我去玩就去耍耍,如果沒人找我玩,就在家自己耍,聽音樂、看書、詩詞歌賦、寫字塗鴉,笛子瑤琴電子琴,看電視看新聞。反正,家裡能找得出來的東西都能耍,晚上睡覺前可以看恐怖片。
實在悶得很就獨自出去散步,什麼廣場、公園、電腦城、手機店、古玩市場、畫廓、文具店、影劇院,都可以去耍耍。
總之一句話——生活充實得很。
【Win 10 應用開發】多媒體轉碼