public async Task <BitmapImage> GetThumbnailAsync(string mediaGroupName) { BitmapImage image = null; StorageFile mediaGroupCMPFile = null; MediaComposition mediaComposition = null; var dispatcher = Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher; try { await dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async() => { image = new BitmapImage(); image.CreateOptions = BitmapCreateOptions.IgnoreImageCache; mediaGroupCMPFile = await localFolder.GetFileAsync(mediaGroupName + ".cmp"); mediaComposition = await MediaComposition.LoadAsync(mediaGroupCMPFile); await image.SetSourceAsync(await mediaComposition.GetThumbnailAsync( TimeSpan.Zero, 0, 0, VideoFramePrecision.NearestFrame)); }); return(image); } catch (Exception e) { return(null); } }
//从文件加载组合 //可以从文件中反序列化媒体组合, 以允许用户查看和修改组合。选择一个组合文件, 然后调用 MediaComposition 方法 LoadAsync 以加载该组合。 private async Task OpenComposition() { var picker = new Windows.Storage.Pickers.FileOpenPicker(); picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.VideosLibrary; picker.FileTypeFilter.Add(".cmp"); StorageFile compositionFile = await picker.PickSingleFileAsync(); if (compositionFile == null) { //w文件选择失败 } else { App.Model.MediaComposition = await MediaComposition.LoadAsync(compositionFile); if (App.Model.MediaComposition != null) { } else { //无法打开组合 } } }
// <SnippetOpenComposition> private async Task OpenComposition() { var picker = new Windows.Storage.Pickers.FileOpenPicker(); picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.VideosLibrary; picker.FileTypeFilter.Add(".cmp"); Windows.Storage.StorageFile compositionFile = await picker.PickSingleFileAsync(); if (compositionFile == null) { ShowErrorMessage("File picking cancelled"); } else { composition = null; composition = await MediaComposition.LoadAsync(compositionFile); if (composition != null) { UpdateMediaElementSource(); } else { ShowErrorMessage("Unable to open composition"); } } }
private async void SaveCompositionToFile(MediaComposition composition, string suggestedFileName, uint vidX, uint vidY) { var savePicker = new FileSavePicker { SuggestedStartLocation = PickerLocationId.DocumentsLibrary }; // Dropdown of file types the user can save the file as savePicker.FileTypeChoices.Add("MP4", new List <string>() { ".mp4" }); // Default file name if the user does not type one in or select a file to replace savePicker.SuggestedFileName = suggestedFileName; // Get name and location for saved video file StorageFile sampleFile = await savePicker.PickSaveFileAsync(); if (sampleFile == null) { backgroundTint.Visibility = Windows.UI.Xaml.Visibility.Collapsed; showLoading.IsActive = false; return; } await composition.SaveAsync(sampleFile); composition = await MediaComposition.LoadAsync(sampleFile); // Get a generic encoding profile and match the width and height to the camera's width and height MediaEncodingProfile _MediaEncodingProfile = MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD720p); _MediaEncodingProfile.Video.Width = vidX; _MediaEncodingProfile.Video.Height = vidY; var saveOperation = composition.RenderToFileAsync(sampleFile, MediaTrimmingPreference.Precise, _MediaEncodingProfile); //mediaSimple.Source = new Uri("ms-appx:///WBVideo.mp4"); saveOperation.Progress = new AsyncOperationProgressHandler <TranscodeFailureReason, double>(async(info, progress) => { await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, new DispatchedHandler(() => { Debug.WriteLine(progress); //ShowErrorMessage(string.Format("Saving file... Progress: {0:F0}%", progress)); })); }); saveOperation.Completed = new AsyncOperationWithProgressCompletedHandler <TranscodeFailureReason, double>(async(info, status) => { await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, new DispatchedHandler(async() => { backgroundTint.Visibility = Windows.UI.Xaml.Visibility.Collapsed; showLoading.IsActive = false; await videoExportCompleteDialog.ShowAsync(); })); }); }
public async Task UpdateMediaElementSource() { try { cmpFile = await ApplicationData.Current.LocalFolder.GetFileAsync(mediaGroup.CompostionFileName + ".cmp"); mediaComposition = await MediaComposition.LoadAsync(cmpFile); mediaStreamSource = mediaComposition.GeneratePreviewMediaStreamSource( (int)mediaElement.ActualWidth, (int)mediaElement.ActualHeight); mediaElement.SetMediaStreamSource(mediaStreamSource); } catch (Exception) { } }
//This works private async void CreateVideoFromIDX3D() { for (int i = 0; i < 5; i++) { try { var folder = ApplicationData.Current.LocalFolder; RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(); await renderTargetBitmap.RenderAsync(RenderGrid); IBuffer pixels = await renderTargetBitmap.GetPixelsAsync(); CanvasBitmap bitmap = null; var videoClip = new MediaComposition(); //SoftwareBitmap softwareBitmap = new SoftwareBitmap(BitmapPixelFormat.Bgra8, renderTargetBitmap.PixelWidth, // renderTargetBitmap.PixelHeight); //bitmap = CanvasBitmap.CreateFromSoftwareBitmap(CanvasDevice.GetSharedDevice(), softwareBitmap); bitmap = CanvasBitmap.CreateFromBytes(CanvasDevice.GetSharedDevice(), pixels, renderTargetBitmap.PixelWidth, renderTargetBitmap.PixelHeight, DirectXPixelFormat.B8G8R8A8UIntNormalized); StorageFile video2 = await folder.CreateFileAsync("video2" + ".mp4", CreationCollisionOption.ReplaceExisting); MediaClip d = MediaClip.CreateFromSurface(bitmap, TimeSpan.FromSeconds(3)); videoClip.Clips.Add(d); //Use these code to work await videoClip.SaveAsync(video2); videoClip = await MediaComposition.LoadAsync(video2); var result = await videoClip.RenderToFileAsync(video2); Debug.WriteLine(result.ToString()); break; } catch (Exception ex) { Debug.WriteLine(ex.Message); } } }
private async void CreateVideoFromWritableBitmapAsync(List <WriteableBitmap> WBs) { var mediaComposition = new MediaComposition(); foreach (WriteableBitmap WB in WBs) { var pixels = WB.PixelBuffer.ToArray(); CanvasBitmap bitmap = CanvasBitmap.CreateFromBytes(CanvasDevice.GetSharedDevice(), pixels, 800, 600, DirectXPixelFormat.B8G8R8A8UIntNormalized); MediaClip mediaClip = MediaClip.CreateFromSurface(bitmap, TimeSpan.FromSeconds(1)); mediaComposition.Clips.Add(mediaClip); } //Save the video var file = await ApplicationData.Current.LocalFolder.CreateFileAsync("WBVideo.mp4"); await mediaComposition.SaveAsync(file); mediaComposition = await MediaComposition.LoadAsync(file); await mediaComposition.RenderToFileAsync(file); }
private async void Page_Loaded(object sender, RoutedEventArgs e) { if (ApiInformation.IsTypePresent("Windows.UI.ViewManagement.StatusBar")) { DisplayInformation.AutoRotationPreferences = DisplayOrientations.Landscape; await StatusBar.GetForCurrentView().HideAsync(); } else { WindowManager.HandleTitleBarForGrid(topGrid); } if (_model.StorageFile == null) { await UIUtilities.ShowErrorDialogAsync("This clip cannot be edited.", "Currently, you can only edit video clips from files. Sorry!"); Close(); return; } if (_model.Composition == null) { _createdNew = true; var name = Path.ChangeExtension(_model.StorageFile.Name, "uni-cmp"); try { _model.CompositionFile = _model.CompositionFile ?? await ApplicationData.Current.LocalFolder.GetFileAsync(name); if (await UIUtilities.ShowYesNoDialogAsync("Load previous edit?", "It looks like you've edited this file before, do you want to load your previous edits?")) { _model.Composition = await MediaComposition.LoadAsync(_model.CompositionFile); } else { _model.Composition = new MediaComposition(); } } catch { _model.Composition = new MediaComposition(); } } if (_model.Composition.Clips.Count == 0) { var clip = await MediaClip.CreateFromFileAsync(_model.StorageFile); _model.Composition.Clips.Add(clip); _model.Clip = clip; } else { _model.Clip = _model.Composition.Clips.First(); } rangeSelector.Maximum = _model.Clip.OriginalDuration.TotalSeconds; rangeSelector.RangeMin = _model.Clip.TrimTimeFromStart.TotalSeconds; rangeSelector.RangeMax = _model.Clip.OriginalDuration.TotalSeconds - _model.Clip.TrimTimeFromEnd.TotalSeconds; rangeSelector.Value = rangeSelector.RangeMin; startPointText.Text = _model.Clip.TrimTimeFromStart.ToString("mm\\:ss"); endPointText.Text = (_model.Clip.OriginalDuration - _model.Clip.TrimTimeFromEnd).ToString("mm\\:ss"); _ready = true; UpdateMediaElementSource(); }
private async Task <List <StorageFile> > OnOpen(CancellationToken cancellationToken, StorageFile folderBrowser = null) { #region Content Loading audioVideo.Clear(); await GetTextContent(cancellationToken, folderBrowser); #endregion #region Frame Creation for (int i = 0; i < ContentList.Count; i++) { percent = (Convert.ToDouble(i + 1) / Convert.ToDouble(ContentList.Count)) * 100d; ReportProgress(Stage3, Stage2ProgressBar, TextProgress2, percent); await SetImage(ContentList[i], cancellationToken); } #endregion #region Audio Creation await SetBackgroundAudio(GetSSML(ContentList), cancellationToken, true); #endregion #region Composition Creation StorageFile audioBackgroundFile = await GetFile("BackgroundAudio", "temp (1).wav", cancellationToken); if (audioBackgroundFile == null) { return(null); } IReadOnlyList <StorageFile> imageTemporaryFiles = await GetFiles("Image", cancellationToken); if (imageTemporaryFiles == null) { return(null); } if (TrackLength.Count != imageTemporaryFiles.Count) { await MessageBox("some audio files or frames are missing."); return(null); } Dictionary <StorageFile, TimeSpan> temporaryFilesWithDuration = new Dictionary <StorageFile, TimeSpan>(); for (int i = 0; i < imageTemporaryFiles.Count; i++) { try { percent = (Convert.ToDouble(i) / Convert.ToDouble(ContentList.Count)) * 100d; temporaryFilesWithDuration.Add(imageTemporaryFiles[i], TrackLength[i].Subtract((i == 0 ? subTimeSpan : TrackLength[i - 1]))); ReportProgress(Stage5, Stage4ProgressBar, TextProgress4, percent); } catch (Exception) { } } await SetComp(audioBackgroundFile, temporaryFilesWithDuration, cancellationToken); #endregion #region Video Creation StorageFile compTemporaryFile = await GetFile("Media Composition", "temp (1).cmp", cancellationToken); if (compTemporaryFile == null) { return(null); } MediaComposition mediaComposition = await MediaComposition.LoadAsync(compTemporaryFile); await SetVideo(mediaComposition, cancellationToken); return(audioVideo); #endregion }
private async void Page_Loaded(object sender, RoutedEventArgs e) { var coreWindow = CoreWindow.GetForCurrentThread(); coreWindow.KeyUp += OnWindowKeyUp; if (ApiInformation.IsTypePresent("Windows.UI.ViewManagement.StatusBar")) { DisplayInformation.AutoRotationPreferences = DisplayOrientations.Landscape; await StatusBar.GetForCurrentView().HideAsync(); } else { WindowingService.Current.HandleTitleBarForControl(topGrid); } if (_model.StorageFile == null) { await UIUtilities.ShowErrorDialogAsync(_strings.GetString("CannotEditClipTitle"), _strings.GetString("CannotEditClipMessage")); Close(); return; } Analytics.TrackEvent("VideoEditor_Loaded"); if (_model.Composition == null) { _createdNew = true; var name = Path.ChangeExtension(_model.StorageFile.Name, "uni-cmp"); try { _model.CompositionFile = _model.CompositionFile ?? await ApplicationData.Current.LocalFolder.GetFileAsync(name); if (await UIUtilities.ShowYesNoDialogAsync(_strings.GetString("LoadPreviousEditsTitle"), _strings.GetString("LoadPreviousEditsMessage"))) { _model.Composition = await MediaComposition.LoadAsync(_model.CompositionFile); } else { _model.Composition = new MediaComposition(); } } catch { _model.Composition = new MediaComposition(); } } if (_model.Composition.Clips.Count == 0) { var clip = await MediaClip.CreateFromFileAsync(_model.StorageFile); _model.Composition.Clips.Add(clip); _model.Clip = clip; } else { _model.Clip = _model.Composition.Clips.First(); } rangeSelector.Maximum = _model.Clip.OriginalDuration.TotalSeconds; rangeSelector.RangeMin = _model.Clip.TrimTimeFromStart.TotalSeconds; rangeSelector.RangeMax = _model.Clip.OriginalDuration.TotalSeconds - _model.Clip.TrimTimeFromEnd.TotalSeconds; rangeSelector.Value = rangeSelector.RangeMin; startPointText.Text = FormatTimeSpan(_model.Clip.TrimTimeFromStart); endPointText.Text = FormatTimeSpan(_model.Clip.OriginalDuration - _model.Clip.TrimTimeFromEnd); _ready = true; UpdateMediaElementSource(); }
public async Task MergeMedias(List<Media> medias, MediaGroup currentMediaGroup = null) { // Use Profile for output vid/cmp? file try { List<StorageFile> mediaFiles = new List<StorageFile>(); MediaGroup mediaGroup = new MediaGroup(); StorageFolder localFolder = ApplicationData.Current.LocalFolder; MediaComposition composition = new MediaComposition(); List<MediaClip> mediaClips = new List<MediaClip>(); StorageFile timelineVidOutputFile; StorageFile timelineCMPOutputFile; bool deleteExistingFile = (currentMediaGroup != null) ? false : true; #region EmotionsMeanTemp double tmpAngerScoreMean = 0; double tmpContemptScoreMean = 0; double tmpDisgustScoreMean = 0; double tmpFearScoreMean = 0; double tmpHappinessScoreMean = 0; double tmpNeutralScoreMean = 0; double tmpSadnessScoreMean = 0; double tmpSurpriseScoreMean = 0; string tmpHighestEmotionMean = string.Empty; #endregion foreach (var media in medias) { mediaFiles.Add(await StorageFile.GetFileFromApplicationUriAsync(new Uri( string.Format("ms-appdata:///local/{0}", media.MediaName)))); tmpAngerScoreMean += media.AngerScore; tmpContemptScoreMean += media.ContemptScore; tmpDisgustScoreMean += media.DisgustScore; tmpFearScoreMean += media.FearScore; tmpHappinessScoreMean += media.HappinessScore; tmpNeutralScoreMean += media.NeutralScore; tmpSadnessScoreMean += media.SadnessScore; tmpSurpriseScoreMean += media.SurpriseScore; } tmpAngerScoreMean = tmpAngerScoreMean / medias.Count; tmpContemptScoreMean = tmpContemptScoreMean / medias.Count; tmpDisgustScoreMean = tmpDisgustScoreMean / medias.Count; tmpFearScoreMean = tmpFearScoreMean / medias.Count; tmpHappinessScoreMean = tmpHappinessScoreMean / medias.Count; tmpNeutralScoreMean = tmpNeutralScoreMean / medias.Count; tmpSadnessScoreMean = tmpSadnessScoreMean / medias.Count; tmpSurpriseScoreMean = tmpSurpriseScoreMean / medias.Count; SortedList<string, double> tempForSortingScores = new SortedList<string, double>(); tempForSortingScores.Add("AngerScoreMean", tmpAngerScoreMean); tempForSortingScores.Add("ContemptScoreMean", tmpContemptScoreMean); tempForSortingScores.Add("DisgustScoreMean", tmpDisgustScoreMean); tempForSortingScores.Add("FearScoreMean", tmpFearScoreMean); tempForSortingScores.Add("HappinessScoreMean", tmpHappinessScoreMean); tempForSortingScores.Add("NeutralScoreMean", tmpNeutralScoreMean); tempForSortingScores.Add("SadnessScoreMean", tmpSadnessScoreMean); tempForSortingScores.Add("SurpriseScoreMean", tmpSurpriseScoreMean); // TODO: check this. tmpHighestEmotionMean = tempForSortingScores.OrderByDescending(x => x.Value).FirstOrDefault().Key; if (currentMediaGroup == null) { timelineVidOutputFile = await localFolder.CreateFileAsync( "timelineMeOutput.mp4", CreationCollisionOption.GenerateUniqueName); string CMPFileName = string.Format(timelineVidOutputFile.DisplayName + ".cmp"); timelineCMPOutputFile = await localFolder.CreateFileAsync( CMPFileName, CreationCollisionOption.OpenIfExists); for (int i = 0; i < mediaFiles.Count; i++) { mediaClips.Add(await MediaClip.CreateFromImageFileAsync(mediaFiles[i], TimeSpan.FromSeconds(int.Parse(localSettings.Values["DurationInSecForEachImage"].ToString())))); composition.Clips.Add(mediaClips[i]); } using (var db = new MediaContext()) { mediaGroup = new MediaGroup() { CompostionFileName = timelineVidOutputFile.DisplayName, LastEditDate = DateTime.Now, AngerScoreMean = tmpAngerScoreMean, ContemptScoreMean = tmpContemptScoreMean, DisgustScoreMean = tmpDisgustScoreMean, FearScoreMean = tmpFearScoreMean, HappinessScoreMean = tmpHappinessScoreMean, NeutralScoreMean = tmpNeutralScoreMean, SadnessScoreMean = tmpSadnessScoreMean, SurpriseScoreMean = tmpSurpriseScoreMean, HighestEmotionMean = tmpHighestEmotionMean }; db.MediaGroups.Add(mediaGroup); db.SaveChanges(); } var action = composition.SaveAsync(timelineCMPOutputFile); action.Completed = (info, status) => { if (status != AsyncStatus.Completed) { //ShowErrorMessage("Error saving composition"); } }; } else { using (var db = new MediaContext()) { mediaGroup = db.MediaGroups.Where( x => x.CompostionFileName == currentMediaGroup.CompostionFileName). FirstOrDefault(); // TODO Check this mediaGroup.LastEditDate = DateTime.Now; mediaGroup.AngerScoreMean = mediaGroup.AngerScoreMean + tmpAngerScoreMean / 2; mediaGroup.ContemptScoreMean = mediaGroup.ContemptScoreMean + tmpContemptScoreMean / 2; mediaGroup.DisgustScoreMean = mediaGroup.DisgustScoreMean + tmpDisgustScoreMean / 2; mediaGroup.FearScoreMean = mediaGroup.FearScoreMean + tmpFearScoreMean / 2; mediaGroup.HappinessScoreMean = mediaGroup.HappinessScoreMean + tmpHappinessScoreMean / 2; mediaGroup.NeutralScoreMean = mediaGroup.NeutralScoreMean + tmpNeutralScoreMean / 2; mediaGroup.SadnessScoreMean = mediaGroup.SadnessScoreMean + tmpSadnessScoreMean / 2; mediaGroup.SurpriseScoreMean = mediaGroup.SurpriseScoreMean + tmpSurpriseScoreMean / 2; SortedList<string, double> temptempForSortingScores = new SortedList<string, double>(); temptempForSortingScores.Add("AngerScoreMean", mediaGroup.AngerScoreMean); temptempForSortingScores.Add("ContemptScoreMean", mediaGroup.ContemptScoreMean); temptempForSortingScores.Add("DisgustScoreMean", mediaGroup.DisgustScoreMean); temptempForSortingScores.Add("FearScoreMean", mediaGroup.FearScoreMean); temptempForSortingScores.Add("HappinessScoreMean", mediaGroup.HappinessScoreMean); temptempForSortingScores.Add("NeutralScoreMean", mediaGroup.NeutralScoreMean); temptempForSortingScores.Add("SadnessScoreMean", mediaGroup.SadnessScoreMean); temptempForSortingScores.Add("SurpriseScoreMean", mediaGroup.SurpriseScoreMean); // TODO: check this. mediaGroup.HighestEmotionMean = temptempForSortingScores.OrderByDescending(x => x.Value).FirstOrDefault().Key; db.MediaGroups.Update(mediaGroup); db.SaveChanges(); } timelineVidOutputFile = await localFolder.GetFileAsync(currentMediaGroup.CompostionFileName + ".mp4"); timelineCMPOutputFile = await localFolder.GetFileAsync(currentMediaGroup.CompostionFileName + ".cmp"); composition = await MediaComposition.LoadAsync(timelineCMPOutputFile); //TODO: make sure this works. for (int i = 0; i < mediaFiles.Count; i++) { // TODO Fix this mediaClips.Add(await MediaClip.CreateFromImageFileAsync(mediaFiles[i], TimeSpan.FromSeconds(int.Parse(localSettings.Values["DurationInSecForEachImage"].ToString())))); composition.Clips.Add(mediaClips[i]); } var action = composition.SaveAsync(timelineCMPOutputFile); action.Completed = (info, status) => { if (status != AsyncStatus.Completed) { //ShowErrorMessage("Error saving composition"); } }; } } catch (Exception) { } }