知識マップ: Media FoundationでMP4の指定時刻から静止画を切り出す方法
記事「Media FoundationでMP4の指定時刻から静止画を切り出す方法」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
この記事は、Media FoundationのIMFSourceReaderを使ってMP4から指定時刻に最も近い1枚の静止画を取り出す方法を整理している。SetCurrentPositionによるseekはexactではなく通常キーフレーム側へ寄るため、GOPが長い動画ほど誤差が生じやすく、seek後にReadSampleを繰り返してtimestampの前後を比較する必要がある。ReadSampleは成功していてもサンプルがnullのことがあるため確認が要る。取り出したMFVideoFormat_RGB32のフレームは、strideと上下向きをIMF2DBuffer::Lock2Dで吸収してtop-downのBGRAへ整形し、4バイト目をalphaとして0xFFに固定してから、WICでPNGとして保存することで、意図しない透明PNGになる不具合を防いでいる。
flowchart LR
accTitle: MP4からの静止画抽出(Media Foundation)の知識マップ
accDescr: IMFSourceReaderによるSetCurrentPositionのseekがキーフレーム側へ寄ること、GOPの長さとReadSampleでの前後比較の関係、strideとtop-down/bottom-upの向きをLock2Dで吸収する処理、RGB32の4バイト目をalphaとして固定してWICでPNG保存するまでの関係を示す図。
video_frame_extraction["動画からの静止画抽出(指定時刻のフレーム取得)"]
imfsourcereader["IMFSourceReader(Source Reader)"]
media_foundation["Media Foundation"]
source_reader_seek["SetCurrentPositionによるseek"]
readsample["IMFSourceReader::ReadSample"]
group_of_pictures["GOP(Group of Pictures)"]
key_frame["キーフレーム(key frame)"]
video_stride["stride(画像の行送りバイト数)"]
imf2dbuffer_lock2d["IMF2DBuffer::Lock2D"]
top_down_bottom_up_orientation["top-down / bottom-up(画像の上下向き)"]
mfvideoformat_rgb32["MFVideoFormat_RGB32"]
unintended_transparent_png["意図しない透明PNG"]
alpha_channel_fixup["alphaの0xFF固定"]
windows_imaging_component["WIC(Windows Imaging Component)"]
null_sample_result["ReadSampleのnullサンプル"]
video_frame_extraction -->|"利用する"| imfsourcereader
imfsourcereader -->|"前提とする"| media_foundation
imfsourcereader -->|"利用する"| source_reader_seek
source_reader_seek -->|"前提とする"| readsample
group_of_pictures -.->|"原因になり得る"| source_reader_seek
source_reader_seek -->|"利用する"| key_frame
video_frame_extraction -->|"前提とする"| readsample
video_frame_extraction -->|"前提とする"| video_stride
video_stride -->|"利用する"| imf2dbuffer_lock2d
video_stride -->|"前提とする"| top_down_bottom_up_orientation
mfvideoformat_rgb32 -.->|"原因になり得る"| unintended_transparent_png
alpha_channel_fixup -->|"防止する"| unintended_transparent_png
video_frame_extraction -->|"利用する"| windows_imaging_component
video_frame_extraction -->|"利用する"| mfvideoformat_rgb32
readsample -->|"原因になり得る"| null_sample_result
概念間の関係(全15件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- 動画からの静止画抽出(指定時刻のフレーム取得)はIMFSourceReader(Source Reader)を利用します。
- IMFSourceReader(Source Reader)はMedia Foundationを前提とします。
- IMFSourceReader(Source Reader)はSetCurrentPositionによるseekを利用します。
- SetCurrentPositionによるseekはIMFSourceReader::ReadSampleを前提とします。
- GOP(Group of Pictures)はSetCurrentPositionによるseekの原因になることがあります。
- SetCurrentPositionによるseekはキーフレーム(key frame)を利用します。
- 動画からの静止画抽出(指定時刻のフレーム取得)はIMFSourceReader::ReadSampleを前提とします。
- 動画からの静止画抽出(指定時刻のフレーム取得)はstride(画像の行送りバイト数)を前提とします。
- stride(画像の行送りバイト数)はIMF2DBuffer::Lock2Dを利用します。
- stride(画像の行送りバイト数)はtop-down / bottom-up(画像の上下向き)を前提とします。
- MFVideoFormat_RGB32は意図しない透明PNGの原因になることがあります。
- alphaの0xFF固定は意図しない透明PNGを防ぎます。
- 動画からの静止画抽出(指定時刻のフレーム取得)はWIC(Windows Imaging Component)を利用します。
- 動画からの静止画抽出(指定時刻のフレーム取得)はMFVideoFormat_RGB32を利用します。
- IMFSourceReader::ReadSampleはReadSampleのnullサンプルの原因になることがあります。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。