예제 #1
0
        /**
         * 非同期にソースをロードする
         */
        public static async Task <WvvMediaLoader> LoadAsync(MediaPlayer player, MediaSource source, DependencyObject ownerView)
        {
            var loader = new WvvMediaLoader(player);
            await loader.LoadAsync(source, ownerView);

            return(loader);
        }
예제 #2
0
        /**
         * 動画ファイルをロードして、フレームサムネイルを抽出する。
         */
        private async void LoadMediaSource(StorageFile source)
        {
            Ready = false;

            //
            Error.Reset();
            mPlayer.Source = null;
            mPreviewing    = false;
            mTrimmingSlider.Reset();
            mFrameListView.Reset();
            mExtractor.Cancel();
            mFrameListView.ShowCurrentTick = false;

            mComposition.Clips.Clear();
            if (null != source)
            {
                mOriginalSource = MediaSource.CreateFromStorageFile(source);
                var loader = await WvvMediaLoader.LoadAsync(mPlayer, mOriginalSource, this);

                if (loader.Opened)
                {
                    TotalRange = loader.TotalRange;
                    VideoSize  = loader.VideoSize;

                    try
                    {
                        var clip = await MediaClip.CreateFromFileAsync(source);

                        mComposition.Clips.Add(clip.Clone());
                        Ready = true;
                        await mExtractor.ExtractAsync(clip, (s, i, img) =>
                        {
                            mFrameListView.Frames[i] = img;
                        },
                                                      (s, img) =>
                        {
                            mFrameListView.FrameListHeight = mExtractor.ThumbnailHeight;
                            for (int i = 0; i < ThumbnailCount; i++)
                            {
                                mFrameListView.Frames.Add(img);
                            }
                            mFrameListView.ShowCurrentTick = true;
                        });
                    }
                    catch (Exception e)
                    {
                        CmLog.error(e, "WvvTrimmingView.LoadMediaSource: Error");
                        Error.SetError(e);
                    }
                }
                else // not opened.
                {
                    Error.CopyFrom(loader.Error);
                }
            }
        }
예제 #3
0
        /**
         * プレビューモードを開始する。
         *
         * トリミングモード:
         *  MediaPlayerのソースに、オリジナルのソース(StorageFileから生成したもの)をセットした状態。
         *  トリミング操作は、常にこのモードで行い、再生は行わない。
         * プレビューモード:
         *  MediaPlayerのソースに、MediaComposition から生成したストリームを指定し、トリミング後の動画を再生テストするモード
         *  トリミング操作を行うと、自動的にこのモードはキャンセルされ、全体表示モードに戻る。
         */
        private async Task startPreview(bool play)
        {
            if (mPreviewing)
            {
                if (!IsPlaying)
                {
                    mPlayer.Play();
                }
                return;
            }
            if (mTrimmingSlider.TrimmedRange < 100 || mComposition.Clips.Count != 1)
            {
                return;
            }
            mComposition.Clips[0].TrimTimeFromStart = TimeSpan.FromMilliseconds(mTrimmingSlider.TrimStart);
            mComposition.Clips[0].TrimTimeFromEnd   = TimeSpan.FromMilliseconds(mTrimmingSlider.TrimEnd);

            try
            {
                mPreviewing = true;
                MediaStreamSource mediaStreamSource = mComposition.GeneratePreviewMediaStreamSource(
                    (int)mPlayerElement.ActualWidth,
                    (int)mPlayerElement.ActualHeight);

                var loader = await WvvMediaLoader.LoadAsync(mPlayer, MediaSource.CreateFromMediaStreamSource(mediaStreamSource), this);

                if (null != loader)
                {
                    if (mPreviewing)
                    {
                        mPlayer.PlaybackSession.Position = TimeSpan.FromMilliseconds(mTrimmingSlider.CurrentPosition);
                        if (play)
                        {
                            mPlayer.Play();
                        }
                    }
                }
                else
                {
                    mPreviewing = false;
                }
            }
            catch (Exception e)
            {
                CmLog.error(e, "WvvTrimmingView.startPreview: Error");
                mPlayer.Pause();
                mPreviewing = false;
                Error.SetError(e);
            }
        }
예제 #4
0
        /**
         * プレビューモードを終了して、トリミングモードに戻る。
         */
        private async Task stopPreview(PositionOf seekTo)
        {
            if (IsPlaying)
            {
                mPlayer.Pause();
            }
            if (!mPreviewing)
            {
                mPlayer.PlaybackSession.Position = TimeSpan.FromMilliseconds(seekPosition(seekTo));
                return;
            }
            mPreviewing = false;
            var loader = await WvvMediaLoader.LoadAsync(mPlayer, mOriginalSource, this);

            if (null != loader)
            {
                if (!mPreviewing)
                {
                    mPlayer.PlaybackSession.Position = TimeSpan.FromMilliseconds(seekPosition(seekTo));
                }
            }
        }