VideoPlayerでの静止画切り出しについて
furafura  2017/11/29(Wed) 19:29
Siv3D  August 2016 v2 x64環境での話です。

VideoPlayer対応動画を、
時分秒指定して静止画として吸い出したいと思います。
可能な限り、時分秒指定が確約された結果を得たいのですが、
私の試した範囲では巧く行かない事がありました。
やり方や考え方が間違っているか、
他の方法があればヒントをお願い致します。

例(このままでは動作しないものとなっております)

VideoPlayer video;
double nowtime = 0;
LPBYTE datap = (LPBYTE)TileImage[0].data();

video.play();
video.pause();

for(DWORD i = 0; i < 5; ++i) {
video.setPosSec(nowtime);
video.update();
nowtime += 1.0; // 1秒単位
//System::Sleep(20); // ←これを有効にして数値を大きくしていくと、意図した動作になる傾向
ImgA2ImgB(
(LPBYTE)video.getFrameImage().data(),
datap + (x * TUM_SIZEX * 4) + (y * TUM_SIZEX * TUM_COUNT_X * TUM_SIZEY * 4),
TUM_SIZEX * TUM_COUNT_X * 4);
}


play後、勝手に再生が進む可能性をpauseで防止し、
setPosSecで任意時間にシークさせ、
updateで更新し、
getFrameImageで静止画切り出しのプログラムです。

ImgA2ImgBは、ImageのA丸々をImage B内の任意位置に転送するものを自作したものですが、
内容はともかく、
getFrameImageで得たImageをどこか単純に転送しても、静止画更新されない結果は同じかと思います。
Sleep無しだと、シークなのか何か更新が間に合わないのか、
私の環境では144枚出力したとしても全て同じ画像となってしまいました。
Sleepの値を増やしていくと、画像の更新が増えていきました。
記事編集
Reputeless  2017/12/01(Fri) 00:52
VideoPlayer のシークに関する内部実装、Siv3D 側から制御が難しいブラックボックスになっているので、対応は厳しいです。
良い方法を引き続き調査していきます。
編集
furafura  2017/12/01(Fri) 01:24
ブラックボックスでは厳しいですね。

私の方でも他の方法・可能性を探っていきます。

お忙しいところ、回答ありがとうございました。
編集
件名
Re: VideoPlayerでの静止画切り出しについて
名前
コメント
画像添付


投稿修正キー (投稿を修正する時に使います)
画像認証 (右画像の数字を入力) 投稿キー

- WEB PATIO -