/** * フレームの抽出処理を開始 * * @param clip ソースを保持したMediaClip * @param extracted 取得したフレーム画像をコールバックするハンドラ */ public async Task <bool> ExtractAsync(MediaClip clip, OnThumbnailExtractedHandler extracted, OnBlankThumbnailHandler blank) { int doing = ++mDoing; Error = null; // Debug.WriteLine("Logical-DPI = {0}", DisplayInformation.GetForCurrentView().LogicalDpi); var composer = new MediaComposition(); composer.Clips.Add(clip); try { var totalRange = clip.OriginalDuration.TotalMilliseconds; var span = totalRange / FrameCount; var offset = span / 2; for (int n = 0; n < FrameCount; n++) { using (var imageStream = await composer.GetThumbnailAsync(TimeSpan.FromMilliseconds(offset + span * n), 0, ThumbnailHeight, VideoFramePrecision.NearestFrame)) { if (doing != mDoing) { // cancelling return(false); } var bmp = new BitmapImage(); bmp.SetSource(imageStream); // bmp.SetSourceしたら、imageStreamはすぐDisposeしても大丈夫っぽい。 if (null != blank && n == 0) { var source = await CreateBlankBitmap(bmp.PixelWidth, bmp.PixelHeight); #if false var bb = new SoftwareBitmap(BitmapPixelFormat.Bgra8, bmp.PixelWidth, bmp.PixelHeight, BitmapAlphaMode.Ignore); var source = new SoftwareBitmapSource(); await source.SetBitmapAsync(bb); #endif blank(this, source); } extracted(this, n, bmp); } } return(true); } catch (Exception e) { CmLog.error("WvvFrameExtractor2.ExtractAsync", e); Error = e; return(false); } finally { composer.Clips.Clear(); } }
/** * フレームの抽出処理を開始 * * @param source ソースファイル * @param extracted 取得したフレーム画像をコールバックするハンドラ */ public async Task <bool> ExtractAsync(StorageFile source, OnThumbnailExtractedHandler extracted, OnBlankThumbnailHandler blank) { var clip = await MediaClip.CreateFromFileAsync(source); return(await ExtractAsync(clip, extracted, blank)); }