MP3 ⇔ WAV

MP3 と WAVE を相互に変換します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. 2018/06/22 以降のアプリは Windows10 & Visual Studio Enterprise 2017 の環境で開発します。
    Windows10 ストア・アプリを使うと MP3 と WAVE を相互に変換するのは簡単です。
    MediaEncodingProfile で WAVE(MP3) のプロファイルを設定します。
    MediaTranscoder を設定して、PrepareFileTranscodeAsync() を呼び出すと変換が行われます。
    source が元の File の StorageFolder で、destination が 返還後の File の StorageFolder です。
    using Windows.Storage;
    using Windows.Media.MediaProperties;
    using Windows.Media.Transcoding;
    
        MediaEncodingProfile profile =
            MediaEncodingProfile.CreateWav(AudioEncodingQuality.Medium);
        MediaTranscoder transcoder = new MediaTranscoder();
        PrepareTranscodeResult prepareOp = await
            transcoder.PrepareFileTranscodeAsync(source, destination, profile);
        if (prepareOp.CanTranscode)
        {
            var transcodeOp = prepareOp.TranscodeAsync();
        }
    
  2. MP3 と WAVE を相互に変換するのは簡単なのですが、StorageFolder に File を設定するのが一苦労です。
    今回は、ファイルピッカーを使って source と destination にファイル名を設定します。
    ファイルピッカーの基本は Image Picker を参照して下さい。
  3. MP3⇔WAVE の相互変換プロジェクトを構築します。
    [Visual C#][Windows][空白アプリ(ユニバーサル Windows)]を選びます。
    MP3_WAV の名前で新規プロジェクトを作成します。
  4. MainPage.xaml のデザイナを表示して、ツールボックスから二個のボタンを張り付けます。
    MP3 を入力して WAVE に変換するボタンと、WAVE を入力して MP3 に変換するボタンです。
    ボタンクリックにイベントハンドラ(button1_Click, button2_Click) を設定します。
    TEXT BOX を張り付けて、ここに進行状況を表示します。
  5. MainPage.xaml.cs のソースコードです。
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Runtime.InteropServices.WindowsRuntime;
    using Windows.Foundation;
    using Windows.Foundation.Collections;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Controls.Primitives;
    using Windows.UI.Xaml.Data;
    using Windows.UI.Xaml.Input;
    using Windows.UI.Xaml.Media;
    using Windows.UI.Xaml.Navigation;
    using Windows.Storage;
    using Windows.Media.MediaProperties;
    using Windows.Media.Transcoding;
    
    // 空白ページの項目テンプレートについては、https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x411 を参照してください
    
    namespace MP3_WAV
    {
        /// <summary>
        /// それ自体で使用できる空白ページまたはフレーム内に移動できる空白ページ。
        /// </summary>
        public sealed partial class MainPage : Page
        {
            public MainPage()
            {
                this.InitializeComponent();
            }
    
            async private void button1_Click(object sender, RoutedEventArgs e)
            {
                var openPicker = new Windows.Storage.Pickers.FileOpenPicker();
                openPicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.VideosLibrary;
                openPicker.FileTypeFilter.Add(".mp3");
                StorageFile source = await openPicker.PickSingleFileAsync();
    
                var savePicker = new Windows.Storage.Pickers.FileSavePicker();
                savePicker.SuggestedStartLocation =
                    Windows.Storage.Pickers.PickerLocationId.VideosLibrary;
                savePicker.DefaultFileExtension = ".wav";
                savePicker.SuggestedFileName = "NewWave";
                savePicker.FileTypeChoices.Add("WAVE", new string[] { ".wav" });
                StorageFile destination = await savePicker.PickSaveFileAsync();
    
                textBox1.Text = "Start Convert";
                MediaEncodingProfile profile =
                    MediaEncodingProfile.CreateWav(AudioEncodingQuality.Medium);
                MediaTranscoder transcoder = new MediaTranscoder();
                PrepareTranscodeResult prepareOp = await
                    transcoder.PrepareFileTranscodeAsync(source, destination, profile);
                if (prepareOp.CanTranscode)
                {
                    var transcodeOp = prepareOp.TranscodeAsync();
                    transcodeOp.Progress +=
                        new AsyncActionProgressHandler<double>(TranscodeProgress);
                    transcodeOp.Completed +=
                        new AsyncActionWithProgressCompletedHandler<double>(TranscodeComplete);
                }
                else
                {
                    switch (prepareOp.FailureReason)
                    {
                        case TranscodeFailureReason.CodecNotFound:
                            System.Diagnostics.Debug.WriteLine("Codec not found.");
                            break;
                        case TranscodeFailureReason.InvalidProfile:
                            System.Diagnostics.Debug.WriteLine("Invalid profile.");
                            break;
                        default:
                            System.Diagnostics.Debug.WriteLine("Unknown failure.");
                            break;
                    }
                }
                textBox1.Text = "Complete";
            }
    
            async private void button2_Click(object sender, RoutedEventArgs e)
            {
                var openPicker = new Windows.Storage.Pickers.FileOpenPicker();
                openPicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.VideosLibrary;
                openPicker.FileTypeFilter.Add(".wav");
                StorageFile source = await openPicker.PickSingleFileAsync();
    
                var savePicker = new Windows.Storage.Pickers.FileSavePicker();
                savePicker.SuggestedStartLocation =
                    Windows.Storage.Pickers.PickerLocationId.VideosLibrary;
                savePicker.DefaultFileExtension = ".mp3";
                savePicker.SuggestedFileName = "NewWave";
                savePicker.FileTypeChoices.Add("MP3", new string[] { ".mp3" });
                StorageFile destination = await savePicker.PickSaveFileAsync();
    
                textBox1.Text = "Start Convert";
                MediaEncodingProfile profile =
                    MediaEncodingProfile.CreateMp3(AudioEncodingQuality.Medium);
                MediaTranscoder transcoder = new MediaTranscoder();
                PrepareTranscodeResult prepareOp = await
                    transcoder.PrepareFileTranscodeAsync(source, destination, profile);
                if (prepareOp.CanTranscode)
                {
                    var transcodeOp = prepareOp.TranscodeAsync();
                    transcodeOp.Progress +=
                        new AsyncActionProgressHandler<double>(TranscodeProgress);
                    transcodeOp.Completed +=
                        new AsyncActionWithProgressCompletedHandler<double>(TranscodeComplete);
                }
                else
                {
                    switch (prepareOp.FailureReason)
                    {
                        case TranscodeFailureReason.CodecNotFound:
                            System.Diagnostics.Debug.WriteLine("Codec not found.");
                            break;
                        case TranscodeFailureReason.InvalidProfile:
                            System.Diagnostics.Debug.WriteLine("Invalid profile.");
                            break;
                        default:
                            System.Diagnostics.Debug.WriteLine("Unknown failure.");
                            break;
                    }
                }
                textBox1.Text = "Complete";
            }
            void TranscodeProgress(IAsyncActionWithProgress<double> asyncInfo, double percent)
            {
                // Display or handle progress info.
            }
    
            void TranscodeComplete(IAsyncActionWithProgress<double> asyncInfo, AsyncStatus status)
            {
                asyncInfo.GetResults();
                if (asyncInfo.Status == AsyncStatus.Completed)
                {
                    // Display or handle complete info.
                }
                else if (asyncInfo.Status == AsyncStatus.Canceled)
                {
                    // Display or handle cancel info.
                }
                else
                {
                    // Display or handle error info.
                }
            }
        }
    }
    
  6. button1_Click() は MP3 から WAVE への変換です。
    openPicker で MP3 を選択して、savePicker で保存する WAVE の名前を設定します。
    MediaEncodingProfile で WAVE のプロファイルを設定します。
  7. button2_Click() は WAVE から MP3 への変換です。
    openPicker で WAVE を選択して、savePicker で保存する MP3 の名前を設定します。
    MediaEncodingProfile で MP3 のプロファイルを設定します。
  8. prepareOp.CanTranscode でプロファイルの結果を取得して、正常に実行されたとき Progress と Completed のイベントを設定します。
    失敗したとき、その原因を Debug.WriteLine で印字します。
        if (prepareOp.CanTranscode)
        {
            var transcodeOp = prepareOp.TranscodeAsync();
            transcodeOp.Progress +=
                new AsyncActionProgressHandler<double>(TranscodeProgress);
            transcodeOp.Completed +=
                new AsyncActionWithProgressCompletedHandler<double>(TranscodeComplete);
        }
        else
        {
            switch (prepareOp.FailureReason)
            {
                case TranscodeFailureReason.CodecNotFound:
                    System.Diagnostics.Debug.WriteLine("Codec not found.");
                    break;
                case TranscodeFailureReason.InvalidProfile:
                    System.Diagnostics.Debug.WriteLine("Invalid profile.");
                    break;
                default:
                    System.Diagnostics.Debug.WriteLine("Unknown failure.");
                    break;
            }
        }
    
  9. プロジェクトをコンパイル&実行して下さい。
    ボタンのクリックで MP3 と WAVE を相互に変換します。
    確認が終われば「スタート」ボタンをクリックして MP3_WAV をアンインストールして下さい。

MP4 → WAV

  1. PrepareFileTranscodeAsync() は優れものです。
    button1_Click() は本来 MP3 から WAVE への変換です。
    所が button1_Click で MP4(動画ファイル)を選択すると WAVE(音声)に変換してくれました。
  2. button1_Click() の openPicker で MP3 に加えて MP4 を選択出来るようにします。
        var openPicker = new Windows.Storage.Pickers.FileOpenPicker();
        openPicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.VideosLibrary;
        openPicker.FileTypeFilter.Add(".mp3");
        openPicker.FileTypeFilter.Add(".mp4");
        StorageFile source = await openPicker.PickSingleFileAsync();
    
  3. これでボタン1をクリックすると MP3 に加えて MP4 が選択出来るようになります。
    MP4 を選択すると、動画ファイルから音声だけを分離して WAVE FILE を作成してくれます。
  4. MediaEncodingProfile で設定することが出来る形式は以下のとおりです。
    CreateAlac  Apple Lossless Audio Codec (ALAC) オーディオ
    CreateFlac  Free Lossless Audio Codec (FLAC) オーディオ
    CreateM4a   AAC オーディオ (M4A)
    CreateMp3   MP3 オーディオ
    CreateWav   WAV オーディオ
    CreateWmv   Windows Media Audio (WMA)
    
    CreateAvi   AVI
    CreateHevc  High Efficiency Video Coding (HEVC) ビデオ、H.265 ビデオとも呼ばれます
    CreateMp4   MP4 ビデオ (H.264 ビデオと AAC オーディオ)
    CreateWmv   Windows Media Video (WMV)
    
    詳細は メディア ファイルのトランスコードAV を参照して下さい。

[Previous Chapter ↑] MP3 → WAV

超初心者のプログラム入門(C# Frame Work)

プロジェクトは "C:\DATA\C#\Store\StoreApp\MP3_WAV\Win10.mem" を参照