/** * フレームの抽出処理を開始 * * @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)); }
/** * playerに設定されている動画からフレーム画像を抽出する。 * * @param thumbnailHeight サムネイル画像の高さ * @param frameCount フレーム数 * @param player Sourceを設定してMediaOpenedの状態になっているMediaPlayerオブジェクト * @param ownerView Dispatcherを供給するビュー * @param extracted 取得したフレーム画像をコールバックするハンドラ */ public static IAsyncOperation <bool> ExtractAsync(double thumbnailHeight, int frameCount, MediaPlayer player, DependencyObject ownerView, OnThumbnailExtractedHandler extracted) { var extractor = new WvvFrameExtractor(thumbnailHeight, frameCount); return(extractor.ExtractAsync(player, ownerView, extracted)); }