私はMOVファイルを持っていますので、デコードしてすべてのフレームを別々の画像にします。Media Foundationはビデオのインターレースとデコードを設定します
だから私は、次のように圧縮されていないメディアタイプを設定してみてください:
// configure the source reader
IMFSourceReader* m_pReader;
MFCreateSourceReaderFromURL(filePath, NULL, &m_pReader);
// get the compressed media type
IMFMediaType* pFileVideoMediaType;
m_pReader->GetCurrentMediaType(MF_SOURCE_READER_FIRST_VIDEO_STREAM, &pFileVideoMediaType);
// create new media type for uncompressed type
IMFMediaType* pTypeUncomp;
MFCreateMediaType(&pTypeUncomp);
// copy all settings from compressed to uncompressed type
pFileVideoMediaType->CopyAllItems(pTypeUncomp);
// set the uncompressed video attributes
pTypeUncomp->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_RGB8);
pTypeUncomp->SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE);
pTypeUncomp->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive);
// set the new uncompressed type to source reader
m_pReader->SetCurrentMediaType(MF_SOURCE_READER_FIRST_VIDEO_STREAM, 0, pTypeUncomp);
// get the full uncompressed media type
m_pReader->GetCurrentMediaType(MF_SOURCE_READER_FIRST_VIDEO_STREAM, &pTypeUncomp);
私も、私は明示的に設定MF_MT_INTERLACE_MODE
MFVideoInterlace_Progressive
への最終的な構成は、まだ古いモードMFVideoInterlace_MixedInterlaceOrProgressive
で構成されていることに気づきました。
IMFSample* videoSample = nullptr;
IMFMediaBuffer* mbuffer = nullptr;
LONGLONG llTimeStamp;
DWORD streamIndex, flags;
m_pReader->ReadSample(
MF_SOURCE_READER_FIRST_VIDEO_STREAM,
0, // Flags.
&streamIndex, // Receives the actual stream index.
&flags, // Receives status flags.
&llTimeStamp, // Receives the time stamp.
&videoSample) // Receives the sample or NULL.
videoSample->ConvertToContiguousBuffer(&mbuffer);
BYTE* videoData = nullptr;
DWORD sampleBufferLength = 0;
mbuffer->Lock(&videoData, nullptr, &sampleBufferLength);
cout << sampleBufferLength << endl;
をそして私はサンプルのため、かなり異なるサイズを取得:
その後、Iループのすべてのサンプルを通って、その大きさを見て31bytesから18000bytesにします。 フォーマットをMFVideoFormat_RGB32
に変更しても、サンプルサイズには影響しません。
This質問に同じ問題があるようですが、解決策は解決していません。
インターレースを変更できない理由と、ビデオフレームを適切にデコードしてサンプルから画像データを取得する方法についてのヘルプがありますか?
事前に感謝します。 SourceReaderは、あなたがこのようにそれを作成する必要がRGBにサンプルを変換するためには
m_pReader-> GetCurrentMediaType(MF_SOURCE_READER_FIRST_VIDEO_STREAM、&pFileVideoMediaType);の代わりにGetNativeMediaTypeを最初に呼び出すようにしてください。また、各サンプルがインターレースされているかどうかを確認しましたか?pSample-> GetUINT32(MFSampleExtension_Interlaced、&isSampleInterlaced); – VuVirt
ConfigureDecoder関数は、https://msdn.microsoft.com/en-us/library/windows/desktop/dd389281(v=vs.85).aspx#setting_output_formatsで確認できます。また、ReadSampleを呼び出すときに、受信ステータスフラグでMF_SOURCE_READERF_CURRENTMEDIATYPECHANGEDをチェックして、タイプが変更されているかどうかを確認することもできます。 – VuVirt
@VuVirt、ご意見ありがとうございます。ネイティブメディアタイプを取得しても何も変更されませんでした。サンプルがインターレースであることを確認すると、エラーが発生しました。メディアタイプの変更はありませんでした。あなたの心には何か他に何かありますか?あなたが私のコードを見て分のカップルを見つけることができる場合:https://github.com/mbaros100/Media-Foundation-video-decoder。ご助力ありがとうございます。 – mbaros