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