読者です 読者をやめる 読者になる 読者になる

S.F. Page

Programming,Music,etc...

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

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なのか。よく読まないといけないな。