'MJPG' MFSampleを 'YUY2'または 'RGB24'に変換するためにMFTransformを使用する必要があるのは誰ですか?Media Foundation 'MJPG'から 'YUY2'または 'RGB24'に変換するMFTample
どのようなヒントも非常に高く評価されます。 ありがとう
'MJPG' MFSampleを 'YUY2'または 'RGB24'に変換するためにMFTransformを使用する必要があるのは誰ですか?Media Foundation 'MJPG'から 'YUY2'または 'RGB24'に変換するMFTample
どのようなヒントも非常に高く評価されます。 ありがとう
この投稿への訪問数が目立つようになったので、私自身の質問に答えるつもりです。
MJPGとYUY2の間のすべての変換を列挙するのは、MJPGとRGB32の間に直接の変換がないようだからです。私は1080ウェブカメラからのサンプルをフェッチするために、このメソッドを使用し、YUY2にMJPGを復号化し、次にRGB32にYUY2を復号化した後、OpenGLのRGB32テクスチャをロード http://msdn.microsoft.com/en-us/library/windows/desktop/ff819079%28v=vs.85%29.aspx
:YUY2とRBG32間で画像を変換するためには、色変換DSPを使用しますそれを表示します。これは30fpsでコア2デュオとRadeon HD5650で行われます。 OpenCL(いくつかの畳み込み)で画像を計算すると、15 fpsに低下します。
コード変換YUY2にMJPGを作成する:
MFT_REGISTER_TYPE_INFO inputFilter = { MFMediaType_Video, MFVideoFormat_MJPG };
MFT_REGISTER_TYPE_INFO outputFilter = { MFMediaType_Video, MFVideoFormat_YUY2 };
UINT32 unFlags = MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT | MFT_ENUM_FLAG_SORTANDFILTER;
HRESULT r = MFTEnumEx(MFT_CATEGORY_VIDEO_DECODER, unFlags, &inputFilter, &outputFilter, &ppActivate, &numDecodersMJPG);
if (FAILED(r)) throw gcnew Exception("");
if (numDecodersMJPG < 1) throw gcnew Exception("");
// Activate transform
IMFTransform *pMPEG4 = NULL;
r = ppActivate[0]->ActivateObject(__uuidof(IMFTransform), (void**)&pMPEG4);
if (FAILED(r)) throw gcnew Exception("No se pudo crear el decodificador MJPG.");
次部分(YUY2からRGB32に最初MJPGからYUY2へと)圧縮されたサンプルを復号する復号器を使用することです。 http://msdn.microsoft.com/en-us/library/windows/desktop/aa965264%28v=vs.85%29.aspx
または::これはで説明されて
MFT_OUTPUT_STREAM_INFO osi;
HRESULT r = pDecoder->ProcessMessage(MFT_MESSAGE_NOTIFY_BEGIN_STREAMING, 0);
if (FAILED(r)) throw gcnew Exception("");
r = pDecoder->ProcessInput(0, sample, 0);
if (FAILED(r)) throw gcnew Exception("");
r = pDecoder->GetOutputStreamInfo(0, &osi);
if (FAILED(r)) throw gcnew Exception("");
DWORD status = 0;
r = pDecoder->GetOutputStatus(&status);
if (FAILED(r)) throw gcnew Exception("");
if (status = MFT_OUTPUT_STATUS_SAMPLE_READY) {
}
// Use your own CreateSample function
IMFSample *outputSample = CreateSample(osi.cbSize);
DWORD outStatus = 0;
MFT_OUTPUT_DATA_BUFFER odf;
odf.dwStreamID = 0;
odf.pSample = outputSample;
odf.dwStatus = 0;
odf.pEvents = NULL;
r = pDecoder->ProcessOutput(0, 1, &odf, &outStatus);
if (r != MF_E_TRANSFORM_NEED_MORE_INPUT && FAILED(r)) {
outputSample->Release();
throw gcnew Exception("");
}
r = pDecoder->ProcessMessage(MFT_MESSAGE_NOTIFY_END_OF_STREAM, 0);
if (FAILED(r)) {
outputSample->Release();
throw gcnew Exception("");
}
r = pDecoder->ProcessMessage(MFT_MESSAGE_COMMAND_DRAIN, 0);
if (FAILED(r)) {
outputSample->Release();
throw gcnew Exception("");
}
return outputSample;