Beispiel #1
0
        /**
         * フレームの抽出処理を開始
         *
         * @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();
            }
        }
Beispiel #2
0
        /**
         * フレームの抽出処理を開始
         *
         * @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));
        }
Beispiel #3
0
        /**
         * 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));
        }