知識マップ: Media FoundationでMP4に画像と文字を焼き込む方法
記事「Media FoundationでMP4に画像と文字を焼き込む方法」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
この記事は、Media FoundationでMP4の各フレームへ画像と文字を焼き込み、新しいMP4を作る構成を整理している。処理はIMFSourceReaderでRGB32のフレームをデコードし、1ファイル完結サンプルではGDI+で画像とテキストを合成し、H.264エンコーダーがNV12などYUV系入力を前提とすることが多いためBGRAからNV12へ変換したうえで、IMFSinkWriterがH.264としてMP4へ書き出す。strideと上下向きの違いはIMF2DBuffer::Lock2Dで吸収してtop-downのBGRAへ正規化し、ReadSampleはHRESULT・flags・sampleの3点を確認する必要がある。本番では色変換をVideo Processor MFTへ寄せる、描画をDirect2D/DirectWriteへ置き換える、再利用性が必要ならcustom MFTへ切り出すといった拡張が段階的に示され、音声remuxは映像の焼き込みを先に安定させたうえで追加すべき手順として位置付けられている。
flowchart LR
accTitle: MP4への画像・文字焼き込み(Media Foundation)の知識マップ
accDescr: IMFSourceReaderでのRGB32デコードとGDI+による合成、RGB系とNV12の変換がH.264エンコーダーへの入力として必要になること、IMFSinkWriterによるMP4書き出し、strideとtop-down/bottom-upの吸収、Direct2D/DirectWriteやVideo Processor MFT、custom MFTへの拡張、音声remuxを後段に置く進め方までの関係を示す図。
video_overlay_compositing["動画フレームへの画像・文字の焼き込み"]
imfsinkwriter["IMFSinkWriter(Sink Writer)"]
imfsourcereader["IMFSourceReader(Source Reader)"]
gdiplus["GDI+"]
direct2d_directwrite["Direct2D / DirectWrite"]
video_stride["stride(画像の行送りバイト数)"]
imf2dbuffer_lock2d["IMF2DBuffer::Lock2D"]
top_down_bottom_up_orientation["top-down / bottom-up(画像の上下向き)"]
mfvideoformat_rgb32["MFVideoFormat_RGB32"]
h264_video_encoder["H.264 Video Encoder(Media Foundation)"]
nv12_pixel_format["NV12ピクセル形式"]
rgb_to_nv12_conversion["BGRAからNV12への色変換"]
video_processor_mft["Video Processor MFT"]
readsample["IMFSourceReader::ReadSample"]
null_sample_result["ReadSampleのnullサンプル"]
audio_remux["音声のremux"]
custom_mft["custom MFT"]
media_foundation["Media Foundation"]
video_overlay_compositing -->|"利用する"| imfsourcereader
video_overlay_compositing -->|"利用する"| gdiplus
direct2d_directwrite -.->|"推奨される対応"| video_overlay_compositing
video_overlay_compositing -->|"前提とする"| video_stride
video_stride -->|"利用する"| imf2dbuffer_lock2d
video_stride -->|"前提とする"| top_down_bottom_up_orientation
video_overlay_compositing -->|"利用する"| mfvideoformat_rgb32
mfvideoformat_rgb32 -.->|"両立しない"| h264_video_encoder
h264_video_encoder -.->|"前提とする"| nv12_pixel_format
rgb_to_nv12_conversion -->|"前提とする"| mfvideoformat_rgb32
video_overlay_compositing -->|"利用する"| rgb_to_nv12_conversion
video_processor_mft -->|"推奨される対応"| rgb_to_nv12_conversion
imfsinkwriter -.->|"前提とする"| nv12_pixel_format
imfsinkwriter -.->|"利用する"| h264_video_encoder
video_overlay_compositing -->|"前提とする"| imfsinkwriter
imfsourcereader -->|"利用する"| readsample
readsample -->|"原因になり得る"| null_sample_result
video_overlay_compositing -->|"より先に行うべき"| audio_remux
custom_mft -->|"推奨される対応"| video_overlay_compositing
imfsourcereader -->|"前提とする"| media_foundation
概念間の関係(全20件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- 動画フレームへの画像・文字の焼き込みはIMFSourceReader(Source Reader)を利用します。
- 動画フレームへの画像・文字の焼き込みはGDI+を利用します。
- Direct2D / DirectWriteは動画フレームへの画像・文字の焼き込みに対する本記事の推奨です。
- 動画フレームへの画像・文字の焼き込みはstride(画像の行送りバイト数)を前提とします。
- stride(画像の行送りバイト数)はIMF2DBuffer::Lock2Dを利用します。
- stride(画像の行送りバイト数)はtop-down / bottom-up(画像の上下向き)を前提とします。
- 動画フレームへの画像・文字の焼き込みはMFVideoFormat_RGB32を利用します。
- MFVideoFormat_RGB32はH.264 Video Encoder(Media Foundation)と両立しません。
- H.264 Video Encoder(Media Foundation)はNV12ピクセル形式を前提とします。
- BGRAからNV12への色変換はMFVideoFormat_RGB32を前提とします。
- 動画フレームへの画像・文字の焼き込みはBGRAからNV12への色変換を利用します。
- Video Processor MFTはBGRAからNV12への色変換に対する本記事の推奨です。
- IMFSinkWriter(Sink Writer)はNV12ピクセル形式を前提とします。
- IMFSinkWriter(Sink Writer)はH.264 Video Encoder(Media Foundation)を利用します。
- 動画フレームへの画像・文字の焼き込みはIMFSinkWriter(Sink Writer)を前提とします。
- IMFSourceReader(Source Reader)はIMFSourceReader::ReadSampleを利用します。
- IMFSourceReader::ReadSampleはReadSampleのnullサンプルの原因になることがあります。
- 動画フレームへの画像・文字の焼き込みは音声のremuxより先に行うべきです。
- custom MFTは動画フレームへの画像・文字の焼き込みに対する本記事の推奨です。
- IMFSourceReader(Source Reader)はMedia Foundationを前提とします。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。