亚洲狠狠干,亚洲国产福利精品一区二区,国产八区,激情文学亚洲色图

具有可擴展媒體格式的托管應(yīng)用程序平臺的制作方法

文檔序號:6348676閱讀:248來源:國知局
專利名稱:具有可擴展媒體格式的托管應(yīng)用程序平臺的制作方法
具有可擴展媒體格式的托管應(yīng)用程序平臺背景當(dāng)代的瀏覽器和其它應(yīng)用程序允許插件,所述插件一般包括與主存瀏覽器/應(yīng)用程序交互以提供另外的功能的托管軟件代碼。使用插件的一個原因是提高安全,因為主存瀏覽器限制托管代碼(通常是不可信的)能夠執(zhí)行的動作。因特網(wǎng)已經(jīng)變得非常危險,有惡意網(wǎng)站經(jīng)常示圖導(dǎo)致用戶下載和運行可以損害用戶的計算機系統(tǒng)或者摧毀用戶的數(shù)據(jù)的有害代碼。因此,網(wǎng)頁瀏覽器通常包括對能夠運行的代碼以及被允許在用戶計算機系統(tǒng)上執(zhí)行動作的插件的限制。插件增加了由瀏覽器提供的沙箱的大小,因為它們在減少安裝的不可信應(yīng)用程序的數(shù)量的同時允許網(wǎng)頁上更多的功能。一個這樣的插件是微軟 的 Silverlight ,它提供了允許應(yīng)用程序開發(fā)者創(chuàng)建在瀏覽器中主存的豐富的網(wǎng)頁應(yīng)用程序的平臺,所述瀏覽器一般包括動畫、矢量圖形和/或媒體(例如音頻/視頻)內(nèi)容回放。另一個示例插件是Adobe 的Flash 。一般地,為了播放媒體,平臺提供托管應(yīng)用程序代碼調(diào)用的應(yīng)用程序編程接口(APIs)以指定存儲特定媒體內(nèi)容的位置,例如通過指定標(biāo)識出在打包媒體內(nèi)容的服務(wù)器上的文件或其它容器的統(tǒng)一資源定位符(URL)。平臺然后產(chǎn)生網(wǎng)絡(luò)請求以開始下載媒體。平臺通過解包媒體內(nèi)容來解析媒體內(nèi)容,以提取媒體內(nèi)容流來將其提供給用于回放的媒體流水線。像其它平臺一樣,微軟⑧的Silverlight 通過允許應(yīng)用程序下載或流動包含所支持格式的組合的文件來提供回放各種格式(WMV、WMA, MP3、H. 264、 AAC)的視頻和音頻的功能。允許的音頻和視頻類型是不可擴展的,并且執(zhí)行到所支持格式之一的轉(zhuǎn)換是資源密集的。不幸的是,如上文所述,這樣的平臺一般限于播放由平臺設(shè)計者預(yù)期的一種或多種已知格式的媒體內(nèi)容。例如,平臺可以包括諸如運動圖像專家組第4版(MPEG4或MP4)、 DIVX或其它格式等特定媒體類型的壓縮機和解壓縮機(編解碼器)。隨著用于進一步壓縮媒體內(nèi)容的新算法的發(fā)現(xiàn)以及用于傳遞與媒體內(nèi)容相關(guān)的附加信息的新場景的標(biāo)識,快速進化是編解碼器所常見的。因此,隨著時間推移平臺可以支持過時的或者不再流行或最有效的媒體格式。平臺更新一般是添加新的媒體格式支持的唯一途徑。此外,平臺設(shè)計者必須執(zhí)行額外的工作以實現(xiàn)對每種媒體格式的支持,這會造成平臺實現(xiàn)的龐大并且減緩將新的媒體類型支持添加至平臺的進程。一些編解碼器是專有的,因此如果有的話,平臺設(shè)計者無法添加對使用編解碼器而不通過編解碼器提供者授權(quán)編解碼器的媒體類型的支持。平臺經(jīng)常施加控制于哪些編解碼器應(yīng)用程序可以使用平臺的原因是為了確保安全。編解碼器經(jīng)常與計算機系統(tǒng)硬件密切地互動以顯示視頻和回放音頻,并且可以執(zhí)行對用戶計算機系統(tǒng)有害的動作?,F(xiàn)在的系統(tǒng)交換更廣發(fā)的媒體類型安全支持。此外,下載速度是通常檢查的插件度量,并且隨著平臺尺寸的增加,下載速度將降低。 因此,平臺設(shè)計者有動機支持更少的媒體格式以保持小的平臺尺寸。概述此處描述了媒體交互系統(tǒng),所述媒體交互系統(tǒng)允許托管應(yīng)用程序獨立于媒體內(nèi)容的格式消費和/或產(chǎn)生豐富的媒體內(nèi)容,同時仍然維護主機的安全。所述媒體交互系統(tǒng)接受來自托管應(yīng)用程序的原始、未壓縮的媒體數(shù)據(jù),并且允許托管應(yīng)用程序通過沙箱API來提供其自己的編解碼器,所述沙箱API將編解碼器能夠執(zhí)行的動作限于可信動作集。媒體交互系統(tǒng)調(diào)用提供給系統(tǒng)的應(yīng)用程序。應(yīng)用程序運行和下載來自服務(wù)器的壓縮的媒體內(nèi)容,或者可以在運行中創(chuàng)建媒體數(shù)據(jù)。媒體交互系統(tǒng)提供其中應(yīng)用程序可以安全地運行解壓縮代碼的沙箱,并且應(yīng)用程序提供代碼以將壓縮的媒體數(shù)據(jù)轉(zhuǎn)化為用于回放的未壓縮的數(shù)據(jù)。然后,應(yīng)用程序?qū)⑽磯嚎s的數(shù)據(jù)提供給用于回放的系統(tǒng)。因此,媒體交互系統(tǒng)提供應(yīng)用程序開發(fā)者支持的任意格式的豐富的媒體內(nèi)容,并且維護用戶的計算機系統(tǒng)的安全。提供本概述以便以簡化形式介紹將在以下詳細描述中進一步描述的一些概念。本概述并不旨在標(biāo)識出所要求保護的主題的關(guān)鍵或必要特征,也不旨在用于限定所要求保護的主題的范圍。附圖簡述

圖1是示出在一個實施例中的媒體交互系統(tǒng)的組件的框圖。圖2是示出在一個實施例中的系統(tǒng)在平臺級播放媒體的處理的流程圖。圖3是示出在一個實施例中的系統(tǒng)在應(yīng)用級播放媒體的處理的流程圖。圖4是示出在一個實施例中的媒體交互系統(tǒng)的操作環(huán)境的框圖。圖5是示出在一個實施例中的其中應(yīng)用級代碼來自抽象類型的更具體示例的框圖。圖6是示出在一個實施例中的與圖5的示例對應(yīng)的回放步驟的流程圖。圖7是示出在一個實施例中的處理自定義容器格式的媒體流源 (MediaStreamSource)的子類劃分的數(shù)據(jù)流圖。詳細描述此處描述了媒體交互系統(tǒng),所述媒體交互系統(tǒng)允許托管應(yīng)用程序獨立于媒體內(nèi)容的格式消費和/或產(chǎn)生豐富的媒體內(nèi)容,同時仍然維護主機的安全。所述媒體交互系統(tǒng)接受來自托管應(yīng)用程序的原始、未壓縮的媒體數(shù)據(jù),并且允許托管應(yīng)用程序通過沙箱API來提供其自己的編解碼器,所述沙箱API將編解碼器能夠執(zhí)行的動作限于可信動作集。媒體交互系統(tǒng)調(diào)用提供給系統(tǒng)的應(yīng)用程序。例如,網(wǎng)頁可以包括對系統(tǒng)的嵌入式參考以及指定應(yīng)用程序的參數(shù)。應(yīng)用程序運行和下載來自服務(wù)器的壓縮的媒體內(nèi)容,或者可以在運行中創(chuàng)建媒體內(nèi)容。例如,應(yīng)用程序可以從基于因特網(wǎng)的內(nèi)容服務(wù)器處下載視頻,或者基于本地信息來合成新的視頻(例如基于音頻文件中的節(jié)拍的音頻可視化)。媒體交互系統(tǒng)提供其中應(yīng)用程序可以安全地運行解壓縮代碼的沙箱,并且應(yīng)用程序提供代碼以將壓縮的媒體數(shù)據(jù)轉(zhuǎn)化為用于回放的未壓縮的數(shù)據(jù)。然后,應(yīng)用程序?qū)⑽磯嚎s的數(shù)據(jù)提供給用于回放的系統(tǒng)。因此,媒體交互系統(tǒng)提供應(yīng)用程序開發(fā)者支持的任意格式的豐富的媒體內(nèi)容,并且維護用戶的計算機系統(tǒng)的安全。原始媒體數(shù)據(jù)可以指一般是由媒體流水線準(zhǔn)備播放而不需要進一步解壓縮或類似處理的未壓縮的常見格式的多種類型的媒體數(shù)據(jù)。例如,視頻解碼器可以輸出原始的 YV12幀,或者音頻解碼器可以輸出PCM樣本。媒體內(nèi)容可以以各種壓縮的或者其它編碼格式(例如MP4或DIVX)到達托管應(yīng)用程序,由托管應(yīng)用程序解壓縮,并且然后以準(zhǔn)備就緒用于播放的常見格式提供給媒體交互系統(tǒng)。通過更新應(yīng)用程序而不更新平臺,可以進行對新媒體類型的更新。應(yīng)用程序還可以通過直接合成或者通過處理現(xiàn)有的音頻和視頻數(shù)據(jù)(例如應(yīng)用效果)來產(chǎn)生音頻和視頻數(shù)據(jù)以產(chǎn)生原始媒體數(shù)據(jù)。例如,游戲可以“在運行中”產(chǎn)生聲音效果以避免在因特網(wǎng)上發(fā)送和接收聲音數(shù)據(jù)。作為另一個示例,應(yīng)用程序可以接收在綠屏前拍攝的視頻,并且處理視頻以刪除綠色背景和動態(tài)地插入不同的背景。在一些應(yīng)用中,平臺可以接收平臺支持的格式的壓縮的視頻數(shù)據(jù)和未壓縮的音頻數(shù)據(jù),反之亦然。這些類型的場景在現(xiàn)有平臺上是困難或者不可能的,但是可以由媒體交互系統(tǒng)輕松地支持。圖1是示出一個實施例中的媒體交互系統(tǒng)的組件的框圖。媒體交互系統(tǒng)100包括調(diào)用應(yīng)用程序組件110、執(zhí)行沙箱組件120、原始媒體接口組件130、請求媒體數(shù)據(jù)組件140、 媒體回放組件150以及硬件接口組件160。調(diào)用應(yīng)用程序組件110加載和調(diào)用平臺中的應(yīng)用程序代碼。例如,網(wǎng)頁可以參考代表平臺的對象,或者可以包括指定平臺將調(diào)用的應(yīng)用程序的一個或多個參數(shù)。調(diào)用應(yīng)用程序組件可以例如通過諸如因特網(wǎng)的網(wǎng)絡(luò)從服務(wù)器處下載與其它基于web的內(nèi)容一樣的應(yīng)用程序。例如,微軟 的Silverlight 接收具有用于運行應(yīng)用程序的其它數(shù)據(jù)(例如從屬模塊、媒體文件、應(yīng)用程序參數(shù)等)的包(例如XAP文件)中的應(yīng)用程序代碼。諸如微軟⑧的hternet Explorer 的網(wǎng)頁瀏覽器調(diào)用微軟⑧的Silverlight ,并且微軟⑧的 Silverlight 調(diào)用應(yīng)用程序。執(zhí)行沙箱組件120為應(yīng)用程序代碼提供限制應(yīng)用程序能夠執(zhí)行的動作的執(zhí)行環(huán)境。例如,環(huán)境可以限制應(yīng)用程序可以訪問的硬件資源、用戶數(shù)據(jù)或者其它信息。由于執(zhí)行沙箱組件120在安全的沙箱中運行應(yīng)用程序代碼,因此用戶可以信任代碼無法做到不在沙箱中運行的任意代碼可以做的惡意的事情。使用執(zhí)行沙箱組件120,應(yīng)用程序可以實現(xiàn)或調(diào)用用于處理應(yīng)用程序平臺本機不支持的媒體類型的編解碼器。不同于使用本機代碼運行的編解碼器,由應(yīng)用程序調(diào)用的沙箱編解碼器無法危害用戶計算機系統(tǒng)。執(zhí)行沙箱可以包括應(yīng)用程序代碼可以執(zhí)行的有限的指令集或庫,并且可以包括應(yīng)用程序代碼到可執(zhí)行對象代碼的即時(JIT)編譯以便系統(tǒng)100能夠管理應(yīng)用程序可以執(zhí)行的動作。執(zhí)行沙箱還可以為應(yīng)用程序提供調(diào)用操作系統(tǒng)APIs以執(zhí)行各種功能(例如訪問文件、連接至遠程服務(wù)器、訪問配置設(shè)置等)的安全的方式。原始媒體接口組件130提供API,通過該API應(yīng)用程序可以向應(yīng)用程序平臺提供平臺可以播放的原始、未壓縮的媒體內(nèi)容。不同于從應(yīng)用程序處接收壓縮的媒體內(nèi)容并且然后使用平臺內(nèi)部的編解碼器來將媒體內(nèi)容解壓縮為未壓縮格式的以前的平臺,媒體交互系統(tǒng)100允許應(yīng)用程序在將未壓縮的媒體內(nèi)容傳遞給用于回放的應(yīng)用程序平臺之前,任意數(shù)量的格式中解壓縮媒體內(nèi)容。采用這種方式,應(yīng)用程序平臺不限制對新的媒體格式的支持, 反而可以支持應(yīng)用程序可以解壓縮和提供給平臺的任意格式。此外,解壓縮僅進行一次,而不是像以前平臺的潛在解決方案,其中應(yīng)用程序可以解壓縮一種媒體格式并且然后將媒體內(nèi)容壓縮為平臺支持的第二媒體格式。注意到這一解決方案在平臺中添加了進一步的解壓縮步驟以便回放媒體內(nèi)容。請求媒體數(shù)據(jù)組件140選擇性地調(diào)入接收媒體數(shù)據(jù)的應(yīng)用程序。本領(lǐng)域的技術(shù)人員將意識到軟件設(shè)計者頻繁地在其中組件由數(shù)據(jù)定期提供的推模型以及其中組件為新數(shù)據(jù)投票的拉模型之間做出選擇。媒體交互系統(tǒng)100可以從應(yīng)用程序處周期性地接收用于通過媒體流水線回放的數(shù)據(jù),或者系統(tǒng)100可以控制回放并且周期性地向應(yīng)用程序詢問用于回放的媒體數(shù)據(jù)的下一個片段(例如視頻幀或音頻樣本)。在系統(tǒng)100控制回放和從應(yīng)用程序處請求媒體數(shù)據(jù)(例如見此處進一步描述的GetSampleAsync (獲取樣本異步)API)時,系統(tǒng)100使用請求媒體數(shù)據(jù)組件140。媒體回放組件150使用硬件接口組件160和接收到的未壓縮的媒體內(nèi)容來呈現(xiàn)媒體。媒體回放組件150可以包括用于準(zhǔn)備和回放媒體內(nèi)容的多個步驟,有時被稱為媒體流水線。例如,媒體回放組件150可以包括用于在視聽顯示中回放音頻樣本并將其與相關(guān)聯(lián)的視頻幀對齊的同步邏輯。媒體回放組件150還可以包括捕捉新的媒體數(shù)據(jù)(例如通過諸如話筒或其它源等硬件)的能力,并且可以通過原始媒體接口組件130向應(yīng)用程序提供未壓縮的媒體數(shù)據(jù),以便應(yīng)用程序可以將媒體數(shù)據(jù)壓縮為特定應(yīng)用程序支持的格式。硬件接口組件160與計算機硬件交互以回放和/或捕捉媒體數(shù)據(jù)。硬件接口組件 160還可以提供用于控制系統(tǒng)100的用戶界面控件。例如,硬件接口可以提供對一個或多個揚聲器、顯示器、輸入設(shè)備等的訪問。硬件接口組件160可以允許用戶通過一個或多個用戶界面控件(例如屏幕上的按鍵或鍵盤快捷方式)來暫停、搜索和回放媒體數(shù)據(jù)。通過將應(yīng)用程序與計算機系統(tǒng)硬件隔離,系統(tǒng)100阻止了應(yīng)用程序執(zhí)行未授權(quán)的動作和危害計算機系統(tǒng)。其上實現(xiàn)系統(tǒng)的計算設(shè)備可包括中央處理單元、存儲器、輸入設(shè)備(例如鍵盤和定點設(shè)備)、輸出設(shè)備(例如顯示設(shè)備)和存儲設(shè)備(例如磁盤驅(qū)動器或其它非易失性存儲介質(zhì))。存儲器和存儲設(shè)備是可以用實現(xiàn)或允許系統(tǒng)的計算機可執(zhí)行指令(例如軟件)來編碼的計算機可讀存儲介質(zhì)。此外,數(shù)據(jù)結(jié)構(gòu)和消息結(jié)構(gòu)可以被存儲或通過諸如通信鏈路上的信號之類的數(shù)據(jù)傳輸介質(zhì)傳輸??梢允褂酶鞣N通信鏈路,諸如因特網(wǎng)、局域網(wǎng)、廣域網(wǎng)、 點對點撥號連接、蜂窩電話網(wǎng)絡(luò)等等。系統(tǒng)的各實施例可以在各種操作環(huán)境中實現(xiàn),所述操作環(huán)境包括個人計算機、服務(wù)器計算機、手持式或膝上型設(shè)備、多處理器系統(tǒng)、基于微處理器的系統(tǒng)、可編程消費電子產(chǎn)品、數(shù)碼相機、網(wǎng)絡(luò)PCs、小型計算機、大型計算機、包括任意上述系統(tǒng)或設(shè)備的分布式計算機環(huán)境等。計算機系統(tǒng)可以是蜂窩電話、個人數(shù)字助理、智能電話、個人計算機、可編程消費電子產(chǎn)品、數(shù)碼相機等等??梢栽谟梢粋€或多個計算機或其它設(shè)備執(zhí)行的諸如程序模塊之類的計算機可執(zhí)行的指令的一般上下文中來描述本系統(tǒng)。一般而言,程序模塊包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例程、程序、對象、組件、數(shù)據(jù)結(jié)構(gòu)等等。通常,程序模塊的功能可以按需在各個實施例中進行組合或分布。圖2是示出在一個實施例中的系統(tǒng)在平臺級播放媒體的處理的流程圖。在方框 210處,平臺下載應(yīng)用程序。例如,應(yīng)用程序可以被包含在因特網(wǎng)上的服務(wù)器上存儲的壓縮的容器(例如XAP文件)中。平臺在其被調(diào)用時接收指示在哪里找到應(yīng)用程序的參考。例如,如果在網(wǎng)站上使用平臺,則網(wǎng)頁可以包含對指示由平臺運行的應(yīng)用程序的平臺的參考。 在方框220處繼續(xù),平臺調(diào)用下載的應(yīng)用程序。例如,平臺可以解壓縮打包應(yīng)用程序(例如軟件模塊)及其從屬(例如其它模塊)的任何一個容器,并且然后調(diào)用由應(yīng)用程序提供的初始化功能。作為響應(yīng),應(yīng)用程序可以做很多事情(見圖3),諸如訪問網(wǎng)絡(luò)以檢索媒體內(nèi)容。在方框230處繼續(xù),平臺向應(yīng)用程序請求媒體。例如,平臺周期性地調(diào)用商定的媒體檢索接口以從應(yīng)用程序處接收一組視頻幀或音頻樣本以便回放。在一些實施例中,由于媒體是可用的,而不是平臺提出媒體請求,應(yīng)用程序相反可以調(diào)用平臺。在方框240處繼續(xù),平臺從應(yīng)用程序處接收未壓縮的媒體。應(yīng)用程序可以用各種方式獲取媒體,包括從網(wǎng)絡(luò)中下載壓縮的媒體并且使用應(yīng)用程序提供的編解碼器來解壓縮媒體,使用常見的媒體合成技術(shù)來創(chuàng)建媒體,或者修改現(xiàn)有媒體(例如通過應(yīng)用一個或多個后處理效果)。不管媒體的起源如何,應(yīng)用程序向平臺提供平臺可以在不對媒體進行進一步解壓縮的情況下回放的平臺可理解格式的媒體。通過在應(yīng)用程序上放置提取和解壓縮媒體的職責(zé),平臺允許應(yīng)用程序使用應(yīng)用程序作者所需的任何容器和媒體壓縮格式。在方框250處繼續(xù),平臺使用可用的硬件通過用于回放的媒體回放流水線來發(fā)送未壓縮的媒體。例如,媒體流水線可以使用操作系統(tǒng)API (例如微軟⑧的DirectX )來使用揚聲器回放音頻樣本或者向顯示器呈現(xiàn)視頻幀。在方框250之后,這些步驟結(jié)束。圖3是示出在一個實施例中的系統(tǒng)在應(yīng)用級播放媒體的處理的流程圖。在方框 310處,應(yīng)用程序從平臺處接收媒體請求。例如,平臺可以調(diào)用應(yīng)用程序?qū)崿F(xiàn)以提供媒體數(shù)據(jù)的預(yù)定接口。在方框320處繼續(xù),應(yīng)用程序諸如從網(wǎng)絡(luò)服務(wù)器處下載壓縮的媒體。例如, 應(yīng)用程序可以被配置為從提供諸如MP4之類壓縮的格式的媒體內(nèi)容的網(wǎng)絡(luò)服務(wù)器處接收媒體內(nèi)容。替代或另外地,應(yīng)用程序可以諸如通過合成一系列的音符或拼接起獨立的媒體文件來計劃性地創(chuàng)建媒體內(nèi)容。在方框330處繼續(xù),應(yīng)用程序解壓縮壓縮的媒體。例如,應(yīng)用程序可以調(diào)用為特定格式的壓縮媒體解壓縮媒體數(shù)據(jù)的編解碼器。應(yīng)用程序可以包括編解碼器或者可以從網(wǎng)絡(luò)服務(wù)器處下載編解碼器。像應(yīng)用程序一樣,編解碼器在由平臺提供的限制該編解碼器能夠執(zhí)行的動作以保護用戶計算機系統(tǒng)免受惡意或缺陷代碼的執(zhí)行沙箱中運行。由于應(yīng)用程序負責(zé)解壓縮媒體,因此應(yīng)用程序可以通過將編解碼器包括在其自己的應(yīng)用程序代碼中來支持新的媒體類型,而不需平臺更新。因此,應(yīng)用程序可以快速支持新的格式,而不需等待平臺開發(fā)者添加新的媒體支持。在方框340處繼續(xù),應(yīng)用程序選擇性地將后處理效果應(yīng)用于解壓縮的媒體。在其中平臺執(zhí)行解壓縮的傳統(tǒng)系統(tǒng)中,應(yīng)用程序不可能將后處理效果應(yīng)用于媒體。后處理效果可以包括一系列廣泛的媒體修改,包括修改視頻的背景、添加視頻覆蓋(例如封閉的標(biāo)題文本)、添加音頻回聲等。因為應(yīng)用程序可以用后處理來使用類似的資產(chǎn)而消除其它的資產(chǎn),應(yīng)用程序還能夠包括更少的媒體資產(chǎn)來保存資源。例如,包括具有五個背景的視頻的應(yīng)用程序?qū)鹘y(tǒng)地下載五個不同的視頻并且向平臺提供適當(dāng)?shù)囊曨l用于解壓縮。使用媒體交互系統(tǒng),應(yīng)用程序可以替代地包括具有可替換背景(例如綠屏)的一個視頻,并且然后在后處理期間提供用于插入的較小圖像作為五個背景中的每一個。應(yīng)用程序還可以使用后處理以插入廣告或其它信息到媒體流中。在方框350處繼續(xù),應(yīng)用程序向平臺提供用于回放的解壓縮的媒體。應(yīng)用程序可以基于平臺請求按塊提供媒體,或者可以為平臺回放提供指向包含未壓縮媒體的較大的流或文件的鏈接。在方框350之后,這些步驟結(jié)束。在一些實施例中,媒體交互系統(tǒng)提供硬件接口,通過該硬件接口應(yīng)用程序可以直接呈現(xiàn)媒體而不需媒體流水線。例如,系統(tǒng)可以提供可寫位圖區(qū)域,通過該可寫位圖區(qū)域應(yīng)用程序可以直接地將數(shù)據(jù)寫到屏幕。媒體流水線提供音頻和視頻的同步。但是,對于僅呈現(xiàn)視頻或執(zhí)行其自身形式的同步的應(yīng)用程序,這一類型的直接訪問對于更有效地處理媒體內(nèi)容是有用的。
在一些實施例中,媒體交互系統(tǒng)提供可擴展性接口,通過該可擴展性接口應(yīng)用程序可以通過插件模型將對另外的編解碼器的支持添加到平臺中。有別于直接地解碼/解壓縮壓縮的媒體數(shù)據(jù),應(yīng)用程序可以調(diào)用安裝的編解碼器插件并且將壓縮的數(shù)據(jù)通過平臺傳遞到編解碼器,或者直接傳送到編解碼器。在一些實施例中,媒體交互系統(tǒng)提供具有對解壓縮音頻和視頻數(shù)據(jù)的高級硬件支持的訪問的應(yīng)用程序。例如,許多現(xiàn)代的處理器支持用于執(zhí)行矢量數(shù)學(xué)和其它常見的多媒體操作的指令。一個示例是SSE2指令集。SSE兩級縮寫,其中SSE代表流動SIMD擴展,并且SIMD代表單指令、多數(shù)據(jù)。采用產(chǎn)生使用這些指令的可執(zhí)行代碼的方式,執(zhí)行沙箱可以明確地或者通過JIT編譯應(yīng)用程序代碼來允許應(yīng)用程序使用這些指令。作為另一個示例, 媒體交互系統(tǒng)通過允許應(yīng)用程序提供著色邏輯或者JIT編譯可執(zhí)行著色代碼,可以提供對由圖形處理單元(GPU)提供的像素或頂點著色的訪問。在一些實施例中,媒體交互系統(tǒng)以與解碼類似的方式來支持編碼。系統(tǒng)通過硬件或其它輸入(例如軟件模擬的設(shè)備)來捕捉媒體,并且向應(yīng)用程序提供未壓縮格式的媒體。 應(yīng)用程序選擇和使用其自己的編解碼器來將媒體數(shù)據(jù)壓縮為應(yīng)用程序特定的格式。應(yīng)用程序然后可以將媒體上載到服務(wù)器或者執(zhí)行與應(yīng)用程序有關(guān)的其它步驟。系統(tǒng)還可以使用此處描述的插件模型來允許應(yīng)用程序注冊系統(tǒng)能夠用于提供具有由應(yīng)用程序選擇的格式的媒體內(nèi)容的應(yīng)用程序的新的編碼編解碼器。在一些實施例中,媒體交互系統(tǒng)允許應(yīng)用程序在向系統(tǒng)提供用于回放的媒體內(nèi)容之前后處理壓縮的媒體內(nèi)容。例如,應(yīng)用程序可以將諸如回聲之類的效果添加到音頻中,或者通過改變回放速度、校正顏色、重疊標(biāo)志等來修改視頻。應(yīng)用程序還可以使用后處理來向用戶提供均衡器或音頻可視化。此處描述的各方面一般被定向至通過媒體流處理和回放來解耦合媒體內(nèi)容解壓縮。一般地,托管應(yīng)用程序代碼替代平臺執(zhí)行下載、解包和解壓縮操作。作為結(jié)果,應(yīng)用程序可以支持諸如由第三方提供的、用平臺在帶外開發(fā)的等新的和/或?qū)S械拿襟w格式,例如獨立代碼可以從其自己的、可能為自定義的容器格式中解包和解壓縮WMV和WMA媒體流, 并且插入那些流用于回放。作為另一個結(jié)果,媒體數(shù)據(jù)可以通過任何協(xié)議和/或傳輸機制來自于任何源。同時,通過控制托管代碼能夠執(zhí)行的動作的一組特定的平臺APIs來維護安全。在一些實施例中,媒體交互系統(tǒng)向在瀏覽器插件中運行的應(yīng)用程序環(huán)境提供接口以允許不可信的應(yīng)用級代碼提供基本視頻、音頻和腳本流形式的數(shù)據(jù)用于由應(yīng)用程序環(huán)境回放。數(shù)據(jù)可以來自任意源,并且可以以包括以前的應(yīng)用程序環(huán)境無法處理的格式的任意格式來打包。注意到如此處使用的,“應(yīng)用級代碼”指通過對至少一個低級別平臺組件的API 調(diào)用來通信的代碼,而不考慮任何實際的級別。盡管此處參考在瀏覽器/微軟⑧的Silverlight 環(huán)境中播放的媒體內(nèi)容描述了許多示例,但是應(yīng)當(dāng)理解這些僅是示例??梢匀菀椎孛靼祝渌泄艹绦蚝?或環(huán)境可以使用此處描述的技術(shù)。同樣地,媒體交互系統(tǒng)不限于此處所描述的任何特定實施例、方面、概念、結(jié)構(gòu)、功能或示例。相反,此處描述的任何一個實施例、方面、概念、結(jié)構(gòu)、功能或示例都是非限制性的,可以以一般而言在計算和內(nèi)容處理時提供幫助的各種方式來使用本系統(tǒng)。圖4是示出在一個實施例中的媒體交互系統(tǒng)的操作環(huán)境的框圖。示出媒體播放設(shè)備410,諸如用應(yīng)用級412和平臺級414安排的個人計算機系統(tǒng)。媒體播放設(shè)備的其它示例包括移動電話或其它數(shù)字設(shè)備。諸如網(wǎng)絡(luò)應(yīng)用程序或其它代碼等的應(yīng)用級代碼416被主存在應(yīng)用級412,并且如下文所述,處理(例如解包、提取、解壓縮和傳遞)來自容器418的內(nèi)容。如可用應(yīng)用程序422組所代表的,應(yīng)用級代碼416可以是諸如通過例如因特網(wǎng)的網(wǎng)絡(luò)420下載的瀏覽器插件的任何托管代碼。應(yīng)用程序422可以是任何類型的可執(zhí)行代碼, 包括解釋的腳本或其它人類可讀代碼、或者可以直接執(zhí)行或者另外執(zhí)行(例如通過JIT編譯)的編譯的二進制或中間代碼。關(guān)于容器,注意到一個容器選項是“無容器”或者僅有原始音頻(例如PCM樣本)或視頻,在此情況下應(yīng)用程序可以處理用于回放的內(nèi)容,例如將其解密、將其分解成樣本等。由于應(yīng)用級代碼416處理容器的內(nèi)容,因此內(nèi)容可以是應(yīng)用級代碼416理解的任何格式,這允許自定義應(yīng)用程序和/或容器例如被托管并且使其內(nèi)容以例如回放為媒體的某些方式使用。這包括已知容器/包/格式、專有格式、現(xiàn)有包/格式的擴展、以及還沒有開發(fā)的未來容器包/格式。此外,應(yīng)用級代碼416可以跨例如Sockets/HTTP的任意合適的網(wǎng)絡(luò)傳輸使用任意合適的協(xié)議來從一組容器4M中下載諸如容器418之類的容器。這允許了內(nèi)容提供者顯著的靈活性,例如包括為了冗余、負載平衡、安全等在服務(wù)器中分發(fā)內(nèi)容。例如,單一片段的內(nèi)容可以以不同的格式存在于不同的包中,被劃分為不同的部分,具有不同的安全要求等。應(yīng)用程序可以下載不同的包并且根據(jù)需要將其合并(或者基于條件選擇一個)以用于提供回放的內(nèi)容。容器可以包括許多不同類型的數(shù)據(jù)。盡管在通常的示例中數(shù)據(jù)可以對應(yīng)于諸如音頻、視頻或圖像媒體等不同的媒體,但是任何數(shù)據(jù)類型可以被存儲在容器中。此外,容器可以具有諸如單獨的音頻、視頻和靜止圖像數(shù)據(jù)組等的兩組或更多不同組的數(shù)據(jù),和/或使用不同的容器分發(fā)每一類型的支持數(shù)據(jù)。一些容器相對復(fù)雜并且可以包含多種類型的數(shù)據(jù)。注意到由于Silverlight 可以被分解成代碼庫,因此用于下載和解包不同格式的不同的庫可以被創(chuàng)建、重新使用和共享。這提供了共享跨時間開發(fā)的任何不同的、新打包的以及容器格式的方式。諸如在應(yīng)用級412中托管的示例應(yīng)用級代碼416之類的代碼通過一組API430與平臺級414通信。例如,應(yīng)用級代碼做出對應(yīng)用程序環(huán)境432(與媒體元素對應(yīng))的API 調(diào)用以提供用于回放的媒體內(nèi)容,并且以執(zhí)行諸如搜索、暫停、停止等的其它媒體有關(guān)的操作。一般地,不考慮容器格式,平臺級414保持不變并且與任意特定的應(yīng)用程序無關(guān)。應(yīng)用級代碼416還可以由于其它原因與應(yīng)用程序環(huán)境通信,諸如為了在需要用于解密保護的媒體(例如視頻、音頻和腳本流數(shù)據(jù))的許可證時通知應(yīng)用級代碼,以及為了使應(yīng)用級代碼能夠向應(yīng)用程序環(huán)境提供許可證數(shù)據(jù)以例如用于解密流。采用這一方式,數(shù)字版權(quán)管理(DRM)可以不通過外部DRM提供者而被內(nèi)部地處理,例如DRM許可證請求通過托管web請求或網(wǎng)絡(luò)客戶端APIs可以不向后冒泡。DRM初始化向量提供用于解密樣本的與樣本有關(guān)的數(shù)據(jù)。但是,注意到API的靈活性允許結(jié)合本系統(tǒng)一起使用其它的版權(quán)管理系統(tǒng)作為一個示例,內(nèi)容可以在網(wǎng)絡(luò)上被加密,并且然后在通過此處描述的媒體流源將其傳遞之前被解密。應(yīng)用程序環(huán)境432可以是插件或者將瀏覽器用作用戶界面的其它類型的環(huán)境。瀏覽器可以是例如操作系統(tǒng)組件的網(wǎng)頁瀏覽器,并且可以充當(dāng)用于結(jié)合應(yīng)用程序環(huán)境執(zhí)行的應(yīng)用級代碼(例如應(yīng)用級代碼416)的顯示或人機接口機制。應(yīng)用程序環(huán)境可以插入瀏覽器中。作為插件,瀏覽器可以在瀏覽器檢測到諸如應(yīng)用級代碼416之類執(zhí)行的應(yīng)用程序時調(diào)用應(yīng)用程序環(huán)境432.例如,可以在由瀏覽器顯示的網(wǎng)頁中創(chuàng)建視頻元素。應(yīng)用級代碼416 可以執(zhí)行各種動作以檢索、處理、準(zhǔn)備和導(dǎo)致平臺顯示視頻內(nèi)容。用戶能夠操縱用戶界面中的控件以暫停視頻、搜索視頻至特定點、以及基于用戶輸入執(zhí)行其它操作。圖5是示出在一個實施例中的其中應(yīng)用級代碼來自抽象類型的更具體示例的框圖。應(yīng)用級代碼416來自抽象數(shù)據(jù)類型媒體流源538,以獲取具體的實現(xiàn)(對象實例),此處被稱為自定義媒體流源(CustomMediaMreamSource) 540。在代表通常實現(xiàn)的這一示例中,在應(yīng)用級代碼416包括的獨立的匯編中提供具體的自定義媒體流源M0,此處被示作動態(tài)鏈接庫CustomMediaMreamSource. dll,或者簡單地示作DLL542。如下文所述,具體的自定義媒體流源540接收對基本媒體流的請求以及來自媒體元素的診斷,并且DLL542提供包括基本媒體流和診斷的響應(yīng)。對于那些響應(yīng),媒體元素采取適當(dāng)?shù)膭幼?,包括提供媒體流至媒體流水線用于回放。圖6是示出在一個實施例中的與圖5的示例對應(yīng)的回放步驟的流程圖。方框602 表示應(yīng)用級代碼416將媒體流源與媒體元素相關(guān)聯(lián)。例如,通過將源性質(zhì)指向容器的URI, 應(yīng)用程序可以調(diào)用設(shè)置源方法,并且傳遞對具體的自定義媒體流源540實現(xiàn)的參考。動作開始媒體元素與具體的自定義媒體流源540之間的對話。媒體元素檢查其是否正在播放媒體,并且如果是的話,則如方框606所示停止該回放。在任何事件中,在方框608處媒體元素要求自定義媒體流源540打開其媒體。如果在方框610處有自定義媒體流源(MSQ遇到的錯誤,例如媒體沒有打開、被破壞等,則在方框610處處理停止,并且例如自定義媒體流源540可以選擇性地提供消息等以報告問題給媒體內(nèi)容以及應(yīng)用程序,諸如以通知用戶該問題。在沒有問題的事件中,在方框612處自定義媒體流源540通知媒體元素其表示什么類型的媒體,例如WMA、WMV, MP3或RAW。如方框616所示,媒體元素然后開始請求樣本。 如果在方框618處媒體可用,并且沒有錯誤(方框620),則在方框622處媒體元素播放媒體樣本,例如將其插入到諸如流水線回放緩存之類的媒體流水線M4中。過程然后繼續(xù)直到?jīng)]有更多的媒體可用為止,也就是說到媒體被耗盡時為止,此時方框618將分支到其中媒體元素要求自定義媒體流源540關(guān)閉媒體的方框624。在樣本回放循環(huán)期間產(chǎn)生錯誤的事件中,方框620用上述的選擇性的消息(方框626)退出循環(huán)以便媒體處理停止。一般地由方框614所示,另一個可能是自定義媒體流源540請求另一個回放操作, 諸如搜索、暫停、停止等。如方框616所示,媒體元素通過請求自定義媒體流源540采取適當(dāng)?shù)膭幼鱽眄憫?yīng)。注意到使用這一機制,平臺級因此維持對回放操作的各方面的控制。應(yīng)用級負責(zé)處理容器內(nèi)容,包括解包、提取、解壓縮、選擇樣本和提供內(nèi)容給平臺。示例 API以下示出適合于實現(xiàn)此處描述的處理的API。namespace System.Windows.Media {
public abstract class MediaStreamSource {
public MediaStreamSource() {}
protected abstract void OpenMediaAsync();
protected void ReportOpenMediaCompleted( IEnumerable<
MediaStreamDescription>availableMediaStreams,
IDictionary<
MediaSourceAttributesKeys, string> mediaSourceAttributes); protected abstract void SeekAsync(Int64 seekToTime); protected void ReportSeekCompleted(Int64 timeSeekedTo) { } protected abstract void GetSampleAsync( MediaStreamType
mediaStreamType); protected void ReportGetSampleCompleted( MediaStreamSample
mediaS ampleDescription) { } protected void ReportGetSampleProgress(double
bufferingProgress) { } protected abstract void SwitchMediaStreamAsync(
MediaStreamDescription mediaStreamDescription); protected void ReportSwitchMediaStreamCompleted(
MediaStreamDescription mediaStreamDescription) { } protected abstract void GetDiagnosticAsync(
MediaStreamSourceDiagnosticKind diagnosticKind); protected void ReportGetDiagnosticCompleted(
MediaStreamSourceDiagnosticKind diagnosticKind, doublediagnosticValue) { } protected abstract void CloseMedia(); protected void ErrorOccurred( string errorDescription) { }
}
public class MediaElement {
public int AudioStreamIndex { get; set;}
public void SetSource(MediaStreamSource mediaSource) { }
}
public enum MediaStreamSourceDiagnosticKind {
DownloadProgressAsPercent
public class MediaStreamDescription {
public MediaStreamDescription(MediaStreamType streamType, IDictionary<MediaStreamAttributeKeys, string〉 mediaStreamAttributes) { } public MediaStreamType MediaStreamType { get;} public IDictionary<MediaStreamAttributeKeys, string> MediaStreamAttributes { get; }
}
public class MediaStreamSample {
publicMediaStreamSample(Streamstream,MediaStreamDescription
mediaStreamDescription, Int64 offset, Int64 count,Int64 timestamp, IDictionary< MediaSampleAttributeKeys, string> MediaSampleAttributes) { } public Stream Stream { get; }
public MediaStreamDescription MediaStreamDescription { get; } public Int64 Offset { get; } public Int64 Count { get; }
public IDictionary< MediaSampleAttributeKeys, string>
MediaSampleAttributes { get; } public Int64 Timestamp { get; }
public enum MediaStreamType {
Audio, Video,
public enum MediaStreamAttributeKeys {
FourCC5 //接受YVl2和RGBA原始媒體類型
CodecPrivateDataj
Width,
Height
}
public enum MediaSampleAttributeKeys {
KeyFrameFlag,DRMInitialization Vector, BufferWidth5 //針對原始媒體類型 BufferHeight//針對原始媒體類型
public enum MediaSourceAttributesKeys {
CanSeek, Duration, DRMHeader
}
}以下是在提供原始媒體樣本的應(yīng)用程序內(nèi)以上APIs的示例使用//在媒體流源中使用的代碼
IDictionary<MediaStreamAttributeKeys, string〉sampleAttributes = new Dictionary<MediaStreamAttributeKeys, string>();
sampleAttributes.Add(MediaSampleAttributeKeys.BufferWidth," 10"); sampleAttributes.Add(MediaSampleAttributeKeys.BufferHeight, ” 10");
MediaStreamSample rawSample =
newMediaStreamSample(msd,rawVideoFrame,0,
rawVideoFrame.Length,
0, sampleAttributes);
this.ReportSampleCompleted (rawSample);MediaStreamAttributeKeys. FourCC (媒體流屬性密鑰.4CC)屬性接受原始未壓縮視頻的類型YV12以及原始顏色信息(紅、綠、藍和阿爾法)的RGBA。 MediaSampleAttributeKeys (媒體樣本屬性密鑰)接受緩存寬度和高度的值以向平臺描述應(yīng)用程序正在傳遞給平臺以用于回放的樣本緩存的實際寬度和高度。YV12結(jié)構(gòu)可以被當(dāng)作包含3色平面的陣列,其中每一平面內(nèi)的樣本大小為8比特, 具有大小(Χ,γ)的Y平面緊接著大小為(Χ/2,Υ/2)的U平面緊接著大小為(Χ/2,Υ/2)的V 平面。例如,假設(shè)10x10的圖像byte[]yvl2Sample = new byte [150] ;//總大小byte[]yPlane = new byte [100] -J/ X*Ybyte[]uPlane = new byte [25] -J/ X/2*Y/2byte[]vPlane = new byte [25] -J/ X/2*Y/2// 復(fù)制(SourceArray, Sourcelndex, DestinationArray, Desintationlndex, Size)(源陣列、源索弓丨、目的地陣列、目的地索弓丨、大小)//平面是緊接的Array. Copy (yvl2Sample, 0, yPlane,0,100) ;// Y 0 到 100 字節(jié)Array. Copy (yvl2Sample, 100,uPlane,0,25) ; Il U 100 到 125 字節(jié)Array. Copy (yvl2Sample, 125,vPlane,0,25) ; Il V 125 到 150 字節(jié)//來自媒體流源API。樣本實際上在流中,而不是陣列。MemoryStream yvl2SampleStream = new MemoryStrearn(yν12Samp1e);RGBA樣本可以被當(dāng)作包含4字節(jié)樣本的陣列,其中每個樣本包含按照Alpha、紅、 綠、藍順序的四個1字節(jié)通道。對于以上的同一個10x10圖像byte [JargbSample = new byte [400] ;//總大小//使用ARGB格式,通道是交織的(與其中Y、U和V獨立的YV12對比)。
for (long i = 0; i < argbSample.Length; i++) {
switch (i % 4) {
case 0: Il阿爾法argbSample[i]; break; case 1:// 紅
argbSample[i]; break; case 2: // 綠
argbSample[i]; break; case 3: // 藍
argbSample[i]; break; default: break;
}
}原始音頻(例如PCM樣本)被表示為WaveR)rmatEX(波格式Ex)結(jié)構(gòu),使用以上定義的CodecPrivateData(編解碼器私有數(shù)據(jù))所述結(jié)構(gòu)被序列化為十六進制字符串并且被傳遞給媒體流源。PCM音頻樣本被表示為字節(jié)流。在8比特樣本的情況下運行時間將逐個取字節(jié),或者在16比特樣本的情況下按照字節(jié)對取字節(jié)。示例Wavei^ormatEx (波格式Ex) 值如下FormatTag 1Channels {1,2}SamplesPerSec {8k,11.025k,12k,16k,22. 05k,24k,32k,33. 075k, 40k, 44. Ik, 48k,55. 125k,56k,60k,64k,66. 15k,72k,77. 175k,80k,84k,88k,88. 2k. 96k}AverageBytesPerSec :SamplesPerSec*BlockAlignBlockAlign-Channels氺BitsPerSample/8BitsPerSample {8,16}Size 0 //如果非零,自定義波數(shù)據(jù)遵循結(jié)構(gòu)示例基于API的實現(xiàn)如上文所述,提供了抽象基本類,媒體元素432與該抽象基本類協(xié)商以諸如獲取基本媒體流(例如WMV、WMA、MP3和原始的)和診斷。應(yīng)用程序開發(fā)者提供該抽象基本類的具體實現(xiàn)(例如自定義媒體流源540是媒體流源538抽象基本類的具體示例)。通過APIs430,應(yīng)用級代碼416以具體的自定義媒體流源為例并且通過調(diào)用媒體元素432上的方法將其與媒體元素432相關(guān)聯(lián),該媒體元素在這一示例中是MediaElement. SetSource (媒體元素.設(shè)置源)(媒體流源).在該調(diào)用之后,正常的媒體流水線請求被向外路由至具體的自定義媒體流源MO的基本媒體流。通過諸如以上闡述的暴露的APIs,自定義媒體流源MO向媒體流水線提供這些基本媒體流,以及媒體元素432使用的任何診斷 fn息ο在這一示例中,就具有其上設(shè)置的媒體流源的媒體元素432而言,當(dāng)媒體元素432和自定義媒體流源MO已經(jīng)被創(chuàng)建時,應(yīng)用程序416調(diào)用具有新的媒體流源的MediaElement. SetSource (媒體元素.設(shè)置源)。媒體元素432然后導(dǎo)致媒體流源 OpenMediaAsync (打開媒體異步)事件被引發(fā)。諸如自定義媒體流源540之類的媒體流源被處理,并且在關(guān)閉之后按照需要被重新創(chuàng)建。如果媒體元素432將其源性質(zhì)設(shè)置為新的源,如果媒體元素432具有在其上調(diào)用的SetSource (設(shè)置源)并且其源性質(zhì)也為空,或者如果錯誤發(fā)生,則發(fā)生關(guān)閉。注意到在這一示例實現(xiàn)中,如果做出將媒體元素432設(shè)置為已經(jīng)關(guān)閉的媒體流源的嘗試,則發(fā)生溢出。當(dāng)媒體元素432打開并且媒體流源表示廣播時,媒體元素432導(dǎo)致媒體流源OpenMediaAsync (打開媒體異步)事件被引發(fā)。自定義媒體流源540收集其音頻和視頻流,為每一個流提供MeidMtreamDescriptions (媒體流描述)。自定義媒體流源540做出Duration (持續(xù)時間)設(shè)置為零(0),并且Car^eek (能夠搜索)設(shè)置為假的新的mediaSourceAttributes (媒體源屬性)收集。自定義媒體流源540調(diào)用 R印ortMediaCompletecK報告媒體完成)(媒體流、屬性)。在示例實現(xiàn)中,當(dāng)媒體元素432打開并且自定義媒體流源540表示“要求”的內(nèi)容時,媒體元素432導(dǎo)致媒體流源OpenMediaAsync (打開媒體異步)事件被引發(fā)。自定義媒體流源540收集其音頻和視頻流,為每一個流做出MeidMtreamDesCripti0ns(媒體流描述)。自定義媒體流源540做出Duration設(shè)置為持續(xù)時間,并且Car^eek(能夠搜索) 設(shè)置為真的新的mediaSourceAttributes (媒體源屬性)收集。自定義媒體流源540調(diào)用 R印ortMediaCompletecK報告媒體完成)(媒體流、屬性)。自定義媒體流源540可以對應(yīng)于多個比特率的流。注意到在一個示例實現(xiàn)中,對于MultipleBitRate (多比特率)實現(xiàn)者,建議是僅暴露聲明最高允許的比特率的一個音頻和一個視頻流(通過IteportMediaComp 1 eted (報告媒體完成)),并且按照 R印ortGetSampleCompleted(報告獲取樣本完成)中所需要的來傳遞不同比特率的樣本。 例如,可以用不同的比特率多次編碼內(nèi)容,每個比特率對應(yīng)于從文件到URI可定址的塊的容器割??蛻艉?或服務(wù)器可以基于例如網(wǎng)絡(luò)負載、客戶負載、服務(wù)器負載等條件來改變其下載的塊,諸如以基于負載條件來提供不同的視頻質(zhì)量/分辨率,而不是暫?;胤?。當(dāng)自定義媒體流源540與多個音頻流對應(yīng)時,媒體元素432導(dǎo)致媒體流源 OpenMediaAsync (打開媒體異步)事件被引發(fā)。自定義媒體流源540收集其音頻流和視頻流,為每一個流做出MeidMtreamDescriptions (媒體流描述)。自定義媒體流源540調(diào)用 R印ortMediaCompletecK報告媒體完成)(音頻流和視頻MeidaStreamDescriptions (媒體流描述))。注意到媒體流源可以包含多個視頻流,例如開發(fā)者可以嘗試在多個視頻流之間切換,盡管在一個實現(xiàn)中結(jié)果不被保證。為了有助腳本命令和標(biāo)記,在一個實現(xiàn)中,開發(fā)者使用媒體元素432的TimelineMarkers (時間線標(biāo)記)收集。在一個典型示例中,當(dāng)媒體元素432具有在其上調(diào)用的Mop (停止)時,媒體元素 432停止引發(fā)媒體流源GetSampleAsynd獲取樣本異步)(媒體類型)事件。應(yīng)用程序開發(fā)者結(jié)合自定義媒體流源540來使用媒體元素的CurrentStateChangecK當(dāng)前狀態(tài)改變)事件和CurrentState (當(dāng)前狀態(tài))性質(zhì)以實現(xiàn)這一目的。庫開發(fā)者可以揭露應(yīng)用程序開發(fā)者的方法以將媒體元素432的CurrentState (當(dāng)前狀態(tài))的改變與應(yīng)用程序的自定義媒體流源乂叩(停止)邏輯相掛鉤。在一個典型示例中,當(dāng)媒體元素432具有在其上調(diào)用的Pause (暫停)時,媒體元素432停止引發(fā)媒體流源GetSampleAsync (媒體類型)事件。為了獲取狀態(tài)改變的通知, 應(yīng)用程序開發(fā)者結(jié)合自定義媒體流源來使用媒體元素的CurrentStateChangecK當(dāng)前狀態(tài)改變)事件和CurrentState (當(dāng)前狀態(tài))性質(zhì)。庫開發(fā)者可以揭露應(yīng)用程序開發(fā)者的方法以將媒體元素132的CurrentState (當(dāng)前狀態(tài))的改變與其媒體流源Pause (暫停)邏輯相掛鉤。當(dāng)從暫停的狀態(tài)重新開始時,通過調(diào)用媒體元素432上的Play(播放),例如視頻播放器應(yīng)用程序?qū)е翸ediaElement.Play(媒體元素.播放)被調(diào)用,媒體元素 432開始引發(fā)媒體流源GetSampleAsync (媒體類型)事件。當(dāng)從停止的狀態(tài)重新開始時,視頻播放器導(dǎo)致MediaElement.Play(媒體元素.播放)被調(diào)用,并且媒體元素432 引發(fā)媒體流源kekAsync (搜索異步)(流的開始)事件。自定義媒體流源540調(diào)用 R印ortkekCompletecK報告搜索完成)(非常靠近流的開始),并且媒體內(nèi)容432開始引發(fā)媒體流源GetSampleAsync (媒體類型)事件。就搜索而言,視頻播放器應(yīng)用程序為正常的搜索設(shè)置MediaElement. Position (媒體類型.位置)。作為響應(yīng),媒體元素432導(dǎo)致MediaStreamSource. kekAsync (媒體流源.搜索異步)(新位置為IOOns記號)被引發(fā)。自定義媒體流源540調(diào)節(jié)其到最近樣本的流至新的位置。自定義媒體流源540調(diào)用R印ortkekCompletecK報告搜索完成)(100ns 記號的最近樣本的位置)。媒體元素432導(dǎo)致MediaStreamSource. GetSampleAsync (媒體流源.獲取樣本異步)(新位置為100ns記號)被引發(fā)。自定義媒體流源540返回 MediaStreamSource. R印ortGetSampleCompleted (媒體、流源. 艮告獲取樣本完成)中的請求的樣本。視頻播放器應(yīng)用程序為對流的末端的搜索設(shè)置MediaElement. Position(媒體元素.位置),并且媒體元素432導(dǎo)致MediaStreamSource. SeekAsync (媒體流源.搜索異步)(新位置為IOOns記號)被引發(fā)。自定義媒體流源540調(diào)節(jié)其到最近樣本的流至新的位置。自定義媒體流源540調(diào)用R印ortkekCompletecK報告搜索完成)(100ns記號的最近樣本的位置)。媒體元素432導(dǎo)致MediaMreamSource. GetSampleAsync (媒體流源.獲取樣本異步)(新位置為100ns記號)被引發(fā)。自定義媒體流源540返回 R印ortGetSampleCompleted (報告獲取樣本完成)(空)。當(dāng)媒體元素432進入錯誤狀態(tài)時,例如媒體元素432遇到其無法恢復(fù)的錯誤時,媒體元素432導(dǎo)致MediaStreamSource.CloseAsync (媒體流源.關(guān)閉異步)被引發(fā)。自定義媒體流源540按照需要除去其內(nèi)部狀態(tài),并且通過內(nèi)部地設(shè)置其源為空來將其自身與自定義媒體流源540分離。自定義媒體流源540轉(zhuǎn)換到關(guān)閉的狀態(tài)。
19
當(dāng)媒體元素432例如為諸如具有多個語言軌道的場景切換音頻流時,媒體播放器導(dǎo)致MediaElement. AudioStrean^ndex (媒體元素.音頻流索引)被設(shè)置。媒體元素432 導(dǎo)致MediaStreamSource. SwtichMediaStreamAsync (媒體流源.切換媒體流異步)(切換到的流)。自定義媒體流源540切換流,將新的流上的偏置調(diào)節(jié)為正確的時間,并且如果需要開始緩存。自定義媒體流源540調(diào)用R印ortSwitchMediaMreamCompleted (報告切換媒體流完成)(切換到的流)。每當(dāng)自定義媒體流源540無法完成媒體元素請求或者具有其無法恢復(fù)的媒體元素請求之外的錯誤時,自定義媒體流源540進入錯誤狀態(tài)并且通過調(diào)用ErrorOccured(錯誤發(fā)生)通知媒體元素432。如果自定義媒體流源540具有不可恢復(fù)的內(nèi)部錯誤,則自定義媒體流源540調(diào)用ErrorOccured (錯誤發(fā)生)(錯誤的描述)。作為響應(yīng),媒體元素432 接收消息并且開始內(nèi)部的關(guān)機,引發(fā)具有錯誤描述的MediaFailed(媒體失敗),并且導(dǎo)致 CloseMediaAsyn(關(guān)閉媒體異步)被引發(fā)。媒體內(nèi)容432進一步去除任意結(jié)構(gòu),清理,并且通過設(shè)置其內(nèi)部源為空來將其自己與自定義媒體流源540分離。就媒體流源緩存而言,媒體元素432通過導(dǎo)致GetSamp 1 eAsync (獲取樣本異步)引發(fā)來請求樣本。自定義媒體流源540不具有所需的樣本并且進入緩存(假設(shè)緩存是完全空的)。自定義媒體流源540嘗試從媒體文件處收集樣本并且報告其正在用尺印0汁6討3_ 1沖1~呢儀%(0)(報告獲取樣本過程(0))緩存。經(jīng)過一段時間之后,媒體元素432進入緩存狀態(tài),憑借該狀態(tài)自定義媒體流源540將最終填充其緩存的若干部分(例如一半)。假設(shè)填充了一半,自定義媒體流源540調(diào)用R印ortGetSampleProgressO). 5) ReportGetSampleProgress (0. 5)(報告獲取樣本過程(0. 5))0經(jīng)過一段更長的時間之后, 自定義媒體流源540已經(jīng)填充緩存至90%并且調(diào)用R印ortGetSampleProgressO). 9)(報告獲取樣本過程(0. 9))。經(jīng)過一段另外的時間之后,自定義媒體流源MO已經(jīng)完全填充緩存并且通過調(diào)用R印ortGetSampleCompleted(報告獲取樣本完成)(下一個樣本)來返回樣本。在接收樣本之后的某一時刻,媒體元素432轉(zhuǎn)換回播放狀態(tài)。就典型的回放操作而言,媒體元素432導(dǎo)致GetSampleAsync (獲取樣本異步)(視頻)被引發(fā),自定義媒體流源540據(jù)此收集樣本并且通過R印ortGetSampleCompleted(報告獲取樣本完成)(videoSample)(視頻樣本)返回。系統(tǒng)為每種類型的樣本音頻和/或視頻來重復(fù)這一過程。媒體元素432和自定義媒體流源540之間的合約取決于媒體流源初始傳遞給媒體元素432的MediaMreamDescriptions (媒體流描述)組。從媒體元素432到自定義媒體流源MO以及從自定義媒體流源540到媒體元素432的通信與這組MediaMreamDescriptions (媒體流描述)對應(yīng)。換句話說,對每個 MediaStreamDescriptions (媒體流描述)有約束為媒體元素可以傳遞給自定義媒體流源 540,即它等于自定義媒體流源540包含的至少一個MediaStreamDescriptions (媒體流描述)。在相反的方向,自定義媒體流源540可以知道相比其告知媒體元素432更多的額外的流,但是它不向媒體元素432詢問那些額外的流的任意一個。避免這些合約問題的一種方式是為自定義媒體流源540保持在為期生存時間調(diào)用R印ortMediaCompleted (報告媒體完成)期間傳遞的同一集合的描述。圖7是示出在一個實施例中的處理自定義容器格式的媒體流源的子類劃分的數(shù)據(jù)流圖。開發(fā)者可以將媒體流源子類劃分以處理開發(fā)者自己的容器格式。大多數(shù)媒體流源 API成對地工作,并且遵循圖7所示的調(diào)用模式。也就是說,當(dāng)媒體元素432為信息做好準(zhǔn)備時,它向自定義媒體流源540上的內(nèi)部方法提出請求。自定義媒體流源內(nèi)部方法直接調(diào)用保護的“異步”方法;自定義媒體流源540進行一些處理,并且自定義媒體流源540調(diào)用保護的“完成的”方法以標(biāo)志其具有所請求的信息?!巴瓿傻摹狈椒ㄕ{(diào)用媒體元素432上的內(nèi)部方法以標(biāo)志其具有信息并且將該信息傳遞回媒體元素432。注意到雖然方法名為“異步”,但是代碼可以與來自“異步”方法中對應(yīng)的“完成的”調(diào)用同步地響應(yīng);“異步”命名更多是有關(guān)媒體元素432如何調(diào)用這一方法的提示。 此外,在一個示例實現(xiàn)中,響應(yīng)于匹配“異步”方法調(diào)用,媒體流源子類僅能夠調(diào)用“完成的”方法;其例外為GetSampleAsync (獲取樣本異步)和R印ortGetSampleCompleted(報告獲取樣本完成)。在這一例子中,自定義媒體流源540可以緩存并且可以響應(yīng)一個或多個R印ortGetSampleProgress (報告獲取樣本過程)調(diào)用以及緊接著的 R印ortGetSampleCompleted (報告獲取樣本完成調(diào)用)。在這一示例中,如果“完成的”方法由自定義媒體流源540調(diào)用而媒體元素432沒有首先調(diào)用匹配“異步”方法,則響應(yīng)于來自“異步”的調(diào)用,引發(fā)具有“僅調(diào)用完成”的消息的IrwalidOperationExceptior^無效操作例外)。媒體元素432 —次僅進行一個“異步”調(diào)用并且在處理另一個請求之前將等待來自自定義媒體流源MO的“完成的”響應(yīng)。其例外是CloseAsync (關(guān)閉異步),如果媒體元素432由于錯誤或者由于媒體元素432正在被關(guān)閉而想要關(guān)閉,則這可以在任何其它異步調(diào)用之后被引發(fā)。從上文將會明白,雖然此處已經(jīng)出于說明目的描述了媒體交互系統(tǒng)的特定實施例,但是可以做出各種修改而不背離本發(fā)明的精神和范圍。相應(yīng)地,本發(fā)明不受限制,只受所附權(quán)利要求書的限制。
權(quán)利要求
1.一種用于在托管應(yīng)用程序平臺中處理可擴展媒體格式的計算機實現(xiàn)的方法,所述方法包括接收210托管應(yīng)用程序,所述應(yīng)用程序與所述托管應(yīng)用程序平臺交互以回放媒體; 調(diào)用220接收到的應(yīng)用程序; 向所述應(yīng)用程序請求230媒體;從所述應(yīng)用程序處接收240未壓縮的媒體,所述應(yīng)用程序被配置為執(zhí)行從所述應(yīng)用程序接收所述媒體的格式到未壓縮媒體的媒體解壓縮,并且所述平臺允許應(yīng)用程序支持新的媒體格式而不更新平臺;以及使用可用硬件通過用于回放的媒體回放流水線來發(fā)送250所述未壓縮媒體。 其中所述以上步驟由至少一個處理器來執(zhí)行。
2.如權(quán)利要求1所述的方法,其特征在于,所述向所述應(yīng)用程序請求媒體包括周期性地調(diào)用由所述應(yīng)用程序?qū)崿F(xiàn)的商定的媒體檢索接口。
3.如權(quán)利要求1所述的方法,其特征在于,所述向所述應(yīng)用程序請求媒體包括提供應(yīng)用程序調(diào)用以向所述平臺提供媒體的平臺功能。
4.如權(quán)利要求1所述的方法,其特征在于,所述接收未壓縮媒體包括接收所述平臺能夠在不需要對媒體格式進行進一步處理的情況下回放的解碼格式的媒體。
5.如權(quán)利要求1所述的方法,其特征在于,所述應(yīng)用程序接收所述平臺不理解的格式的媒體并且使用應(yīng)用程序提供的編解碼器來解壓縮所述媒體以將所述媒體轉(zhuǎn)化為所述平臺能夠回放的格式。
6.如權(quán)利要求1所述的方法,其特征在于,所述媒體流水線調(diào)用操作系統(tǒng)API來使用揚聲器回放音頻樣本并向顯示器呈現(xiàn)視頻幀。
7.如權(quán)利要求1所述的方法,其特征在于,接收未壓縮媒體包括接收選自由YV12、RGBA 和PCM組成的組的格式的媒體。
8.一種用于在應(yīng)用程序和主存平臺之間通信以回放或捕捉一種或多種壓縮格式的媒體的計算機系統(tǒng),所述系統(tǒng)包括被配置為執(zhí)行軟件指令的處理器和存儲器;被配置為加載和調(diào)用所述平臺中的應(yīng)用程序代碼的調(diào)用應(yīng)用程序組件110 ; 被配置成為應(yīng)用程序代碼提供執(zhí)行環(huán)境的執(zhí)行沙箱組件120,所述執(zhí)行環(huán)境將所述應(yīng)用程序能夠執(zhí)行的動作限于不危害所述計算機系統(tǒng)的一組安全的動作;被配置為提供應(yīng)用程序編程接口(API)的原始媒體接口組件130,應(yīng)用程序可以通過所述API向所述主存平臺提供原始、未壓縮的媒體內(nèi)容以供所述平臺回放;被配置為基于接收到的未壓縮媒體內(nèi)容來呈現(xiàn)媒體的媒體回放組件150 ;以及被配置為與計算機硬件交互并且從所述媒體回放組件接收數(shù)據(jù)以便在所述計算機硬件上回放的硬件接口組件160,其中應(yīng)用程序通過所述主存平臺間接地訪問所述計算機硬件。
9.如權(quán)利要求8所述的系統(tǒng),其特征在于,所述調(diào)用應(yīng)用程序組件還被配置為從網(wǎng)頁處接收對應(yīng)用程序的參考并基于所述參考啟動所述應(yīng)用程序。
10.如權(quán)利要求8所述的系統(tǒng),其特征在于,所述調(diào)用應(yīng)用程序組件從網(wǎng)絡(luò)服務(wù)器處下載應(yīng)用程序以及包括用于處理自定義格式的媒體數(shù)據(jù)的至少一個應(yīng)用程序參考的編解碼器的應(yīng)用程序的從屬。
11.如權(quán)利要求8所述的系統(tǒng),其特征在于,所述執(zhí)行沙箱組件還被配置為接收未編譯的應(yīng)用程序代碼并且即時(JIT)編譯所述應(yīng)用程序代碼以便在沙箱中執(zhí)行。
12.如權(quán)利要求8所述的系統(tǒng),其特征在于,所述執(zhí)行沙箱還被配置為提供應(yīng)用程序能夠調(diào)用以解壓縮媒體數(shù)據(jù)的一個或多個注冊的編解碼器,其中所述注冊的編解碼器能夠在不更新所述平臺的情況下更新以添加對媒體類型的支持。
13.如權(quán)利要求8所述的系統(tǒng),其特征在于,所述原始媒體接口組件從應(yīng)用程序處接收未壓縮的媒體內(nèi)容,所述應(yīng)用程序接收壓縮的媒體內(nèi)容并且在所述應(yīng)用程序中解壓縮所述壓縮的媒體內(nèi)容。
14.如權(quán)利要求8所述的系統(tǒng),其特征在于,所述原始媒體接口組件從合成媒體內(nèi)容的應(yīng)用程序處接收未壓縮的媒體內(nèi)容。
15.如權(quán)利要求8所述的系統(tǒng),其特征在于,所述原始媒體接口組件從應(yīng)用程序處接收未壓縮的媒體內(nèi)容,所述應(yīng)用程序后處理媒體內(nèi)容以修改所述媒體內(nèi)容并且向所述主存平臺提供經(jīng)修改的媒體內(nèi)容作為未壓縮的媒體內(nèi)容。
全文摘要
此處描述了媒體交互系統(tǒng),所述媒體交互系統(tǒng)允許托管應(yīng)用程序獨立于媒體內(nèi)容的格式消費和/或產(chǎn)生豐富的媒體內(nèi)容,同時仍然維護主機的安全。所述媒體交互系統(tǒng)接受來自托管應(yīng)用程序的原始、未壓縮的媒體數(shù)據(jù),并且允許托管應(yīng)用程序通過沙箱API來提供其自己的編解碼器,所述沙箱API將編解碼器能夠執(zhí)行的動作限于可信動作集。然后,應(yīng)用程序?qū)⑽磯嚎s的數(shù)據(jù)提供給用于回放的系統(tǒng)。因此,媒體交互系統(tǒng)提供應(yīng)用程序開發(fā)者支持的任意格式的豐富的媒體內(nèi)容,并且維護用戶的計算機系統(tǒng)的安全。
文檔編號G06F9/44GK102356380SQ201080012732
公開日2012年2月15日 申請日期2010年3月9日 優(yōu)先權(quán)日2009年3月16日
發(fā)明者B·J·埃旺恰克, G·科扎姆, L·W·奧爾森, M·R·哈什, S·J·喬治 申請人:微軟公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1