【Win 10 應用開發】多媒體轉碼

來源:互聯網
上載者:User

標籤:

 

上次本來說好,今天咱們來討論 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 應用開發】多媒體轉碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.