/// <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);
        }
Exemple #2
0
        private async Task Text2Audio(string text, StorageFile audio)
        {
            if (audio != null && !string.IsNullOrEmpty(text))
            {
                if (synth == null)
                {
                    synth = new SpeechSynthesizer();
                }
                var voice = SpeechSynthesizer.AllVoices.Where(o => o.DisplayName == (string)cbVoice.SelectedItem);
                synth.Voice = voice.First();
                synth.Options.AudioPitch   = sliderPitch.Value;
                synth.Options.AudioVolume  = sliderVolume.Value / 100.0;
                synth.Options.SpeakingRate = sliderSpeed.Value;
                //var options = new SpeechSynthesizerOptions();

                SpeechSynthesisStream stream = await synth.SynthesizeTextToStreamAsync(text);

                trans = new MediaTranscoder()
                {
                    HardwareAccelerationEnabled = true,
                    AlwaysReencode = true,
                    //VideoProcessingAlgorithm = MediaVideoProcessingAlgorithm.MrfCrf444;
                };

                MediaEncodingProfile profile = MediaEncodingProfile.CreateMp3(AudioEncodingQuality.Medium);
                if (audio.ContentType.EndsWith("wav", StringComparison.CurrentCultureIgnoreCase))
                {
                    profile = MediaEncodingProfile.CreateWav(AudioEncodingQuality.Medium);
                }
                else if (audio.ContentType.EndsWith("aac", StringComparison.CurrentCultureIgnoreCase))
                {
                    profile = MediaEncodingProfile.CreateM4a(AudioEncodingQuality.Medium);
                }
                else if (audio.ContentType.EndsWith("m4a", StringComparison.CurrentCultureIgnoreCase))
                {
                    profile = MediaEncodingProfile.CreateM4a(AudioEncodingQuality.Medium);
                }
                else if (audio.FileType.EndsWith("alac", StringComparison.CurrentCultureIgnoreCase))
                {
                    profile = MediaEncodingProfile.CreateAlac(AudioEncodingQuality.Medium);
                }
                else if (audio.ContentType.EndsWith("flac", StringComparison.CurrentCultureIgnoreCase))
                {
                    profile = MediaEncodingProfile.CreateFlac(AudioEncodingQuality.Medium);
                }
                else if (audio.ContentType.EndsWith("mp4", StringComparison.CurrentCultureIgnoreCase))
                {
                    profile = MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Pal);
                }

                using (IRandomAccessStream fso = await audio.OpenAsync(FileAccessMode.ReadWrite))
                {
                    //var trans_result = await trans.PrepareFileTranscodeAsync(InFile, OutFile, profile_mp3);
                    var trans_result = await trans.PrepareStreamTranscodeAsync(stream, fso, profile);

                    if (trans_result.CanTranscode)
                    {
                        if (canceltsrc != null)
                        {
                            canceltsrc.Dispose();
                            canceltsrc = null;
                        }
                        canceltsrc = new CancellationTokenSource();
                        var progress = new Progress <double>(ps =>
                        {
                            edHearState.Text = $"{AppResources.GetString("ProcessingState")} {ps:N0}%";
                            //edHearState.Text = AppResources.GetString("ProcessingState");
                        });
                        await trans_result.TranscodeAsync().AsTask(canceltsrc.Token, progress);

                        edHearState.Text = AppResources.GetString("ProcessFinished");
                    }
                    else
                    {
                        edHearState.Text = AppResources.GetString("CanNotTrans");
                    }
                }
            }
        }
Exemple #3
0
        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);
                        }
                    }
        /// <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));
        }
Exemple #5
0
        private async Task Covert_music(string audio, string type)
        {
            using (SQLiteConnection db = new SQLiteConnection(App.DB_PATH))
            {
                MediaEncodingProfile profile = new MediaEncodingProfile();
                if (type == ".mp3")
                {
                    var Quality = Load_options(Json.Json_mp3);
                    profile = MediaEncodingProfile.CreateMp3(Quality);
                }
                else if (type == ".alac")
                {
                    var Quality = Load_options(Json.Json_alac);
                    profile = MediaEncodingProfile.CreateAlac(Quality);
                    type    = ".m4a";
                }
                else if (type == ".flac")
                {
                    var Quality = Load_options(Json.Json_flac);
                    profile = MediaEncodingProfile.CreateFlac(Quality);
                }
                else if (type == ".aac")
                {
                    var Quality = Load_options(Json.Json_aac);
                    profile = MediaEncodingProfile.CreateM4a(Quality);
                    type    = ".m4a";
                }
                convert_type = type.Substring(1);
                var songs = db.Query <Song>("Select * from Song");
                foreach (var song in songs)
                {
                    var    format      = db.Find <MusicFormat>(c => c.Id == song.FormatId);
                    var    import_name = song.Path + song.NameSong + "." + format.NameFormat;
                    string new_name    = song.Path + song.NameSong + type;

                    Main_folder = await Windows.Storage.AccessCache.StorageApplicationPermissions
                                  .FutureAccessList.GetFolderAsync("Audio");

                    StorageFile oldfile = await Main_folder.GetFileAsync(import_name);

                    MusicProperties musicProperties = await oldfile.Properties.GetMusicPropertiesAsync();

                    if (oldfile.FileType != ".mp3" && oldfile.FileType != type &&
                        musicProperties.Bitrate > 500000)
                    {
                        StorageFile newfile = await Main_folder.CreateFileAsync(new_name, CreationCollisionOption.ReplaceExisting);

                        if (oldfile != null && newfile != null)
                        {
                            try
                            {
                                current_song = song;
                                all_convert_song++;
                                SongDeleteAfterConvert.Add(current_song);
                                MediaTranscoder        transcoder = new MediaTranscoder();
                                PrepareTranscodeResult prepareOp  = await transcoder.PrepareFileTranscodeAsync(oldfile, newfile, profile);

                                if (prepareOp.CanTranscode)
                                {
                                    var transcodeOp = prepareOp.TranscodeAsync();
                                    transcodeOp.Completed += async(IAsyncActionWithProgress <double> asyncInfo, AsyncStatus status) =>
                                    {
                                        asyncInfo.GetResults();
                                        await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                                        {
                                            current_convert_song++;
                                        });
                                    };
                                }
                            }
                            catch (Exception exc)
                            {
                                var dialog = new MessageDialog(exc.ToString());
                                await dialog.ShowAsync();
                            }
                        }
                    }
                }
                do
                {
                    await Task.Delay(TimeSpan.FromSeconds(3));
                }while (all_convert_song != current_convert_song);
                Delete_oldfile();
            }
        }