private void StartCapture() { var p = MediaEncodingProfile.CreateHevc(VideoEncodingQuality.HD720p); Guid MFVideoFormat_RGB32 = new Guid("{00000016-0000-0010-8000-00AA00389B71}"); this.rtServer = new RealtimeServer(this.connection, MFVideoFormat_RGB32, MediaEncodingProfile.CreateHevc(VideoEncodingQuality.HD720p) ); if (this.rtServer != null) { writeFrameTimer = null; var autoEvent = new AutoResetEvent(false); writeFrameTimer = new Timer(OnWriteFrame, autoEvent, 0, 1000 / 30); } }
/// <summary> /// 提供音视频转码 /// </summary> /// <param name="SourceFile">源文件</param> /// <param name="DestinationFile">目标文件</param> /// <param name="MediaTranscodeEncodingProfile">转码编码</param> /// <param name="MediaTranscodeQuality">转码质量</param> /// <param name="SpeedUp">是否启用硬件加速</param> /// <returns></returns> public static Task TranscodeFromAudioOrVideoAsync(StorageFile SourceFile, StorageFile DestinationFile, string MediaTranscodeEncodingProfile, string MediaTranscodeQuality, bool SpeedUp) { return Task.Factory.StartNew((ob) => { IsAnyTransformTaskRunning = true; AVTranscodeCancellation = new CancellationTokenSource(); var Para = (ValueTuple<StorageFile, StorageFile, string, string, bool>)ob; MediaTranscoder Transcoder = new MediaTranscoder { HardwareAccelerationEnabled = true, VideoProcessingAlgorithm = Para.Item5 ? MediaVideoProcessingAlgorithm.Default : MediaVideoProcessingAlgorithm.MrfCrf444 }; try { MediaEncodingProfile Profile = null; VideoEncodingQuality VideoQuality = default; AudioEncodingQuality AudioQuality = default; switch (Para.Item4) { case "UHD2160p": VideoQuality = VideoEncodingQuality.Uhd2160p; break; case "QVGA": VideoQuality = VideoEncodingQuality.Qvga; break; case "HD1080p": VideoQuality = VideoEncodingQuality.HD1080p; break; case "HD720p": VideoQuality = VideoEncodingQuality.HD720p; break; case "WVGA": VideoQuality = VideoEncodingQuality.Wvga; break; case "VGA": VideoQuality = VideoEncodingQuality.Vga; break; case "High": AudioQuality = AudioEncodingQuality.High; break; case "Medium": AudioQuality = AudioEncodingQuality.Medium; break; case "Low": AudioQuality = AudioEncodingQuality.Low; break; } switch (Para.Item3) { case "MKV": Profile = MediaEncodingProfile.CreateHevc(VideoQuality); break; case "MP4": Profile = MediaEncodingProfile.CreateMp4(VideoQuality); break; case "WMV": Profile = MediaEncodingProfile.CreateWmv(VideoQuality); break; case "AVI": Profile = MediaEncodingProfile.CreateAvi(VideoQuality); break; case "MP3": Profile = MediaEncodingProfile.CreateMp3(AudioQuality); break; case "ALAC": Profile = MediaEncodingProfile.CreateAlac(AudioQuality); break; case "WMA": Profile = MediaEncodingProfile.CreateWma(AudioQuality); break; case "M4A": Profile = MediaEncodingProfile.CreateM4a(AudioQuality); break; } PrepareTranscodeResult Result = Transcoder.PrepareFileTranscodeAsync(Para.Item1, Para.Item2, Profile).AsTask().Result; if (Result.CanTranscode) { SendUpdatableToastWithProgressForTranscode(Para.Item1, Para.Item2); Progress<double> TranscodeProgress = new Progress<double>((CurrentValue) => { NotificationData Data = new NotificationData(); Data.SequenceNumber = 0; Data.Values["ProgressValue"] = (Math.Ceiling(CurrentValue) / 100).ToString(); Data.Values["ProgressValueString"] = Convert.ToInt32(CurrentValue) + "%"; ToastNotificationManager.CreateToastNotifier().Update(Data, "TranscodeNotification"); }); Result.TranscodeAsync().AsTask(AVTranscodeCancellation.Token, TranscodeProgress).Wait(); ApplicationData.Current.LocalSettings.Values["MediaTranscodeStatus"] = "Success"; } else { ApplicationData.Current.LocalSettings.Values["MediaTranscodeStatus"] = "NotSupport"; Para.Item2.DeleteAsync(StorageDeleteOption.PermanentDelete).AsTask().Wait(); } } catch (AggregateException) { ApplicationData.Current.LocalSettings.Values["MediaTranscodeStatus"] = "Cancel"; Para.Item2.DeleteAsync(StorageDeleteOption.PermanentDelete).AsTask().Wait(); } catch (Exception e) { ApplicationData.Current.LocalSettings.Values["MediaTranscodeStatus"] = e.Message; Para.Item2.DeleteAsync(StorageDeleteOption.PermanentDelete).AsTask().Wait(); } }, (SourceFile, DestinationFile, MediaTranscodeEncodingProfile, MediaTranscodeQuality, SpeedUp), CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Current).ContinueWith((task, ob) => { AVTranscodeCancellation.Dispose(); AVTranscodeCancellation = null; var Para = (ValueTuple<StorageFile, StorageFile>)ob; if (ApplicationData.Current.LocalSettings.Values["MediaTranscodeStatus"] is string ExcuteStatus) { CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { switch (ExcuteStatus) { case "Success": TabViewContainer.ThisPage.Notification.Show(Globalization.GetString("GeneralTransformer_Transcode_Success"), 5000); ShowTranscodeCompleteNotification(Para.Item1, Para.Item2); break; case "Cancel": TabViewContainer.ThisPage.Notification.Show(Globalization.GetString("GeneralTransformer_Transcode_Cancel"), 5000); ShowTranscodeCancelNotification(); break; case "NotSupport": TabViewContainer.ThisPage.Notification.Show(Globalization.GetString("GeneralTransformer_Transcode_NotSupport"), 5000); break; default: TabViewContainer.ThisPage.Notification.Show(Globalization.GetString("GeneralTransformer_Transcode_Failure") + ExcuteStatus, 5000); break; } }).AsTask().Wait(); } IsAnyTransformTaskRunning = false; }, (SourceFile, DestinationFile), TaskScheduler.Current); }
private async void QueueContentDialog_PrimaryButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs args) { var Deferral = args.GetDeferral(); if (UseSameProfile.IsChecked.GetValueOrDefault()) { MediaEncoding = await MediaEncodingProfile.CreateFromFileAsync(VideoFile); TrimmingPreference = MediaTrimmingPreference.Precise; ExportFileType = VideoFile.FileType; } else { VideoEncodingQuality Quality = default; switch (EncodingQuality.SelectedIndex) { case 0: { Quality = VideoEncodingQuality.Uhd2160p; break; } case 1: { Quality = VideoEncodingQuality.HD1080p; break; } case 2: { Quality = VideoEncodingQuality.HD720p; break; } case 3: { Quality = VideoEncodingQuality.Wvga; break; } } switch (EncodingProfile.SelectedIndex) { case 0: { MediaEncoding = MediaEncodingProfile.CreateMp4(Quality); ExportFileType = ".mp4"; break; } case 1: { MediaEncoding = MediaEncodingProfile.CreateWmv(Quality); ExportFileType = ".wmv"; break; } case 2: { MediaEncoding = MediaEncodingProfile.CreateHevc(Quality); ExportFileType = ".mkv"; break; } } if (TrimmingProfile.SelectedIndex == 0) { TrimmingPreference = MediaTrimmingPreference.Precise; } else { TrimmingPreference = MediaTrimmingPreference.Fast; } } PreviewSource?.Dispose(); MediaPlay.Source = null; Deferral.Complete(); }
/// <summary> /// 提供音视频转码 /// </summary> /// <param name="SourceFile">源文件</param> /// <param name="DestinationFile">目标文件</param> /// <param name="MediaTranscodeEncodingProfile">转码编码</param> /// <param name="MediaTranscodeQuality">转码质量</param> /// <param name="SpeedUp">是否启用硬件加速</param> /// <returns></returns> public static Task TranscodeFromAudioOrVideoAsync(StorageFile SourceFile, StorageFile DestinationFile, string MediaTranscodeEncodingProfile, string MediaTranscodeQuality, bool SpeedUp) { return(Task.Factory.StartNew((obj) => { if (obj is ValueTuple <StorageFile, StorageFile, string, string, bool> Para) { using (ExtendedExecutionController ExtExecution = ExtendedExecutionController.TryCreateExtendedExecution().Result) { IsAnyTransformTaskRunning = true; AVTranscodeCancellation = new CancellationTokenSource(); MediaTranscoder Transcoder = new MediaTranscoder { HardwareAccelerationEnabled = true, VideoProcessingAlgorithm = Para.Item5 ? MediaVideoProcessingAlgorithm.Default : MediaVideoProcessingAlgorithm.MrfCrf444 }; try { MediaEncodingProfile Profile = null; VideoEncodingQuality VideoQuality = default; AudioEncodingQuality AudioQuality = default; switch (Para.Item4) { case "UHD2160p": VideoQuality = VideoEncodingQuality.Uhd2160p; break; case "QVGA": VideoQuality = VideoEncodingQuality.Qvga; break; case "HD1080p": VideoQuality = VideoEncodingQuality.HD1080p; break; case "HD720p": VideoQuality = VideoEncodingQuality.HD720p; break; case "WVGA": VideoQuality = VideoEncodingQuality.Wvga; break; case "VGA": VideoQuality = VideoEncodingQuality.Vga; break; case "High": AudioQuality = AudioEncodingQuality.High; break; case "Medium": AudioQuality = AudioEncodingQuality.Medium; break; case "Low": AudioQuality = AudioEncodingQuality.Low; break; } switch (Para.Item3) { case "MKV": Profile = MediaEncodingProfile.CreateHevc(VideoQuality); break; case "MP4": Profile = MediaEncodingProfile.CreateMp4(VideoQuality); break; case "WMV": Profile = MediaEncodingProfile.CreateWmv(VideoQuality); break; case "AVI": Profile = MediaEncodingProfile.CreateAvi(VideoQuality); break; case "MP3": Profile = MediaEncodingProfile.CreateMp3(AudioQuality); break; case "ALAC": Profile = MediaEncodingProfile.CreateAlac(AudioQuality); break; case "WMA": Profile = MediaEncodingProfile.CreateWma(AudioQuality); break; case "M4A": Profile = MediaEncodingProfile.CreateM4a(AudioQuality); break; } PrepareTranscodeResult Result = Transcoder.PrepareFileTranscodeAsync(Para.Item1, Para.Item2, Profile).AsTask().Result; if (Result.CanTranscode) { SendUpdatableToastWithProgressForTranscode(Para.Item1, Para.Item2); Progress <double> TranscodeProgress = new Progress <double>((CurrentValue) => { try { NotificationData Data = new NotificationData { SequenceNumber = 0 }; Data.Values["ProgressValue"] = (Math.Ceiling(CurrentValue) / 100).ToString(); Data.Values["ProgressValueString"] = Convert.ToInt32(CurrentValue) + "%"; ToastNotificationManager.CreateToastNotifier().Update(Data, "TranscodeNotification"); } catch (Exception ex) { LogTracer.Log(ex, "Toast notification could not be sent"); } }); Result.TranscodeAsync().AsTask(AVTranscodeCancellation.Token, TranscodeProgress).Wait(); CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { ShowTranscodeCompleteNotification(Para.Item1, Para.Item2); }).AsTask().Wait(); } else { LogTracer.Log("Transcode format is not supported"); Para.Item2.DeleteAsync(StorageDeleteOption.PermanentDelete).AsTask().Wait(); } } catch (AggregateException) { Para.Item2.DeleteAsync(StorageDeleteOption.PermanentDelete).AsTask().Wait(); } catch (Exception ex) { LogTracer.Log(ex, "Transcode failed"); Para.Item2.DeleteAsync(StorageDeleteOption.PermanentDelete).AsTask().Wait(); } finally { AVTranscodeCancellation.Dispose(); AVTranscodeCancellation = null; IsAnyTransformTaskRunning = false; } } } }, (SourceFile, DestinationFile, MediaTranscodeEncodingProfile, MediaTranscodeQuality, SpeedUp), TaskCreationOptions.LongRunning)); }
private async Task TranscodeMediaAsync() { MediaVideoProcessingAlgorithm Algorithm = default; if (ApplicationData.Current.LocalSettings.Values["MediaTranscodeAlgorithm"] is string TranscodeAlgorithm) { if (TranscodeAlgorithm == "MrfCrf444") { Algorithm = MediaVideoProcessingAlgorithm.MrfCrf444; } else if (TranscodeAlgorithm == "Default") { Algorithm = MediaVideoProcessingAlgorithm.Default; } MediaTranscoder Transcoder = new MediaTranscoder { HardwareAccelerationEnabled = true, VideoProcessingAlgorithm = Algorithm }; if (ApplicationData.Current.LocalSettings.Values["MediaTranscodeInputFileToken"] is string InputFileToken && ApplicationData.Current.LocalSettings.Values["MediaTranscodeOutputFileToken"] is string OutputFileToken) { try { var FutureItemAccessList = StorageApplicationPermissions.FutureAccessList; InputFile = await FutureItemAccessList.GetFileAsync(InputFileToken); OutputFile = await FutureItemAccessList.GetFileAsync(OutputFileToken); if (ApplicationData.Current.LocalSettings.Values["MediaTranscodeEncodingProfile"] is string EncodingKind && ApplicationData.Current.LocalSettings.Values["MediaTranscodeQuality"] is string Quality) { MediaEncodingProfile Profile = null; VideoEncodingQuality VideoQuality = default; AudioEncodingQuality AudioQuality = default; switch (Quality) { case "UHD2160p": VideoQuality = VideoEncodingQuality.Uhd2160p; break; case "QVGA": VideoQuality = VideoEncodingQuality.Qvga; break; case "HD1080p": VideoQuality = VideoEncodingQuality.HD1080p; break; case "HD720p": VideoQuality = VideoEncodingQuality.HD720p; break; case "WVGA": VideoQuality = VideoEncodingQuality.Wvga; break; case "VGA": VideoQuality = VideoEncodingQuality.Vga; break; case "High": AudioQuality = AudioEncodingQuality.High; break; case "Medium": AudioQuality = AudioEncodingQuality.Medium; break; case "Low": AudioQuality = AudioEncodingQuality.Low; break; } switch (EncodingKind) { case "MKV": Profile = MediaEncodingProfile.CreateHevc(VideoQuality); break; case "MP4": Profile = MediaEncodingProfile.CreateMp4(VideoQuality); break; case "WMV": Profile = MediaEncodingProfile.CreateWmv(VideoQuality); break; case "AVI": Profile = MediaEncodingProfile.CreateAvi(VideoQuality); break; case "MP3": Profile = MediaEncodingProfile.CreateMp3(AudioQuality); break; case "ALAC": Profile = MediaEncodingProfile.CreateAlac(AudioQuality); break; case "WMA": Profile = MediaEncodingProfile.CreateWma(AudioQuality); break; case "M4A": Profile = MediaEncodingProfile.CreateM4a(AudioQuality); break; } PrepareTranscodeResult Result = await Transcoder.PrepareFileTranscodeAsync(InputFile, OutputFile, Profile); if (Result.CanTranscode) { SendUpdatableToastWithProgress(); Progress <double> TranscodeProgress = new Progress <double>(ProgressHandler); await Result.TranscodeAsync().AsTask(Cancellation.Token, TranscodeProgress); ApplicationData.Current.LocalSettings.Values["MediaTranscodeStatus"] = "Success"; } else { ApplicationData.Current.LocalSettings.Values["MediaTranscodeStatus"] = "转码格式不支持"; await OutputFile.DeleteAsync(StorageDeleteOption.PermanentDelete); } } else { ApplicationData.Current.LocalSettings.Values["MediaTranscodeStatus"] = "SettingError: Miss MediaTranscodeEncodingProfile Or MediaTranscodeQuality"; await OutputFile.DeleteAsync(StorageDeleteOption.PermanentDelete); } }
private async void ContentDialog_PrimaryButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs args) { var Deferral = args.GetDeferral(); if (MergeFile == null) { EmptyTip.IsOpen = true; args.Cancel = true; Deferral.Complete(); return; } VideoEncodingQuality Quality = default; switch (EncodingQuality.SelectedIndex) { case 0: { Quality = VideoEncodingQuality.Uhd2160p; break; } case 1: { Quality = VideoEncodingQuality.HD1080p; break; } case 2: { Quality = VideoEncodingQuality.HD720p; break; } case 3: { Quality = VideoEncodingQuality.Wvga; break; } } switch (EncodingProfile.SelectedIndex) { case 0: { MediaEncoding = MediaEncodingProfile.CreateMp4(Quality); ExportFileType = ".mp4"; break; } case 1: { MediaEncoding = MediaEncodingProfile.CreateWmv(Quality); ExportFileType = ".wmv"; break; } case 2: { MediaEncoding = MediaEncodingProfile.CreateHevc(Quality); ExportFileType = ".mkv"; break; } } MediaClip SourceVideoClip = await MediaClip.CreateFromFileAsync(SourceFile); MediaClip MergeVideoClip = await MediaClip.CreateFromFileAsync(MergeFile); Composition = new MediaComposition(); Composition.Clips.Add(SourceVideoClip); Composition.Clips.Add(MergeVideoClip); Deferral.Complete(); }