音声ファイルから動画ファイルを生成する(56) - Quick Sync Video

公開:2014-03-15 21:13
更新:2017-07-29 13:17
カテゴリ:media foundation,音声動画出力プログラム,audio,c++,windows,windows api

今日はIntel Quick Sync Videoについて調べていた。Media Foundationで使うための Quick Sync Video Encoder MFTについてだ。これを使えばエンコードを速めてくれそうなので。

私の今のアプリがハードウェアエンコーダを使用しているのかを以下のコードを使用して調べてみた。


// ハードウェアエンコーダが使われているかの確認
{
    IMFTransformPtr transform;
    GUID guid;

    CHK(sink_writer_->GetServiceForStream(stream_index_, GUID_NULL, IID_IMFTransform, &transform));

    IMFAttributesPtr attributes;
    CHK(transform->GetAttributes(&attributes));
    UINT32 l = 0;
    std::wstring str;
    bool use_hw = false;
    HRESULT hr = attributes->GetStringLength(MFT_ENUM_HARDWARE_URL_Attribute, &l);
    if (SUCCEEDED(hr))
    {
        str.reserve(l + 1);
        hr = attributes->GetString(MFT_ENUM_HARDWARE_URL_Attribute, (LPWSTR) str.data(), l + 1, &l);
        if (SUCCEEDED(hr)){
            use_hw = true;
            DOUT2(L"/////// HARDWARE ENCODE IS USED. ////\n");
        }
    }
}

結果は使用していなかった。一応MF_READWRITE_ENABLE_HARDWARE_TRANSFORMSをtrueにしているのだが、効果はないようだ。ということはエンコード速度はまだ向上の余地があるわけだ。

次にIntel Media SDK 2014のドキュメント「Intel® Media SDK 2014 Developer’s Guide」を読んだ。これによるとEncoder/Decoder MFTを使用できるようだ。しかし明示的にHWエンコーダを使用すればよいかはくわしくは書いていなかった。どうもサンプルコードを読めということらしい。

それでサンプルコードも読んでみたのだが、Win8用のアプリは明確にQuick Sync VideoのエンコーダMFTを指定しているわけでもなくてやっぱりMF_READWRITE_ENABLE_HARDWARE_TRANSFORMSをtrueにしているだけだった。実行してみた結果はやっぱりソフトウェアエンコーダを使用していた。やり方があるのだろうか。

Media Foundation SDKのドキュメントも読み直す必要もありそうだ。なんとか使えるようになれば嬉しいのだが。Intel Media SDKもインストールしてみるか。でも使用許諾条件をちゃんと読んでいない。ランタイムは再配布可能なのか。そもそも利用してよい範囲は開発だけなのか。製品もOKなのか。よく読まないといけないな。