列舉輸入格式
[與此頁面相關聯的功能 Windows Media Format 11 SDK是舊版功能。 來源讀取器和接收寫入器已取代它。 來源讀取器和接收寫入器已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用來源讀取器和接收寫入器,而不是Windows 媒體格式 11 SDK。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。
每個 Windows 媒體編解碼器都接受一或多個輸入媒體類型以進行壓縮。 Windows 媒體格式 SDK 可讓您輸入比編解碼器所支援的格式還要廣泛的格式。 SDK 會視需要對輸入執行前置處理轉換來執行此動作,例如調整視訊畫面大小或重新取樣音訊。 在任何情況下,您都必須確定所寫入檔案的輸入格式符合您傳送至寫入器的資料。 每個編解碼器都有預設的輸入媒體格式,在載入設定檔時會在寫入器中設定。 您可以呼叫 IWMWriter::GetInputProps來檢查預設輸入格式。
視訊編解碼器支援下列格式:IYUV、I420、YV12、YUY2、UYVY、YV YU、YVU9、RGB 32、RGB 24、RGB 565、RGB 555 和 RGB 8。 音訊編解碼器支援 PCM 音訊。
若要列舉編解碼器支援的輸入格式,請執行下列步驟:
- 建立寫入器物件,並設定要使用的設定檔。 如需在寫入器中設定設定檔的詳細資訊,請參閱 To Use Profiles with the Writer>。
- 識別您要檢查格式的輸入編號。 如需識別輸入編號的詳細資訊,請參閱 若要依數位識別輸入。
- 藉由呼叫 IWMWriter::GetInputFormatCount,擷取所需輸入所支援的輸入格式總數。
- 迴圈查看所有支援的輸入格式,針對每個格式執行下列步驟。
- 藉由呼叫IWMWriter::GetInputFormat,擷取輸入格式的IWMInputMediaProps介面。
- 擷取輸入格式 的WM_MEDIA_TYPE 結構。 呼叫IWMMediaProps::GetMediaType,傳遞pType參數的Null以取得結構的大小。 然後配置記憶體來保存 結構,然後再次呼叫 GetMediaType 以取得 結構。 IWMInputMediaProps繼承自IWMMediaProps,因此您可以從上一個步驟中擷取的IWMInputMediaProps實例呼叫GetMediaType。
- WM_MEDIA_TYPE結構中所述的格式包含輸入格式的所有相關資訊。 媒體的基本格式是由 WM_MEDIA_TYPE.subtype來識別。 對於視訊串流, pbFormat 成員會指向動態配置的 WMVIDEOINFOHEADER 結構,其中包含資料流程的進一步詳細資料,包括矩形大小。 輸入畫面格的大小不需要與編解碼器所支援的大小完全相符。 如果它們不相符,在許多情況下,SDK 執行時間元件會自動將輸入視訊畫面大小調整為編解碼器可以接受的專案。
下列範例程式碼會尋找做為參數傳遞之子類型的輸入格式。 如需使用此程式碼的詳細資訊,請參閱 使用程式碼範例。
HRESULT FindInputFormat(IWMWriter* pWriter,
DWORD dwInput,
GUID guidSubType,
IWMInputMediaProps** ppProps)
{
DWORD cFormats = 0;
DWORD cbSize = 0;
WM_MEDIA_TYPE* pType = NULL;
IWMInputMediaProps* pProps = NULL;
// Set the ppProps parameter to point to NULL. This will
// be used to check the results of the function later.
*ppProps = NULL;
// Find the number of formats supported by this input.
HRESULT hr = pWriter->GetInputFormatCount(dwInput, &cFormats);
if (FAILED(hr))
{
goto Exit;
}
// Loop through all of the supported formats.
for (DWORD formatIndex = 0; formatIndex < cFormats; formatIndex++)
{
// Get the input media properties for the input format.
hr = pWriter->GetInputFormat(dwInput, formatIndex, &pProps);
if (FAILED(hr))
{
goto Exit;
}
// Get the size of the media type structure.
hr = pProps->GetMediaType(NULL, &cbSize);
if (FAILED(hr))
{
goto Exit;
}
// Allocate memory for the media type structure.
pType = (WM_MEDIA_TYPE*) new (std::nothrow) BYTE[cbSize];
if (pType == NULL)
{
hr = E_OUTOFMEMORY;
goto Exit;
}
// Get the media type structure.
hr = pProps->GetMediaType(pType, &cbSize);
if (FAILED(hr))
{
goto Exit;
}
if(pType->subtype == guidSubType)
{
*ppProps = pProps;
(*ppProps)->AddRef();
goto Exit;
}
// Clean up for next iteration.
delete [] pType;
pType = NULL;
SAFE_RELEASE(pProps);
} // End for formatIndex.
// If execution made it to this point, no matching format was found.
hr = NS_E_INVALID_INPUT_FORMAT;
Exit:
delete [] pType;
SAFE_RELEASE(pProps);
return hr;
}
相關主題