/** * 非同期にソースをロードする */ public static async Task <WvvMediaLoader> LoadAsync(MediaPlayer player, MediaSource source, DependencyObject ownerView) { var loader = new WvvMediaLoader(player); await loader.LoadAsync(source, ownerView); return(loader); }
/** * 動画ファイルをロードして、フレームサムネイルを抽出する。 */ 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); } } }
/** * プレビューモードを開始する。 * * トリミングモード: * 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); } }
/** * プレビューモードを終了して、トリミングモードに戻る。 */ 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)); } } }