Проблема / ошибка при преобразовании аудиофайла M4A в MP3 с помощью NAudio в C# - PullRequest
0 голосов
/ 02 августа 2020

Я создаю демонстрацию программы для преобразования звука, которую создаю для себя. Я хотел преобразовать аудиофайл M4A (MPEG-4) в MP3, используя простой GUI для взаимодействия пользователя. Я также реализовал функцию, которая позволяет пользователю воспроизводить выбранный аудиофайл (M4A) перед преобразованием, о чем я узнал, просмотрев видеоуроки NAudio. Однако я застрял с конкретной проблемой c, которая мешает мне продолжить этот демонстрационный проект.

Я получил сообщение об ошибке сразу после выбора SaveFileDialogue для размещения преобразованного файла (MP3), что не позволяет мне продолжить процесс. (Я поместил сообщение об ошибке в комментарии, чтобы вы могли видеть его в методе btnConvertToMp3_Click ()).

Я попытался использовать MediaFoundationEncoder.EncodeToMp3 () для решения этого случая. К сожалению, я получаю сообщение об ошибке, в котором говорится, что «Нет доступных кодировщиков MP3», которые, как я выяснил, не поддерживаются полностью, чтобы их можно было функционально использовать для всех аудиоформатов.

Я попытался найти другие решения , близко к этой проблеме, но, к сожалению, не смог найти то, на что я надеялся, поэтому решил спросить, есть ли у вас какие-либо данные об этой проблеме.

Вот мой текущий код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NAudio.Wave;
using NAudio;
using NAudio.Lame;
using NAudio.Dmo;
using System.Windows.Forms;

namespace M4AtoMP3ConversionDEMO
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private NAudio.Wave.BlockAlignReductionStream stream = null;
        private NAudio.Wave.DirectSoundOut output = null;

        public void btnOpenM4AFile_Click(object sender, EventArgs e)
        {
            OpenFileDialog open = new OpenFileDialog();
            open.Filter = "M4A Audio File (*.m4a)|*.m4a;";

            if (open.ShowDialog() != DialogResult.OK)
            {
                return;
            }

            MediaFoundationReader mfM4A = new MediaFoundationReader(open.FileName);
            stream = new NAudio.Wave.BlockAlignReductionStream(mfM4A);

            btnPlayPauseButton.Enabled = true;
            btnConvertToMP3.Visible = true;

            output = new NAudio.Wave.DirectSoundOut();
            output.Init(mfM4A);
            output.Play();

            MessageBox.Show(".M4A Format has been accepted", ".M4A Audio Format", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void btnConvertToMP3_Click(object sender, EventArgs e)
        {
            DialogResult mb1 = MessageBox.Show("Are you sure you want to convert this M4A File?", "Converting to MP3", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
            switch (mb1)
            {
                case DialogResult.Yes:
                    SaveFileDialog save = new SaveFileDialog();
                    save.Filter = "MP3 File (*.mp3)|*.mp3";
                    if (save.ShowDialog() != DialogResult.OK) return;

                    // Unable to cast COM object of type 'System.__ComObject' to interface type 'NAudio.MediaFoundation.IMFSourceReader'.
                    // This operation failed because the QueryInterface call on the COM component for the interface with IID '{70AE66F2-C809-4E4F-8915-BDCB406B7993}' failed due to the following error:
                    // No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE))

                    using (var mp3FileReader = new LameMP3FileWriter(save.FileName, stream.WaveFormat, LAMEPreset.ABR_320))
                    {
                        stream.CopyTo(mp3FileReader);
                    }

                    break;

                case DialogResult.No:
                    break;
            }
        }

        private void btnPlayPauseButton_Click(object sender, EventArgs e)
        {
            if (output != null)
            {
                if (output.PlaybackState == NAudio.Wave.PlaybackState.Playing)
                {
                    output.Pause();

                    Image playButton = new Bitmap(@"C:\Users\CeX\source\repos\AudioConverterUI-WorkInProgress\AudioConverterUI-WorkInProgress\Resources\play-button-size.png");
                    btnPlayPauseButton.Image = playButton;
                }

                else if (output.PlaybackState == NAudio.Wave.PlaybackState.Paused)
                {
                    output.Play();

                    Image pauseButton = new Bitmap(@"C:\Users\CeX\source\repos\AudioConverterUI-WorkInProgress\AudioConverterUI-WorkInProgress\Resources\pause-button-size.png");
                    btnPlayPauseButton.Image = pauseButton;
                }
            }
        }

        private void DisposeWave()
        {
            if (output != null)
            {
                if (output.PlaybackState == NAudio.Wave.PlaybackState.Playing)
                {
                    output.Stop();
                    output.Dispose();
                    output = null;
                }

                if (stream != null)
                {
                    stream.Dispose();
                    stream = null;
                }
            }
        }
    }
}

Если для этой ошибки нет подходящего решения, есть ли возможное альтернативное или простое решение, которое позволило бы мне преобразовать M4A в MP3 без использования NAudio, даже с GUI?

1 Ответ

0 голосов
/ 17 августа 2020

Простой подход без использования NAudio (который использует кодеки Windows) - использовать FFMPEG и выполнить преобразование командной строки .

...