將資料流程資訊新增至 ASF 檔案接收
ASF 檔案接收是媒體基礎所提供的 IMFMediaSink 實作,應用程式可用來將 ASF 媒體資料封存至檔案。 如需 ASF 媒體接收的物件模型和一般使用方式的相關資訊,請參閱 ASF 媒體接收。
具現化檔案接收之後,必須先加以設定,才能建置拓撲。 檔案接收必須知道輸出檔中的資料流程、編碼模式資訊和中繼資料。 本主題描述在檔案接收中新增資料流程的程式。
在 ASF 檔案接收中新增資料流程
檔案接收必須知道輸出資料流程及其屬性,以便產生輸出樣本,並將其新增至輸出 ASF 檔案。 這些設定會寫入最終的 ASF 標頭物件。
若要設定資料流程資訊,您必須具有檔案接收的 ASF ContentInfo 物件的參考。 如需詳細資訊,請參閱 建立 ASF 檔案接收。
下列程式摘要說明使用 ASF 設定檔物件設定資料流程的一般步驟。
在 ASF 檔案接收中設定資料流程資訊
呼叫 MFCreateASFProfile 來建立 ASF設定檔物件。
針對輸出檔案中的每個資料流程,建立要加入檔案接收中目標資料流程的媒體類型。 媒體類型必須與 Windows 媒體編碼器支援的輸出類型相容。
如需將音訊串流新增至設定檔的資訊,請參閱建立 ASF 編碼的音訊串流。
如需將視訊串流新增至設定檔的資訊,請參閱建立 ASF 編碼的視訊串流。
呼叫 IMFASFProfile::CreateStream,根據步驟 2 中建立的媒體類型建立資料流程。
呼叫步驟 3 中所收到的 IMFASFStreamConfig 介面指標,為新建立的資料流程指派資料流程號碼。
選擇性地使用下列資訊來設定資料流程:
- 藉由設定屬性來洩漏貯體參數: MF_ASFSTREAMCONFIG_LEAKYBUCKET1 或 MF_ASFSTREAMCONFIG_LEAKYBUCKET2
- 承載延伸模組,藉由呼叫 IMFASFStreamConfig 方法進行互斥。
選擇性地設定設定檔的資料封包大小,方法是設定 MF_ASFPROFILE_MINPACKETSIZE 和 MF_ASFPROFILE_MAXPACKETSIZE 屬性。 ASF 設定檔會公開 IMFAttributes 介面,應用程式可以藉由呼叫 IMFASFProfile::QueryInterface來取得參考。
設定檔案接收中資料流程的編碼資訊。 在 檔案接收中設定屬性中討論。
呼叫 IMFASFProfile::SetStream,將資料流程新增至設定檔。
藉由呼叫 IMFASFContentInfo::SetProfile,將設定檔與 ContentInfo 物件產生關聯。
若要修改現有的資料流程,應用程式可以取得資料流程 之 IMFASFStreamConfig 介面的參考,並根據需求重新設定它。 若要新增或移除資料流程,應用程式必須呼叫 IMFASFProfile::RemoveStream。 若要套用這些變更、串流修改或移除,您必須在 ContentInfo 物件中再次設定設定檔。 這會覆寫已經與 ContentInfo 物件相關聯的現有設定檔。
//-------------------------------------------------------------------
// CreateVideoStream
// Create an video stream and add it to the profile.
//
// pProfile: A pointer to the ASF profile.
// wStreamNumber: Stream number to assign for the new stream.
// pType: A pointer to the source's video media type.
//-------------------------------------------------------------------
HRESULT CreateVideoStream(IMFASFProfile* pProfile, WORD wStreamNumber, IMFMediaType* pType)
{
if (!pProfile)
{
return E_INVALIDARG;
}
if (wStreamNumber < 1 || wStreamNumber > 127 )
{
return MF_E_INVALIDSTREAMNUMBER;
}
HRESULT hr = S_OK;
IMFMediaType* pVideoType = NULL;
IMFASFStreamConfig* pVideoStream = NULL;
UINT32 dwBitRate = 0;
//Create a new video type from the source type
hr = CreateCompressedVideoType(pType, &pVideoType);
if (FAILED(hr))
{
goto done;
}
//Create a new stream with the video type
hr = pProfile->CreateStream(pVideoType, &pVideoStream);
if (FAILED(hr))
{
goto done;
}
//Set a valid stream number
hr = pVideoStream->SetStreamNumber(wStreamNumber);
if (FAILED(hr))
{
goto done;
}
//Add the stream to the profile
hr = pProfile->SetStream(pVideoStream);
if (FAILED(hr))
{
goto done;
}
wprintf_s(L"Video Stream created. Stream Number: %d .\n", wStreamNumber);
done:
SafeRelease(&pVideoStream);
SafeRelease(&pVideoType);
return hr;
}
列舉資料流程接收
針對 ContentInfo 物件所感知之設定檔中的每個資料流程,ASF 檔案接收會建立並新增資料流程接收,其中包含編碼資料流程的所有屬性。 ASF 檔案接收的設計目的是要包含固定資料流程。 這表示您無法藉由呼叫 IMFMediaSink::AddStreamSink 或 IMFMediaSink::RemoveStreamSink來新增或移除資料流程。 檔案接收上的這些呼叫失敗,並出現錯誤碼MF_E_STREAMSINKS_FIXED。 在設定檔中新增或移除資料流程不會自動新增或移除檔案接收中的資料流程接收。 如果您的設定檔中的資料流程已變更,您必須捨棄檔案的現有實例,並使用新的資料流程資訊重新建立它。
下列程式摘要說明列舉 ASF 檔案接收中資料流程接收的一般步驟。
列舉資料流程接收
呼叫 IMFMediaSink::GetStreamSinkCount 以取得 ASF 檔案接收中的資料流程接收總數。
迴圈查看串流接收,以取得資料流程接收之 GetStreamSinkByIndex 介面的參考。
-或-
指定資料流程號碼,呼叫 IMFMediaSink::GetStreamSinkById 以取得資料流程接收。 每個資料流程接收都會以您在設定檔中建立資料流程時所設定的資料流程編號來識別。
如果您要建置部分拓撲來編碼媒體檔案,您必須將檔案接收新增至拓撲作為輸出拓撲節點。 您可以藉由在檔案接收中指定每個資料流程接收,或藉由設定檔案接收啟用物件和資料流程接收識別碼,來執行此動作。 如需詳細資訊和程式碼範例,請參閱 建立輸出節點。
相關主題