@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/16/009-media-foundation-overlay-image-text-on-mp4-frames/#article>
    schema:about <https://comcomponent.com/knowledge/video-overlay-compositing/>, <https://comcomponent.com/knowledge/imfsinkwriter/> ;
    schema:mentions <https://comcomponent.com/knowledge/media-foundation/>, <https://comcomponent.com/knowledge/imfsourcereader/>, <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/null-sample-result/>, <https://comcomponent.com/knowledge/gdiplus/>, <https://comcomponent.com/knowledge/direct2d-directwrite/>, <https://comcomponent.com/knowledge/nv12-pixel-format/>, <https://comcomponent.com/knowledge/rgb-to-nv12-conversion/>, <https://comcomponent.com/knowledge/h264-video-encoder/>, <https://comcomponent.com/knowledge/video-processor-mft/>, <https://comcomponent.com/knowledge/audio-remux/>, <https://comcomponent.com/knowledge/custom-mft/> .

<https://comcomponent.com/knowledge/video-overlay-compositing/> a skos:Concept ;
    skos:prefLabel "動画フレームへの画像・文字の焼き込み"@ja ;
    skos:definition "MP4動画の各フレームをデコードし、ロゴ画像やテキストを合成したうえで、新しいMP4として再エンコードして書き出す処理。"@ja ;
    skos:altLabel "動画オーバーレイ合成"@ja ;
    skos:altLabel "フレームへの透かし焼き込み"@ja ;
    ks:uses <https://comcomponent.com/knowledge/imfsourcereader/> ;
    ks:uses <https://comcomponent.com/knowledge/gdiplus/> ;
    ks:requires <https://comcomponent.com/knowledge/video-stride/> ;
    ks:uses <https://comcomponent.com/knowledge/mfvideoformat-rgb32/> ;
    ks:uses <https://comcomponent.com/knowledge/rgb-to-nv12-conversion/> ;
    ks:requires <https://comcomponent.com/knowledge/imfsinkwriter/> ;
    ks:shouldPrecede <https://comcomponent.com/knowledge/audio-remux/> .

<https://comcomponent.com/knowledge/imfsinkwriter/> a skos:Concept ;
    skos:prefLabel "IMFSinkWriter(Sink Writer)"@ja ;
    skos:definition "Media Foundationが提供する、非圧縮フレームをエンコードしてファイルへ書き出すための出力側のインターフェイス。"@ja ;
    skos:altLabel "Sink Writer" .

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

<https://comcomponent.com/knowledge/gdiplus/> a skos:Concept ;
    skos:prefLabel "GDI+"@ja ;
    skos:definition "画像の読み込みや文字描画を、ビデオディスプレイやプリンター上で行えるC/C++向けのクラスベースの描画API。"@ja ;
    skos:altLabel "Windows GDI+" .

<https://comcomponent.com/knowledge/direct2d-directwrite/> a skos:Concept ;
    skos:prefLabel "Direct2D / DirectWrite"@ja ;
    skos:definition "D3D11/DXGI surfaceと組み合わせて使う、高速な2D描画とテキストレンダリングを行うWindowsのAPI群。"@ja ;
    skos:altLabel "Direct2D" ;
    skos:altLabel "DirectWrite" .

<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/h264-video-encoder/> a skos:Concept ;
    skos:prefLabel "H.264 Video Encoder(Media Foundation)"@ja ;
    skos:definition "MicrosoftがMedia Foundationに実装するH.264エンコーダーMFT。I420/IYUV/NV12/YUY2/YV12などのYUV系入力を前提にすることが多い。"@ja ;
    skos:altLabel "H.264エンコーダー"@ja ;
    skos:altLabel "H264 Encoder MFT" .

<https://comcomponent.com/knowledge/nv12-pixel-format/> a skos:Concept ;
    skos:prefLabel "NV12ピクセル形式"@ja ;
    skos:definition "輝度(Y)プレーンと、間引かれた色差(UV)プレーンを持つ4:2:0のYUV系ピクセル形式。幅・高さが偶数である必要がある。"@ja ;
    skos:altLabel "NV12" .

<https://comcomponent.com/knowledge/rgb-to-nv12-conversion/> a skos:Concept ;
    skos:prefLabel "BGRAからNV12への色変換"@ja ;
    skos:definition "GDI+などで合成した32bit BGRAのフレームを、H.264エンコードに渡すためNV12へ変換する処理。"@ja ;
    skos:altLabel "RGB to NV12" ;
    skos:altLabel "色空間変換"@ja ;
    ks:requires <https://comcomponent.com/knowledge/mfvideoformat-rgb32/> .

<https://comcomponent.com/knowledge/video-processor-mft/> a skos:Concept ;
    skos:prefLabel "Video Processor MFT"@ja ;
    skos:definition "色空間変換・サイズ変更・インターレース解除・フレームレート変換をまとめて扱えるMedia FoundationのTransform。"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/rgb-to-nv12-conversion/> .

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

<https://comcomponent.com/knowledge/audio-remux/> a skos:Concept ;
    skos:prefLabel "音声のremux"@ja ;
    skos:definition "音声ストリームを圧縮されたまま再エンコードせずに、同一形式で出力コンテナへ書き戻す処理。"@ja ;
    skos:altLabel "音声remux"@ja ;
    skos:altLabel "音声の非再エンコード書き戻し"@ja .

<https://comcomponent.com/knowledge/custom-mft/> a skos:Concept ;
    skos:prefLabel "custom MFT"@ja ;
    skos:definition "IMFTransformを自分で実装し、Media Foundationのtopologyへ部品として差し込めるようにしたエフェクト。"@ja ;
    skos:altLabel "カスタムMFT"@ja ;
    skos:altLabel "IMFTransform実装"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/video-overlay-compositing/> .

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

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/video-overlay-compositing/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/imfsourcereader/> ;
    schema:description "各フレームへの画像・文字の焼き込みは、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/video-overlay-compositing/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/gdiplus/> ;
    schema:description "1ファイル完結のサンプルでは、画像読み込みと文字描画が容易なGDI+で各フレームへ画像とテキストを合成する。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/gdiplus/-gdiplus-gdi-start> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/direct2d-directwrite/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/video-overlay-compositing/> ;
    schema:description "長尺動画や4Kの大量処理では、GDI+よりD3D11+Direct2D+DirectWriteのほうが性能面で有利になることがある。"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/windows/win32/direct2d/interoperability-overview> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/video-overlay-compositing/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/video-stride/> ;
    schema:description "動画フレームは見た目どおりにメモリへ並んでいるとは限らないため、stride(1行分のバイト数)を正しく扱う必要がある。"@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/ja-jp/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 "stride抽出時には、画像が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/video-overlay-compositing/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/mfvideoformat-rgb32/> ;
    schema:description "文字やPNGの合成はRGB系のほうが考えやすいため、IMFSourceReaderの出力はMFVideoFormat_RGB32で受ける。"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/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/mfvideoformat-rgb32/> ;
    rdf:predicate ks:incompatibleWith ;
    rdf:object <https://comcomponent.com/knowledge/h264-video-encoder/> ;
    schema:description "MicrosoftのH.264エンコーダーはNV12などのYUV系入力を前提にすることが多く、RGB32/ARGB32のフレームをそのまま渡せるとは限らない。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/medfound/h-264-video-encoder> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/h264-video-encoder/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/nv12-pixel-format/> ;
    schema:description "MicrosoftのH.264エンコーダーはI420/IYUV/NV12/YUY2/YV12などのYUV系入力を前提にすることが多く、NV12がその代表的な形式になる(NV12以外のYUV系形式でも受け付けられる場合がある)。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/medfound/h-264-video-encoder> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/rgb-to-nv12-conversion/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/mfvideoformat-rgb32/> ;
    schema:description "BGRAからNV12への変換は、GDI+などで合成し終えたRGB系のフレームを入力として行う。"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/windows/win32/medfound/video-subtype-guids> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/video-overlay-compositing/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/rgb-to-nv12-conversion/> ;
    schema:description "描きやすいRGB系で合成した後、H.264エンコードに渡すためBGRAをNV12へ変換する処理が必要になる。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/medfound/h-264-video-encoder> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/video-processor-mft/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/rgb-to-nv12-conversion/> ;
    schema:description "本番では、色空間変換・サイズ変更・インターレース解除までまとめて扱えるVideo Processor MFTを挟む構成が有力な選択肢になる。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/medfound/video-processor-mft> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/imfsinkwriter/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/nv12-pixel-format/> ;
    schema:description "H.264出力へ構成した場合、Sink Writerの入力ストリーム型にはNV12の非圧縮フレームを渡し、Sink WriterがH.264にエンコードしてMP4に書き込む。出力型やエンコーダーの構成が異なれば、入力ストリーム型にNV12以外の形式を求められることもある。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/medfound/using-the-sink-writer> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/imfsinkwriter/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/h264-video-encoder/> ;
    schema:description "出力ストリーム型にMFVideoFormat_H264を設定した場合、Sink Writerは内部でH.264エンコーダーを使って書き出す。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/medfound/h-264-video-encoder> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/video-overlay-compositing/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/imfsinkwriter/> ;
    schema:description "合成・変換したフレームは、最終的にIMFSinkWriterで新しいMP4として書き出す。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/medfound/using-the-sink-writer> ;
    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/readsample/> ;
    schema:description "IMFSourceReaderはReadSampleでフレームを取得する。ループではHRESULT、flags、sampleの3つをそろえて確認する必要がある。"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/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/readsample/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/null-sample-result/> ;
    schema:description "ReadSampleはS_OKでもsampleがnullptrになることがあり、典型例はMF_SOURCE_READERF_STREAMTICKやMF_SOURCE_READERF_ENDOFSTREAMである。"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/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-overlay-compositing/> ;
    rdf:predicate ks:shouldPrecede ;
    rdf:object <https://comcomponent.com/knowledge/audio-remux/> ;
    schema:description "このサンプルはまず映像フレームへの焼き込みを1本通すことを優先し、音声remuxは拡張段階として後から足すべき手順として扱っている。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/medfound/using-the-sink-writer> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/custom-mft/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/video-overlay-compositing/> ;
    schema:description "複数アプリやtopologyで同じオーバーレイ処理を再利用したい場合は、custom MFTとして実装する選択肢がある。"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/windows/win32/medfound/writing-a-custom-mft> ;
    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" .
