MS Media Foundation-H264エンコーダMFTオブジェクトへのIMFTransformインターフェイスを取得できませんか?

ormike

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)を検出します。

この関数は、正しく機能していないように見えることについて多くの質問を提起します。

何よりも、

  1. 中間ノード(タイプMF_TOPOLOGY_TRANSFORM_NODE)でIMFTransformインターフェースを取得するためのQueryInterface()呼び出しは、エラーE_NOINTERFACEで失敗します。それでも、IMFAttributesインターフェイスからCLSIDとトランスフォームの名前をクエリすると、「H264エンコーダMFT」が表示されます。この変換は、H.264ビデオエンコーダのドキュメントに従ってIMFTransformインターフェイスを公開することになっています誰かが私が間違っていることを見ることができますか?

さらなる質問:この関数からの出力は

{6CA50344-051A-4DED-9779-A43305165E35}
H264 Encoder MFT
80004002
80004002
  1. GetObjectの呼び出しは、最初のノード(タイプMF_TOPOLOGY_SOURCESTREAM_NODE)では失敗します。トポロジノードがノードオブジェクトを返さないのはどうしてですか?
  2. IMFAttributesインターフェースを取得するためのQueryInterface()呼び出しも、3番目のノード(タイプMF_TOPOLOGY_OUTPUT_NODE)で失敗します。すべてのノードがIMFAttributesインターフェースを公開するべきではありませんか?
  3. このトポロジのH.264デコーダーはどこにありますか?ソースファイルは、単一のH.264ビデオエレメンタリストリームを含むMP4ファイルです。

一般的に尋ねると、Media Foundationを説明する良い参考資料はありますか?オンラインリソースは完全な話をしていないようです。これまでのところ、MediaFoundationは私には不透明に思えます。あなたが提供できるどんな助けにも感謝します。

使用:

Visual Studio 2017(v141)(ただし、Visual Studio 2010と同じ動作)

WindowsSDKバージョン10.0.17134.0

Windows 7 Home Premium、Service Pack 1

VuVirt

MESessionTopologySetがInvokeハンドラーで受信された後でのみ、トポロジーを分析する必要があります。

このイベントは、IMFMediaSession :: SetTopologyの呼び出し後に、メディアセッションによって完全なトポロジが作成されたときに送信されます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Media Foundation WebカメラビデオH264エンコード/デコードは、再生時にアーティファクトを生成します

分類Dev

Media FoundationのH264エンコーダーのSPSおよびPPS(別名dwSequenceHeader)

分類Dev

Media Foundation-MFT(Media Foundation Transform)でフレームサイズを変更する方法

分類Dev

Media Foundation:IntelハードウェアMFTのSPS / PPSの問題

分類Dev

Media Foundation:SinkWriterからMediaSinkを取得する

分類Dev

Media Foundation: SPS/PPS problem with Intel hardware MFT

分類Dev

DirectShow、Media Foundation、DXVA、何ですか?

分類Dev

Azure Web アプリの Microsoft Media Foundation

分類Dev

Media Foundation 外部コーデックのサポート

分類Dev

MSボットフレームワークのメッセージに添付ファイルを追加できません:オブジェクト参照がオブジェクトのインスタンスに設定されていません

分類Dev

Media Foundation カスタム ミキサー MFT がエラー MF_E_CANNOT_CREATE_SINK を取得する

分類Dev

Media Foundationは、トポロジノードのIMFMediaTypeを取得します

分類Dev

SinkWriter(Media Foundation)c ++使用中のメモリリーク

分類Dev

Windows Media Foundation の EVR でのビデオの位置付け

分類Dev

UWPハードウェアビデオデコード-DirectX12vs Media Foundation

分類Dev

UWPハードウェアビデオデコード-DirectX12vs Media Foundation

分類Dev

Media Foundation:ReadSample-アクセス違反の例外

分類Dev

Windows Media Foundation: IMFSourceReader::SetCurrentMediaType の実行時間の問題

分類Dev

Media Foundation SinkWriter(MP4 FastStart)

分類Dev

Windows Media Foundationのシンクライターにボトムアップまたはトップダウンのイメージが必要かどうかをどのように判断しますか?

分類Dev

mp3デコード品質を向上させる方法(Media Foundation)?

分類Dev

Media Foundationで非常に大きなビデオ(4Kより大きい)をエンコードすることは可能ですか?

分類Dev

Media FoundationでCOINIT_APARTMENTTHREADEDまたはCOINIT_MULTITHREADEDを使用しますか?

分類Dev

Media Foundation が EVR から複数のビデオ レナーラーを取得する方法

分類Dev

Disable hardware media key handling in MS Teams

分類Dev

Media Foundationで特定のMJPEGサブタイプのクロマサブサンプリングを決定する方法は?

分類Dev

Media Foundation IMFSinkWriter :: Finalize()メソッドは、Windows 7でH.264フレームをMP4に多重化すると失敗します

分類Dev

How to use Windows Media Foundation with UWP without a topology

分類Dev

How to play two sounds simultaneously using Media Foundation

Related 関連記事

  1. 1

    Media Foundation WebカメラビデオH264エンコード/デコードは、再生時にアーティファクトを生成します

  2. 2

    Media FoundationのH264エンコーダーのSPSおよびPPS(別名dwSequenceHeader)

  3. 3

    Media Foundation-MFT(Media Foundation Transform)でフレームサイズを変更する方法

  4. 4

    Media Foundation:IntelハードウェアMFTのSPS / PPSの問題

  5. 5

    Media Foundation:SinkWriterからMediaSinkを取得する

  6. 6

    Media Foundation: SPS/PPS problem with Intel hardware MFT

  7. 7

    DirectShow、Media Foundation、DXVA、何ですか?

  8. 8

    Azure Web アプリの Microsoft Media Foundation

  9. 9

    Media Foundation 外部コーデックのサポート

  10. 10

    MSボットフレームワークのメッセージに添付ファイルを追加できません:オブジェクト参照がオブジェクトのインスタンスに設定されていません

  11. 11

    Media Foundation カスタム ミキサー MFT がエラー MF_E_CANNOT_CREATE_SINK を取得する

  12. 12

    Media Foundationは、トポロジノードのIMFMediaTypeを取得します

  13. 13

    SinkWriter(Media Foundation)c ++使用中のメモリリーク

  14. 14

    Windows Media Foundation の EVR でのビデオの位置付け

  15. 15

    UWPハードウェアビデオデコード-DirectX12vs Media Foundation

  16. 16

    UWPハードウェアビデオデコード-DirectX12vs Media Foundation

  17. 17

    Media Foundation:ReadSample-アクセス違反の例外

  18. 18

    Windows Media Foundation: IMFSourceReader::SetCurrentMediaType の実行時間の問題

  19. 19

    Media Foundation SinkWriter(MP4 FastStart)

  20. 20

    Windows Media Foundationのシンクライターにボトムアップまたはトップダウンのイメージが必要かどうかをどのように判断しますか?

  21. 21

    mp3デコード品質を向上させる方法(Media Foundation)?

  22. 22

    Media Foundationで非常に大きなビデオ(4Kより大きい)をエンコードすることは可能ですか?

  23. 23

    Media FoundationでCOINIT_APARTMENTTHREADEDまたはCOINIT_MULTITHREADEDを使用しますか?

  24. 24

    Media Foundation が EVR から複数のビデオ レナーラーを取得する方法

  25. 25

    Disable hardware media key handling in MS Teams

  26. 26

    Media Foundationで特定のMJPEGサブタイプのクロマサブサンプリングを決定する方法は?

  27. 27

    Media Foundation IMFSinkWriter :: Finalize()メソッドは、Windows 7でH.264フレームをMP4に多重化すると失敗します

  28. 28

    How to use Windows Media Foundation with UWP without a topology

  29. 29

    How to play two sounds simultaneously using Media Foundation

ホットタグ

アーカイブ