@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ks: <https://comcomponent.com/vocab/> .

<https://comcomponent.com/blog/2026/03/15/000-media-foundation-extract-still-image-from-mp4-at-specific-time/#article>
    schema:about <https://comcomponent.com/knowledge/video-frame-extraction/>, <https://comcomponent.com/knowledge/imfsourcereader/> ;
    schema:mentions <https://comcomponent.com/knowledge/media-foundation/>, <https://comcomponent.com/knowledge/source-reader-seek/>, <https://comcomponent.com/knowledge/group-of-pictures/>, <https://comcomponent.com/knowledge/key-frame/>, <https://comcomponent.com/knowledge/readsample/>, <https://comcomponent.com/knowledge/video-stride/>, <https://comcomponent.com/knowledge/imf2dbuffer-lock2d/>, <https://comcomponent.com/knowledge/top-down-bottom-up-orientation/>, <https://comcomponent.com/knowledge/mfvideoformat-rgb32/>, <https://comcomponent.com/knowledge/unintended-transparent-png/>, <https://comcomponent.com/knowledge/alpha-channel-fixup/>, <https://comcomponent.com/knowledge/windows-imaging-component/>, <https://comcomponent.com/knowledge/null-sample-result/> .

<https://comcomponent.com/knowledge/video-frame-extraction/> a skos:Concept ;
    skos:prefLabel "動画からの静止画抽出(指定時刻のフレーム取得)"@ja ;
    skos:definition "動画ファイルの中から、指定した時刻に最も近い1枚のフレームを非圧縮画像として取り出す処理。"@ja ;
    skos:altLabel "フレーム抽出"@ja ;
    skos:altLabel "静止画切り出し"@ja ;
    ks:uses <https://comcomponent.com/knowledge/imfsourcereader/> ;
    ks:requires <https://comcomponent.com/knowledge/readsample/> ;
    ks:requires <https://comcomponent.com/knowledge/video-stride/> ;
    ks:uses <https://comcomponent.com/knowledge/windows-imaging-component/> ;
    ks:uses <https://comcomponent.com/knowledge/mfvideoformat-rgb32/> .

<https://comcomponent.com/knowledge/imfsourcereader/> a skos:Concept ;
    skos:prefLabel "IMFSourceReader(Source Reader)"@ja ;
    skos:definition "Media Foundationが提供する、メディアファイルからサンプルを同期的または非同期的に読み出すための入口となるインターフェイス。"@ja ;
    skos:altLabel "Source Reader" ;
    ks:requires <https://comcomponent.com/knowledge/media-foundation/> ;
    ks:uses <https://comcomponent.com/knowledge/source-reader-seek/> .

<https://comcomponent.com/knowledge/media-foundation/> a skos:Concept ;
    skos:prefLabel "Media Foundation"@ja ;
    skos:definition "Windowsが提供する、メディアの再生・変換・エンコード/デコードを行うためのCOMベースのフレームワーク。"@ja ;
    skos:altLabel "MF" .

<https://comcomponent.com/knowledge/source-reader-seek/> a skos:Concept ;
    skos:prefLabel "SetCurrentPositionによるseek"@ja ;
    skos:definition "IMFSourceReaderで指定時刻へ移動する操作。exact seekingを保証せず、通常は指定位置の少し前、特にキーフレーム側へ寄る。"@ja ;
    skos:altLabel "IMFSourceReader::SetCurrentPosition" ;
    ks:requires <https://comcomponent.com/knowledge/readsample/> ;
    ks:uses <https://comcomponent.com/knowledge/key-frame/> .

<https://comcomponent.com/knowledge/readsample/> a skos:Concept ;
    skos:prefLabel "IMFSourceReader::ReadSample"@ja ;
    skos:definition "IMFSourceReaderからデコード済みのサンプルを1枚ずつ取得するメソッド。成功していてもサンプルがnullのことがある。"@ja ;
    skos:altLabel "ReadSample" ;
    ks:mayCause <https://comcomponent.com/knowledge/null-sample-result/> .

<https://comcomponent.com/knowledge/group-of-pictures/> a skos:Concept ;
    skos:prefLabel "GOP(Group of Pictures)"@ja ;
    skos:definition "あるキーフレームから次のキーフレームの直前までのフレームのまとまり。長いほどキーフレームの間隔が空く。"@ja ;
    skos:altLabel "GOP" .

<https://comcomponent.com/knowledge/key-frame/> a skos:Concept ;
    skos:prefLabel "キーフレーム(key frame)"@ja ;
    skos:definition "前後のフレームを参照せず、それ単独でデコードできるフレーム。"@ja ;
    skos:altLabel "IDRピクチャー"@ja .

<https://comcomponent.com/knowledge/video-stride/> a skos:Concept ;
    skos:prefLabel "stride(画像の行送りバイト数)"@ja ;
    skos:definition "画像バッファで1行分が占めるバイト数。幅×1画素のバイト数と一致するとは限らず、行末にpaddingが入ることがある。"@ja ;
    skos:altLabel "Image Stride" ;
    ks:uses <https://comcomponent.com/knowledge/imf2dbuffer-lock2d/> ;
    ks:requires <https://comcomponent.com/knowledge/top-down-bottom-up-orientation/> .

<https://comcomponent.com/knowledge/imf2dbuffer-lock2d/> a skos:Concept ;
    skos:prefLabel "IMF2DBuffer::Lock2D"@ja ;
    skos:definition "2Dの画像バッファをロックし、scan line 0の先頭ポインタと実際のstrideを取得するMedia FoundationのAPI。"@ja ;
    skos:altLabel "Lock2D" .

<https://comcomponent.com/knowledge/top-down-bottom-up-orientation/> a skos:Concept ;
    skos:prefLabel "top-down / bottom-up(画像の上下向き)"@ja ;
    skos:definition "画像バッファの先頭が上端の行か下端の行かの違い。bottom-upはstrideが負の値で表現される。"@ja ;
    skos:altLabel "画像の走査方向"@ja .

<https://comcomponent.com/knowledge/mfvideoformat-rgb32/> a skos:Concept ;
    skos:prefLabel "MFVideoFormat_RGB32"@ja ;
    skos:definition "Media Foundationの32bit RGBピクセル形式。byte0-2がB,G,Rで、byte3はalphaとは限らずARGB32ではない。"@ja ;
    skos:altLabel "RGB32" .

<https://comcomponent.com/knowledge/unintended-transparent-png/> a skos:Concept ;
    skos:prefLabel "意図しない透明PNG"@ja ;
    skos:definition "RGB32の4バイト目をalphaとしてそのままPNGに書き出した結果、画像が意図せず透明になってしまう不具合。"@ja ;
    skos:altLabel "透明画像になる不具合"@ja .

<https://comcomponent.com/knowledge/alpha-channel-fixup/> a skos:Concept ;
    skos:prefLabel "alphaの0xFF固定"@ja ;
    skos:definition "保存前に画像バッファの4バイト目(alpha)へ0xFFを書き込み、完全に不透明な状態に固定する処理。"@ja ;
    skos:altLabel "不透明化処理"@ja ;
    ks:prevents <https://comcomponent.com/knowledge/unintended-transparent-png/> .

<https://comcomponent.com/knowledge/windows-imaging-component/> a skos:Concept ;
    skos:prefLabel "WIC(Windows Imaging Component)"@ja ;
    skos:definition "PNGなどの画像ファイルの読み込み・保存を行うWindows標準の画像処理コンポーネント。"@ja ;
    skos:altLabel "Windows Imaging Component" .

<https://comcomponent.com/knowledge/null-sample-result/> a skos:Concept ;
    skos:prefLabel "ReadSampleのnullサンプル"@ja ;
    skos:definition "ReadSampleがS_OKを返していても、ストリームの終端やギャップなどでサンプルが取得できていない状態。"@ja ;
    skos:altLabel "pSample == nullptr" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/video-frame-extraction/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/imfsourcereader/> ;
    schema:description "MP4から1枚の静止画を取り出すには、Media SessionよりIMFSourceReaderのほうが入口として素直である。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/medfound/processing-media-data-with-the-source-reader> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/imfsourcereader/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/media-foundation/> ;
    schema:description "IMFSourceReaderはMedia Foundationの初期化(MFStartup)を前提として動作する。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/medfound/processing-media-data-with-the-source-reader> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/imfsourcereader/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/source-reader-seek/> ;
    schema:description "IMFSourceReaderはSetCurrentPositionによる指定時刻へのseekをサポートする。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/mfreadwrite/nf-mfreadwrite-imfsourcereader-setcurrentposition> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/source-reader-seek/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/readsample/> ;
    schema:description "SetCurrentPositionはexact seekingを保証しないため、そのあとReadSampleを進めて目的位置まで前進することが前提になる。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/mfreadwrite/nf-mfreadwrite-imfsourcereader-readsample> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/group-of-pictures/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/source-reader-seek/> ;
    schema:description "GOPが長い動画ほど、SetCurrentPositionによるseek位置が指定時刻から遠くなりやすい。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/mfreadwrite/nf-mfreadwrite-imfsourcereader-setcurrentposition> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/source-reader-seek/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/key-frame/> ;
    schema:description "SetCurrentPositionによるseekは、指定位置の少し前、特にキーフレーム側へ寄る形で行われる。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/mfreadwrite/nf-mfreadwrite-imfsourcereader-setcurrentposition> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/video-frame-extraction/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/readsample/> ;
    schema:description "指定時刻に最も近いフレームを選ぶには、seek後にReadSampleを繰り返してtimestampの前後を比較する必要がある。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/mfreadwrite/nf-mfreadwrite-imfsourcereader-readsample> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/video-frame-extraction/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/video-stride/> ;
    schema:description "取り出したフレームをPNGとして正しく保存するには、strideと画像の上下向きを吸収する処理が必要になる。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/medfound/image-stride> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/video-stride/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/imf2dbuffer-lock2d/> ;
    schema:description "実際のstrideとscan line 0の先頭ポインタは、IMF2DBuffer::Lock2Dが使えるときはそれで取得する(使えないbufferではIMFMediaBuffer::Lockと既定strideの計算にフォールバックする)。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/mfobjects/nf-mfobjects-imf2dbuffer-lock2d> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/video-stride/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/top-down-bottom-up-orientation/> ;
    schema:description "行ごとのコピーでは、画像がtop-downかbottom-up(strideが負)かを踏まえる必要がある。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/medfound/uncompressed-video-buffers> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/mfvideoformat-rgb32/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/unintended-transparent-png/> ;
    schema:description "MFVideoFormat_RGB32の4バイト目はalphaとは限らないため、そのままPNGに書くと画像が透明になることがある。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/directshow/uncompressed-rgb-video-subtypes> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/alpha-channel-fixup/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/unintended-transparent-png/> ;
    schema:description "保存前にRGB32の4バイト目へ0xFFを入れて不透明に固定することで、透明PNGになる事故を防ぐ。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/directshow/uncompressed-rgb-video-subtypes> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/video-frame-extraction/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/windows-imaging-component/> ;
    schema:description "整形したtop-downのBGRAバッファは、WICのIWICBitmapEncoder/IWICBitmapFrameEncodeでPNGとして保存する。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/wic/-wic-codec-native-pixel-formats> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/video-frame-extraction/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/mfvideoformat-rgb32/> ;
    schema:description "IMFSourceReaderの出力メディアタイプをMFVideoFormat_RGB32に設定すると、保存しやすい非圧縮フレームが得られる。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/mfreadwrite/nf-mfreadwrite-imfsourcereader-setcurrentmediatype> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/readsample/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/null-sample-result/> ;
    schema:description "ReadSampleはS_OKを返してもpSampleがnullptrのことがあり、ストリームの終端やギャップではフレームが得られない。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/mfreadwrite/nf-mfreadwrite-imfsourcereader-readsample> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .
