MP4からの静止画抽出(Media Foundation)の知識マップ(知識グラフ)
type: Dataset

動画からの静止画抽出(指定時刻のフレーム取得)
type: Concept
definition: 動画ファイルの中から、指定した時刻に最も近い1枚のフレームを非圧縮画像として取り出す処理。
alternative label: フレーム抽出
alternative label: 静止画切り出し
uses: IMFSourceReader(Source Reader)
uses: WIC(Windows Imaging Component)
uses: MFVideoFormat_RGB32
requires: IMFSourceReader::ReadSample
requires: stride(画像の行送りバイト数)

IMFSourceReader(Source Reader)
type: Concept
definition: Media Foundationが提供する、メディアファイルからサンプルを同期的または非同期的に読み出すための入口となるインターフェイス。
alternative label: Source Reader
requires: Media Foundation
uses: SetCurrentPositionによるseek

Media Foundation
type: Concept
definition: Windowsが提供する、メディアの再生・変換・エンコード/デコードを行うためのCOMベースのフレームワーク。
alternative label: MF

SetCurrentPositionによるseek
type: Concept
definition: IMFSourceReaderで指定時刻へ移動する操作。exact seekingを保証せず、通常は指定位置の少し前、特にキーフレーム側へ寄る。
alternative label: IMFSourceReader::SetCurrentPosition
requires: IMFSourceReader::ReadSample
uses: キーフレーム(key frame)

IMFSourceReader::ReadSample
type: Concept
definition: IMFSourceReaderからデコード済みのサンプルを1枚ずつ取得するメソッド。成功していてもサンプルがnullのことがある。
alternative label: ReadSample
may cause: ReadSampleのnullサンプル

GOP(Group of Pictures)
type: Concept
definition: あるキーフレームから次のキーフレームの直前までのフレームのまとまり。長いほどキーフレームの間隔が空く。
alternative label: GOP

キーフレーム(key frame)
type: Concept
definition: 前後のフレームを参照せず、それ単独でデコードできるフレーム。
alternative label: IDRピクチャー

stride(画像の行送りバイト数)
type: Concept
definition: 画像バッファで1行分が占めるバイト数。幅×1画素のバイト数と一致するとは限らず、行末にpaddingが入ることがある。
alternative label: Image Stride
uses: IMF2DBuffer::Lock2D
requires: top-down / bottom-up(画像の上下向き)

IMF2DBuffer::Lock2D
type: Concept
definition: 2Dの画像バッファをロックし、scan line 0の先頭ポインタと実際のstrideを取得するMedia FoundationのAPI。
alternative label: Lock2D

top-down / bottom-up(画像の上下向き)
type: Concept
definition: 画像バッファの先頭が上端の行か下端の行かの違い。bottom-upはstrideが負の値で表現される。
alternative label: 画像の走査方向

MFVideoFormat_RGB32
type: Concept
definition: Media Foundationの32bit RGBピクセル形式。byte0-2がB,G,Rで、byte3はalphaとは限らずARGB32ではない。
alternative label: RGB32

意図しない透明PNG
type: Concept
definition: RGB32の4バイト目をalphaとしてそのままPNGに書き出した結果、画像が意図せず透明になってしまう不具合。
alternative label: 透明画像になる不具合

alphaの0xFF固定
type: Concept
definition: 保存前に画像バッファの4バイト目(alpha)へ0xFFを書き込み、完全に不透明な状態に固定する処理。
alternative label: 不透明化処理
prevents: 意図しない透明PNG

WIC(Windows Imaging Component)
type: Concept
definition: PNGなどの画像ファイルの読み込み・保存を行うWindows標準の画像処理コンポーネント。
alternative label: Windows Imaging Component

ReadSampleのnullサンプル
type: Concept
definition: ReadSampleがS_OKを返していても、ストリームの終端やギャップなどでサンプルが取得できていない状態。
alternative label: pSample == nullptr

subject: 動画からの静止画抽出(指定時刻のフレーム取得)
predicate: uses
object: IMFSourceReader(Source Reader)
description: MP4から1枚の静止画を取り出すには、Media SessionよりIMFSourceReaderのほうが入口として素直である。
evidence: processing-media-data-with-the-source-reader
verified at: 2026-08-01
certainty: established

subject: IMFSourceReader(Source Reader)
predicate: requires
object: Media Foundation
description: IMFSourceReaderはMedia Foundationの初期化(MFStartup)を前提として動作する。
evidence: processing-media-data-with-the-source-reader
verified at: 2026-08-01
certainty: established

subject: IMFSourceReader(Source Reader)
predicate: uses
object: SetCurrentPositionによるseek
description: IMFSourceReaderはSetCurrentPositionによる指定時刻へのseekをサポートする。
evidence: nf-mfreadwrite-imfsourcereader-setcurrentposition
verified at: 2026-08-01
certainty: established

subject: SetCurrentPositionによるseek
predicate: requires
object: IMFSourceReader::ReadSample
description: SetCurrentPositionはexact seekingを保証しないため、そのあとReadSampleを進めて目的位置まで前進することが前提になる。
evidence: nf-mfreadwrite-imfsourcereader-readsample
verified at: 2026-08-01
certainty: established

subject: GOP(Group of Pictures)
predicate: mayCause
object: SetCurrentPositionによるseek
description: GOPが長い動画ほど、SetCurrentPositionによるseek位置が指定時刻から遠くなりやすい。
evidence: nf-mfreadwrite-imfsourcereader-setcurrentposition
verified at: 2026-08-01
certainty: context-dependent

subject: SetCurrentPositionによるseek
predicate: uses
object: キーフレーム(key frame)
description: SetCurrentPositionによるseekは、指定位置の少し前、特にキーフレーム側へ寄る形で行われる。
evidence: nf-mfreadwrite-imfsourcereader-setcurrentposition
verified at: 2026-08-01
certainty: established

subject: 動画からの静止画抽出(指定時刻のフレーム取得)
predicate: requires
object: IMFSourceReader::ReadSample
description: 指定時刻に最も近いフレームを選ぶには、seek後にReadSampleを繰り返してtimestampの前後を比較する必要がある。
evidence: nf-mfreadwrite-imfsourcereader-readsample
verified at: 2026-08-01
certainty: established

subject: 動画からの静止画抽出(指定時刻のフレーム取得)
predicate: requires
object: stride(画像の行送りバイト数)
description: 取り出したフレームをPNGとして正しく保存するには、strideと画像の上下向きを吸収する処理が必要になる。
evidence: image-stride
verified at: 2026-08-01
certainty: established

subject: stride(画像の行送りバイト数)
predicate: uses
object: IMF2DBuffer::Lock2D
description: 実際のstrideとscan line 0の先頭ポインタは、IMF2DBuffer::Lock2Dが使えるときはそれで取得する(使えないbufferではIMFMediaBuffer::Lockと既定strideの計算にフォールバックする)。
evidence: nf-mfobjects-imf2dbuffer-lock2d
verified at: 2026-08-01
certainty: established

subject: stride(画像の行送りバイト数)
predicate: requires
object: top-down / bottom-up(画像の上下向き)
description: 行ごとのコピーでは、画像がtop-downかbottom-up(strideが負)かを踏まえる必要がある。
evidence: uncompressed-video-buffers
verified at: 2026-08-01
certainty: established

subject: MFVideoFormat_RGB32
predicate: mayCause
object: 意図しない透明PNG
description: MFVideoFormat_RGB32の4バイト目はalphaとは限らないため、そのままPNGに書くと画像が透明になることがある。
evidence: uncompressed-rgb-video-subtypes
verified at: 2026-08-01
certainty: context-dependent

subject: alphaの0xFF固定
predicate: prevents
object: 意図しない透明PNG
description: 保存前にRGB32の4バイト目へ0xFFを入れて不透明に固定することで、透明PNGになる事故を防ぐ。
evidence: uncompressed-rgb-video-subtypes
verified at: 2026-08-01
certainty: established

subject: 動画からの静止画抽出(指定時刻のフレーム取得)
predicate: uses
object: WIC(Windows Imaging Component)
description: 整形したtop-downのBGRAバッファは、WICのIWICBitmapEncoder/IWICBitmapFrameEncodeでPNGとして保存する。
evidence: -wic-codec-native-pixel-formats
verified at: 2026-08-01
certainty: established

subject: 動画からの静止画抽出(指定時刻のフレーム取得)
predicate: uses
object: MFVideoFormat_RGB32
description: IMFSourceReaderの出力メディアタイプをMFVideoFormat_RGB32に設定すると、保存しやすい非圧縮フレームが得られる。
evidence: nf-mfreadwrite-imfsourcereader-setcurrentmediatype
verified at: 2026-08-01
certainty: established

subject: IMFSourceReader::ReadSample
predicate: mayCause
object: ReadSampleのnullサンプル
description: ReadSampleはS_OKを返してもpSampleがnullptrのことがあり、ストリームの終端やギャップではフレームが得られない。
evidence: nf-mfreadwrite-imfsourcereader-readsample
verified at: 2026-08-01
certainty: established