ASF學習筆記

來源:互聯網
上載者:User

 

設定(Profile)

一個設定是一個ASF的配置(configuration)的描述資料集合。一個設定必須至少包含一個流的配置設定。

流資訊
設定中的流資訊包含流的位元速率(bit rate),緩衝視窗和媒體屬性的設定。視頻和音訊流資訊準確描述了檔案中的媒體配置,包括壓縮資料使用的編碼和解碼器(如果有的話)。

一個設定也包含很多建立ASF檔案時使用的ASF的特性,這包括互斥、媒體優先順序、頻寬共用和資料單位擴充。

每次寫檔案時必須提供設定。你可以調用IWMWriter::SetProfile指定一個設定。

設定有三種形式,應用程式中設定對象包含的資料,XML檔案,或者ASF檔案頭。

設定對象
可以用設定管理員建立空設定對象,然後從現有資料載入設定

XML檔案
具有PRX副檔名.注意Windows Media 9 Series 中沒有原來的系統設定(system profiles)也不再使用,而作為這種形式存在。儲存自訂設定時必須儲存成這種檔案。

ASF檔案頭
ASF讀者建立一個設定對象,然後從ASF檔案頭載入格式資訊。但是修改檔案頭不會影響檔案的內容。可以重新對檔案編碼來完成格式的修改。

使用設定編輯器
除了用Windows Media Format SDK之外,還可以用Windows Media Encoder 9 Series中包含的設定編輯器建立設定。在應用程式中使用IWMProfileManager::LoadProfileByData載入預定義的設定。但是,啟用“視頻大小:和輸入相同”這個選項將設定視頻的大小為0;Windows Media Encoder 9 Series可以識別並且處理這種情況,但是Windows Media Format SDK的寫入對象不會自動處理,所以應用程式必須並且處理這種情況.

下面是一個XML格式的配置

<profile version="589824" storageformat="1" name="ICW" description="ICW Stream">
 // 73647561-0000-0010-8000-00AA00389B71  'auds' == WMMEDIATYPE_Audio 
 <streamconfig majortype="{73647561-0000-0010-8000-00AA00389B71}" streamnumber="1" streamname="Audio Stream" inputname="Audio804" bitrate="1411200" bufferwindow="-1" reliabletransport="0" decodercomplexity="" rfc1766langid="zh-cn">
  // 00000001-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_PCM 
  <wmmediatype subtype="{00000001-0000-0010-8000-00AA00389B71}" bfixedsizesamples="1" btemporalcompression="0" lsamplesize="4">
     <waveformatex wFormatTag="1" nChannels="2" nSamplesPerSec="44100" nAvgBytesPerSec="176400" nBlockAlign="4" wBitsPerSample="16" /> 
    </wmmediatype>
   </streamconfig>
   // 73647561-0000-0010-8000-00AA00389B71  'auds' == WMMEDIATYPE_Audio 
 <streamconfig majortype="{73646976-0000-0010-8000-00AA00389B71}" streamnumber="2" streamname="Video Stream" inputname="Video804" bitrate="4000" bufferwindow="1000" reliabletransport="0" decodercomplexity="AU" rfc1766langid="zh-cn">
    <videomediaprops maxkeyframespacing="80000000" quality="35" /> 
    // 56555949-0000-0010-8000-00AA00389B71  'YV12' ==  MEDIASUBTYPE_IYUV 
  <wmmediatype subtype="{56555949-0000-0010-8000-00AA00389B71}" bfixedsizesamples="1" btemporalcompression="0" lsamplesize="0">
   <videoinfoheader dwbitrate="4000" dwbiterrorrate="0" avgtimeperframe="1000000">
      <rcsource left="0" top="0" right="0" bottom="0" /> 
      <rctarget left="0" top="0" right="0" bottom="0" /> 
      <bitmapinfoheader biwidth="0" biheight="0" biplanes="1" bibitcount="12" bicompression="IYUV" bisizeimage="0" bixpelspermeter="0" biypelspermeter="0" biclrused="0" biclrimportant="0" /> 
     </videoinfoheader>
    </wmmediatype>
   </streamconfig>
   // 73636d64-0000-0010-8000-00AA00389B71  'scmd' == WMMEDIATYPE_Script 
 <streamconfig majortype="{73636D64-0000-0010-8000-00AA00389B71}" streamnumber="3" streamname="Script Stream" inputname="Script804" bitrate="2560" bufferwindow="-1" reliabletransport="0" decodercomplexity="" rfc1766langid="zh-cn">
  <wmmediatype subtype="{00000000-0000-0000-0000-000000000000}" bfixedsizesamples="0" btemporalcompression="0" lsamplesize="0">
  // 82f38a70-c29f-11d1-97ad-00a0c95ea850        WMSCRIPTTYPE_TwoStrings 
    <WMSCRIPTFORMAT scripttype="{82F38A70-C29F-11D1-97AD-00A0C95EA850}" /> 
    </wmmediatype>
   </streamconfig>
</profile>

媒體採樣(Media Sample)
媒體採樣,或者採樣,是一塊數位媒體資料。採樣是Windows Media Format SDK可以讀寫的資料的最小單位。採樣內容由採樣相關的媒體類型指出。對於視頻,每個採樣表示一個楨,每個單獨採樣中包含的資料量由建立ASF時指定的設定設定。
採樣可以包含未壓縮的資料,或者壓縮過的資料,這時被稱為流採樣。建立ASF時,採樣被傳遞給寫入對象,寫入對象使用相關的編碼器壓縮資料,並且寫入ASF檔案的資料區段。播放時,讀出對象讀出壓縮的資料,解壓資料,並且提供未壓縮格式的資料。
採樣被封裝在Windows Media Format SDK的自動分配的緩衝區對象中。需要的時候,你也可以自己分配緩衝區對象,使用它的讀寫特性。
這裡的採樣並非音頻採樣。通常,音頻採樣品質用每秒錄製的採樣資料數量表示,例如CD品質是44,100採樣/秒,或者44.1 kHz。

輸入,流和輸出
輸入對象是你用於寫入檔案的任何數位媒體流,必須是可以支援的格式。支援很多標準RGB和YUV作為視頻輸入格式,PCM作為音頻輸入格式。如果編碼器不支援某種輸入格式,那麼寫入對象會初始化一個輔助對象,轉換輸入流到可以支援的格式,例如調整色深轉換、縮放,調整聲音品質、採樣率和頻道數目。某些情況下,壓縮格式的食品和音頻可用於輸入。輸入也可以是其他格式,例如文字,指令碼命令,映像,或者任意檔案資料。

輸出是讀取對象傳遞給應用程式,提供使用者體驗的資料。一個輸出等同於一個流。如果你使用互斥屬性,那麼所有互斥資料共用一個輸出。

一個流是一個ASF檔案中包含的資料。一個流的生命期中只有一種壓縮設定。一個簡單的ASF具有兩種流:視頻和音頻。更加複雜的ASF檔案可以包含兩路音頻和多路視頻。音頻可以有同樣的壓縮設定,但是內容不同,例如不同語言的講解;視頻可以有同樣的內容,但是具有不同的壓縮比例。格式是在設定對象中指定的。

某些輸入可以是壓縮過的,這時讀取對象必須以流編號依次訪問資料,而不是按輸出順序訪問資料。

編號
流具有從1開始的編號,這是在設定中指定的。同時,流具有一個索引以在設定中枚舉流。這兩個數字並不相關,例如輸入1並不一定是編號為1的流,編號為1的流並不一定是輸入1,等等。

格式
每種媒體類型的全部資訊。每個格式有一個主類型,例如音頻或視頻,並且可能有一個子類型。格式包含依賴於主類型的不同資訊。視頻和音頻格式比其他格式需要更多資訊。

輸入格式
描述你傳遞給寫入對象的數位媒體類型。如果ASF檔案中的流是用編碼器壓縮,那麼編碼器只支援某些輸入格式。使用Windows Media 音頻和視頻編碼器時,可以使用寫入對象枚舉支援的輸入格式。寫到檔案時,你有責任選擇一個匹配輸入媒體的輸入格式。
某些格式不必匹配編碼器指明的輸入格式,編碼器可以自行轉換資料到需要的格式。

流格式
ASF檔案中的資料儲存形式。在設定中描述,可以符合或不符合輸入、輸出格式(例如使用了某種編碼/解碼器)。可能必須獲得編碼/解碼器資訊之後,才可以設定流格式

輸出格式。
描述你傳遞給讀出對象的數位媒體類型。如果ASF檔案中的流是用編碼器壓縮,那麼編碼器只支援某些輸出格式。使用Windows Media 音頻和視頻編碼器時,可以使用讀出對象枚舉支援的輸出格式。讀出檔案時,你有責任選擇一個匹配輸出媒體的輸出格式。
某些格式不必匹配編碼器指明的輸出格式,編碼器可以自行轉換資料到需要的格式。

位元速率(Bit Rate)
每秒傳遞給ASF的資料的數量,以位/秒(bps)或者千位/秒(kbps)為單位。經常與頻寬混淆,頻寬也以bps或者kbps為單位。
如果使用者的頻寬小於ASF的位元速率,那麼播放可能中斷。通常,頻寬不足會導致跳過某些採樣,或者更多的資料緩衝時間。
每個ASF檔案建立時被指定一個位元速率,它基於檔案中流的數量。不同的流可以有不同的位元速率。位元速率可以是常數(壓縮的資料可以以基本同樣的速度被傳輸)或者可變(保留壓縮的資料品質,即使可能造成突發資料溢出)。
同一個內容可以被壓縮成多個位元速率不同的流,然後你可以配置他們為互斥的。這個屬性叫多位元率(multiple bit rate), 或者MBR.

中繼資料
描述ASF檔案或者檔案內容的資訊,位於檔案頭。中繼資料的項稱為屬性。每一個屬性由名字和值組成。全域常數用於識別屬性,例如ASF檔案的標題被儲存在 g_wszWMTitle 屬性中。在Windows Media Format SDK 中定義了最常用的內建屬性,但是你也可以定義自己的屬性。由於其他開發人員可能和你是用同樣的名字,所以可能造成衝突。
一些全域屬性可以被修改,例如g_wszWMSeekable屬性(文檔是否可以從任意點被讀取)
一些屬性純粹用於資訊用途,並且必須被設定,例如g_wszWMAuthor屬性(作者)
屬性可以被應用到整個檔案或者單獨的流。
你可以用Windows Media Format SDK編輯MP3檔案的中繼資料,但是必須使用ID3-compliant屬性保留與其他MP3應用程式的相容性。

媒體時間
自第一個採樣開始的時間計量方式,單位和SDK其他時間的單位一樣,是100納秒。它使得檔案中不同的流可以被同步。你寫入的每一個採樣都必須有媒體時間。ASF檔案資料區段中每一個資料對象都有媒體時間。每一個輸出的資料也都有媒體時間。

緩衝
讀取對象開啟流檔案時從檔案頭的資訊決定緩衝區大小。實際位元速率是變化的,但是平均值應該是設定中指定的值。

緩衝視窗是以可以緩衝的資料時間長度來衡量的。例如,32Kbps的流,3秒的緩衝視窗,意味著緩衝區大小為 12,000位元組(32000*3/8)。解碼器限制了這個數值,所以緩衝視窗的平均位元速率不大於流的位元速率。
通常在設定中指定這個值,寫入對象處理剩下的部分。寫入壓縮資料到流時,必須自己確定寫入的速度不會超出這個值

ASF檔案中的段
一個ASF檔案中的段以對象的方式組織起來。一共有三種頂層對象,必須有的頭對象(Head),資料對象(Data),以及可選的索引對象(Index)。

每個對象都以全球唯一標誌(GUID)和大小開始。這些數字使得檔案讀者可以解析這些資訊,並且載入到相應的對象。因為這些GUID,底層的對象可以以任何順序排列,並且仍然可以被識別。這使得一個不完整的ASF檔案仍然可被正確讀取,只要有一個完整的檔案頭和至少一個資料對象。某些對象,例如流屬性對象,可能有多個樣本。

頭對象包含檔案的描述資訊,同時是唯一的頂層對象容器。

資料對象以包的格式儲存流資料。資料對象還具有檔案ID和包總個數屬性,但是對於流格式,包總個數屬性沒有意義。

每一個資料包包含發送時間和期間。這使得讀者可以發現流傳輸的中斷。
資料包的資料被封裝到載荷(payloads)中。一個載荷可以包含一個或者多個媒體對象(media objects),媒體對象的一個例子是視頻流的一個楨。大的媒體對象,例如視頻流的一個關鍵楨,可能被擴充到多個載荷,甚至多個包。為了跟蹤對象的片斷,每個對象的段具有從0到255的編號。
除了資料之外,載荷也具有以毫秒為單位的時間戳記。
所有的包具有頭對象中指定的統一的大小。當一個包包含的資料少於指定大小時,用資料("padding" data )填充不足部分。

索引對象包含時間《-》關鍵楨的配對,以更有效地在檔案中定位。因為它處於檔案末尾,即時媒體不能訪問這個對象。

使用回調方法
一些Windows Media Format SDK的介面的方法是非同步執行的,很多這樣的方法使用回調方法和應用程式通訊。

使用OnStatus回調
在Windows Media Format SDK中,IWMStatusCallback::OnStatus 被很多個物件調用。OnStatus接收SDK操作狀態的變化。每種對象可能有不同的方式串連到IWMStatusCallback。

使用事件進行同步調用
1 使用Platform SDK的API CreateEvent建立一個事件對象
2 實現回呼函數,,捕獲事件,並且調用SetEvent函數標記事件對象
3 在應用程式中調用WaitForSingleObject 、監視事件對象。如果你是在為Windows程式編寫代碼,你必須建立一個訊息迴圈對使用者操作做出相應。

使用上下文參數
Windows Media Format SDK的一些回呼函數具有pvContext參數,這個值是你在非同步作業啟動時傳遞給對象的。
通常,多個對象使用同一個回調時傳遞對象指標作為這個參數。

使用設定
設定的主要目的是描述其中的對象,以及對象之間的關係。不管是否使用編碼/解碼器,某些流需要配置才可以工作。流的配置資訊可以用IWMCodecInfo3 介面的方法獲得,但是不要手動設定一個使用了Windows Media編碼/解碼器的流。
建立/編輯設定的步驟
1 建立空設定,或者開啟舊設定
2 配置每個流,如果需要的話,使用從編碼/解碼器獲得的資料
3 配置互斥(可選)
4 配置頻寬共用(可選)
5 配置優先順序(可選)

設計設定

選擇編碼方式
1-pass Constant Bit Rate (CBR) 直播的唯一選擇。以預定的碼流率編碼,並且品質最低。
2-pass CBR 檔案形式的流媒體,長度固定,品質比1-pass Constant Bit Rate (CBR)好
1-pass Variable Bit Rate (VBR) 需要指定品質時使用,本地播放或者下載後播放
2-pass VBR – unconstrained 需要指定頻寬時使用,但是真實頻寬佔用可以偏離指定頻寬,本地播放或者下載後播放
2-pass VBR – constrained 需要指定頻寬時使用,但是真實頻寬佔用不能大於指定頻寬,本地播放或者下載後播放

碼流率
除了資料之外,分包也要佔用一定的頻寬。如果流包含資料單位擴充,那麼這將大大增加流的碼流率。
同時,除了應用程式之外的任何串連都和應用程式共用網路頻寬,所以不能認為應用程式可以完全使用客戶的網路頻寬。

配置流
如果流是視頻/音頻,使用Windows Media編碼/解碼器,那麼你必須使用IWMCodecInfo3的方法從編碼/解碼器獲得流設定物件。
如果流是其他類型,使用IWMProfile::CreateNewStream.建立一個新的流設定物件。
每個流配置都必須設定名字、串連名和流序號(從1到63)。
可能會修改使用Windows Media編碼/解碼器的two-pass VBR 音頻流的VBR設定。視頻流無需修改配置。
根據類型配置其他類型流。所有的這種流需要設定位元速率和緩衝視窗。
使用IWMProfile::AddStream. 將流添加到媒體。
大部分設定可以通過IWMMediaProps訪問。這些設定儲存在WM_MEDIA_TYPE 結構中。對於音頻和視頻,WM_MEDIA_TYPE結構指標指向媒體特定的更多資訊,通常是WAVEFORMATEX 或者WMVIDEOINFOHEADER結構。視頻有第三個結構BITMAPINFOHEADER描述了視頻的楨。

從編碼/解碼器獲得流配置資訊
使用Windows Media編碼/解碼器的視頻/音頻流需要從編碼/解碼器獲得流配置資訊。儘管你可以自行設定這些配置,從編碼/解碼器獲得流配置資訊使得資料是準確的。除非文檔推薦,否則不要修改獲得的流配置資訊。
可以從設定管理員的IWMCodecInfo, IWMCodecInfo2, 和IWMCodecInfo3介面獲得資訊。

枚舉安裝的編碼/解碼器
編碼/解碼器的編號從0開始,音頻和視頻的編碼/解碼器有獨立的編號。

枚舉編碼/解碼器支援的格式

配置音頻流
不要手動修改獲得的配置的品質設定,而應該用IWMPropertyVault介面修改。
音頻流的緩衝視窗不應該設定得比視頻流的緩衝視窗大,否則會造成播放不同步。通常,音頻流的緩衝視窗是1.5-3秒,視頻流的緩衝視窗是3-5秒。

配置視頻流
除非是RGB24資料,否則大小應該是4的倍數,否則會有非法格式/非法配置等錯誤。

配置螢幕流
和視頻流一樣,但是如果複雜度設定為0,那麼IWMVideoMediaProps::SetQuality設定的品質會被忽略。

映像流
包含JPEG形式的映像資料。

視頻流的定位效能
可以使用IWMVideoMediaProps::SetMaxKeyFrameSpacing設定關鍵楨間隔。增加關鍵楨數目會降低視頻品質。

未壓縮的音視頻格式
不能用於流,必須手動設定頻寬,緩衝視窗應該設為0

配置其他流
通常,這種流只需要位元速率和緩衝視窗和WM_MEDIA_TYPE 中的媒體主類型設定。但是某些類型的流還需要其他設定

指令碼流
WM_MEDIA_TYPE的成員formattype 要設定為WMFORMAT_Script,指明pbFormat成員指向一個WMSCRIPTFORMAT 結構。
只有一種指令碼媒體類型,WMSCRIPTTYPE_TwoStrings。

檔案傳輸流
每個採樣需要一個資料單位擴充,你需要實現一個資料單位擴充系統。
調用IWMStreamConfig2::AddDataUnitExtension添加資料單位擴充到流。
hr = pStreamConfig2->AddDataUnitExtension(CLSID_WMTPropertyFileName,
                                          -1, NULL, 0);

網頁流
WM_MEDIA_TYPE.majortype WMMEDIATYPE_Filetransfer. 
WM_MEDIA_TYPE.subtype WMMEDIASUBTYPE_WebStream. 
WM_MEDIA_TYPE.bFixedSizeSamples False. 
WM_MEDIA_TYPE.bTemporalCompression True. 
WM_MEDIA_TYPE.lSampleSize 0. 
WM_MEDIA_TYPE.formattype WMFORMAT_WebStream. 
WM_MEDIA_TYPE.pUnk NULL. 
WM_MEDIA_TYPE.cbFormat sizeof(WMT_WEBSTREAM_FORMAT). 
WM_MEDIA_TYPE.pbFormat 一個配置好的WMT_WEBSTREAM_FORMAT結構的指標. 
WMT_WEBSTREAM_FORMAT.cbSampleHeaderFixedData sizeof(WMT_WEBSTREAM_SAMPLE_HEADER). 
WMT_WEBSTREAM_FORMAT.wVersion 1. 
WMT_WEBSTREAM_FORMAT.wreserved 0.

文字資料流
媒體類型WMMEDIATYPE_TEXT

計算位元速率和緩衝視窗
簡單的辦法是設定為資料長度/時間.但是映像和檔案流可能突發資料很多,但是有很多空閑時間.緩衝視窗必須設定得足夠大.需要的時候,可以適當增加這些值.

變碼流率流

資料單位擴充

儲存/重新使用配置
不要手動更改PRX檔案。看起來很小的改變會使得配置無效。

互斥

流優先順序

頻寬共用

包大小

寫ASF檔案
使用IWMWriter::SetProfile對寫入對象進行設定。但是,設定了之後,對設定對象的修改不會自動反映到寫入對象,除非再次調用IWMWriter::SetProfile。
設定寫入對象會複位全部頭屬性,所以必須在設定之後再修改這些屬性。

輸入

設定對象中的每個串連有一個輸入號。除非配置中有互斥流,否則每個流有一個串連。互斥流共用串連。
寫入流時需要用輸入號來區別每個流,所以必須用串連名字來判斷每個流的輸入號。

枚舉輸入格式
SDK可以對輸入進行預先處理來判斷輸入的格式是否支援。

設定輸入格式
找到符合資料的輸入格式之後,可以調用IWMWriter::SetInputProps讓它可以被寫入對象使用。對於視頻流,必須設定楨的大小。

其他類型的流和預壓縮流
其他類型的流無需設定。
預壓縮流需要設定輸入格式為NULL。這個設定必須在BeginWriting之前完成。同時需要調用IWMHeaderInfo3::AddCodecInfo設定預壓縮流的格式。

BeginWriting之前,還可以用IWMWriterAdvanced2::SetInputSetting設定和流無關的設定。

中繼資料
使用寫入對象的IWMHeaderInfo 或者IWMHeaderInfo2介面訪問中繼資料。必須在IWMWriter::BeginWriting之前完成中繼資料的寫入。
注意,如果建立了寫入對象而沒有釋放,然後再建立寫入對象,一些中繼資料會被複製到新的對象中。

寫入採樣
寫入採樣之前要調用IWMWriter::BeginWriting.
1 用IWMWriter::AllocateSample分配緩衝區,並且獲得其INSSBuffer介面
2 用INSSBuffer::GetBuffer獲得緩衝區地址
3 複製資料到緩衝區中
4 用INSSBuffer::SetLength設定複製的資料長度
5 把緩衝區、輸入編號和媒體時間傳遞給IWMWriter::WriteSample方法。音頻資料期間是一樣的,所以可以簡單地在現有時間上加上一個常數。對於視頻,需要根據楨率計算媒體時間。
WriteSample是非同步呼叫,在下一次WriteSample調用之前可能沒有結束。所以要在每次寫入採樣之前調用AllocateSample擷取緩衝區對象。
所有採樣寫完之後,調用IWMWriter::EndWriting完成寫入操作。
流資料應該幾乎同時結束,否則某些流資料可能丟失。

寫入壓縮採樣
使用IWMWriterAdvanced::WriteStreamSample 替代IWMWriter::WriteSample。

寫入映像採樣
必須用IWMWriterAdvanced2::SetInputSetting設定映像品質g_wszJPEGCompressionQuality,範圍從1到100。映像採樣壓縮比通常很大,所以要使用嘗試的方法設定緩衝視窗大小。

強制關鍵楨
使用INSSBuffer3::SetProperty設定緩衝區對象的WM_SampleExtensionGUID_OutputCleanPoint為TRUE。

讀取

輸出

預設下,每個採樣有一個輸出編號,對應於ASF檔案中的一個流。讀取者開啟ASF檔案時,為每個流賦予一個編號。通常對每個流都有一個輸出。但是對於互斥的流,每一組互斥流只有一個輸出。多碼流率檔案的情況,或者程式自行選擇流的情況下,輸出對應的流是由讀取者決定的。
因為流的串連名字並未保留在檔案中,讀取者為每個流建立一個簡單的串連名字,就是輸出號的字元形式,例如"1","2","3"等等。
每個輸出有由編碼器決定的一個或者多個支援的輸出格式,開啟時預設是從媒體的子類型獲得預設輸出格式。

使用非同步方式讀取ASF檔案
1 實現IWMReaderCallback,處理讀取者的訊息,OnStatus處理狀態訊息,OnSample處理解壓過的資料
2 讓讀取者開啟一個檔案,為每個流設定一個輸出號
3 從讀取者獲得輸出格式資訊
4 讓讀取者開始播放,採樣在指定的媒體時間傳遞給OnSample,直到讀取者被停止或者達到檔案末尾
5 資料到達時,程式負責播放採樣
6 播放結束之後,讓讀取者關閉。
如果採樣是預壓縮的,那麼需要實現的是IWMReaderCallbackAdvanced::OnStreamSample 。IWMReaderCallbackAdvanced::OnStreamSample幾乎和OnSample完全一樣,除了它基於流編號而不是輸出編號之外。在開始回放之前,獲得讀取者對象的IWMReaderAdvanced介面,為每個預壓縮流流調用IWMReaderAdvanced::SetReceiveStreamSamples.

定位
一個ASF檔案必須被適當的配置才可以定位到指定時間。預設情況下只有音訊檔案可以定位,但是包含視頻的檔案需要有索引才可以。如果你不確定檔案的建立方式,你可以調用用IWMHeaderInfo::GetAttributeByName,傳遞g_wszWMSeekable來獲得是否可定位資訊。
調用IWMReader::Start可以定位到指定時間。

[開發經驗]

選擇編碼器
Windows Media
儘管在低碼流率下的效果令人滿意,但是編碼時系統資源佔用過高,同時在高碼流率的情況下效果不甚理想。

Windows Media Video 9
Windows Media Video 9 Screen
對于格式比較挑剔,例如視頻的規格必須是按雙字對齊的。對於長時間的多媒體編碼,有階段性的品質變化(一段時間內楨率高,過一段時間楨率低)
Windows Media Audio 9
Windows Media Audio 9 Professional
系統資源佔用過高致使採樣不足的話會造成音調的變化,效果不可忍受。

自訂編碼器
多種資料混合編碼,避免了同步問題,但是不能單獨為一種資料指定碼流率和優先順序等資訊。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.