MS Media Foundationを使い始めたので、チュートリアル:MP4ファイルのエンコードからコードを入力しました。これは、リファレンスで説明されているように、ソースリゾルバーを使用してメディアソースを作成し、MFCreateTranscodeTopology()関数を使用してH.264エンコーダーを含むトポロジを作成します。
次に、トポロジを分析して、MediaFoundationの構造に関する新しい理解をテストしたいと思いました。チュートリアルでStartEncodingSession()を呼び出す直前に、サンプルコードから呼び出す次の関数を作成しました。
HRESULT GetTopologyInfo(IMFTopology *pTopology)
{
HRESULT hr = 0;
WORD num_nodes = 0;
hr = pTopology->GetNodeCount(&num_nodes);
if (SUCCEEDED(hr))
{
for (WORD i = 0; i < num_nodes; i++)
{
IMFTopologyNode *pNode = NULL;
IUnknown *pNodeObject = NULL;
IMFAttributes *pAttribute = NULL;
IMFTransform *pTransform = NULL;
MF_TOPOLOGY_TYPE type;
hr = pTopology->GetNode(i, &pNode);
if (SUCCEEDED(hr))
{
hr = pNode->GetNodeType(&type);
// Get the node object's pointer.
hr = pNode->GetObject(&pNodeObject);
if (SUCCEEDED(hr))
{
hr = pNodeObject->QueryInterface(IID_PPV_ARGS(&pAttribute));
if (SUCCEEDED(hr))
{
GUID guid;
LPWSTR szGuid = NULL;
LPWSTR szFriendlyName = NULL;
hr = pAttribute->GetGUID(MFT_TRANSFORM_CLSID_Attribute, &guid);
if (SUCCEEDED(hr))
{
hr = StringFromIID(guid, &szGuid);
std::wcout << szGuid << std::endl;
}
hr = pAttribute->GetAllocatedString(MFT_FRIENDLY_NAME_Attribute, &szFriendlyName, NULL);
if (SUCCEEDED(hr))
{
std::wcout << szFriendlyName << std::endl;
}
}
hr = pNodeObject->QueryInterface(IID_PPV_ARGS(&pTransform));
if (SUCCEEDED(hr))
{
std::cout << "got transform interface" << std::endl;
}
else
{
std::cout << std::hex << hr << std::endl;
}
}
}
}
}
return hr;
}
この関数は、トポロジー内の3つのノード(MF_TOPOLOGY_SOURCESTREAM_NODE、MF_TOPOLOGY_TRANSFORM_NODE、およびMF_TOPOLOGY_OUTPUT_NODE)を検出します。
この関数は、正しく機能していないように見えることについて多くの質問を提起します。
何よりも、
さらなる質問:この関数からの出力は
{6CA50344-051A-4DED-9779-A43305165E35}
H264 Encoder MFT
80004002
80004002
一般的に尋ねると、Media Foundationを説明する良い参考資料はありますか?オンラインリソースは完全な話をしていないようです。これまでのところ、MediaFoundationは私には不透明に思えます。あなたが提供できるどんな助けにも感謝します。
使用:
Visual Studio 2017(v141)(ただし、Visual Studio 2010と同じ動作)
WindowsSDKバージョン10.0.17134.0
Windows 7 Home Premium、Service Pack 1
MESessionTopologySetがInvokeハンドラーで受信された後でのみ、トポロジーを分析する必要があります。
このイベントは、IMFMediaSession :: SetTopologyの呼び出し後に、メディアセッションによって完全なトポロジが作成されたときに送信されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加