2016-11-10 8 views
2

В моем приложении у меня есть аудиоформаты в формате .wav, здесь я проверяю битовые скорости аудиофайлов, используя . Нуль dll, если скорость передачи ниже 128 кбит/с, тогда я хочу изменить его на выше 128kpbs, так что я написал ниже код для проверки битовой скорости, если он меньше 128 Кбит/с, тогда он конвертируется в выше 128 Кбит/с.Как изменить формат бита аудиофайла в формате .wav

int bitrate; 
using (var reader = new WaveFileReader(textBox1.Text)) 
{ 
    bitrate = reader.WaveFormat.AverageBytesPerSecond * 8; 
    reader.Dispose(); 
} 

if (bitrate < 128000) 
{ 
    using (var reader = new WaveFileReader(textBox1.Text)) 
    { 
    var newFormat = new WaveFormat(8000, 16, 1); 
     using (var conversionStream = new WaveFormatConversionStream(newFormat, reader)) 
     { 
      WaveFileWriter.CreateWaveFile(@"C:\Docs\Files\", conversionStream); 
     } 
    } 
} 

Для некоторых файлов она работает нормально, но для некоторых файлов я получаю ниже ошибки,

Необработанное исключение типа «NAudio.MmException» произошло в NAudio.dll Дополнительная информация: AcmNotPossible вызов acmStreamOpen

У меня есть ошибка. Ошибка Error Snap Здесь, как я могу перенести эту проблему?

ответ

0

Предлагаю вам взглянуть на FFmpeg. Это то, что я использую для всех задач преобразования аудио/видео.

Это инструмент командной строки, который может конвертировать из почти ничего в что угодно, с множеством опций. Для того, чтобы делать то, что вы хотите, вы, вероятно, нужно запустить что-то вроде:

$ ffmpeg -i input.wav -ab 128 output.wav 

В строке выше, мы преобразуем файл в 128 битрейтом.

Самый простой способ использовать это в коде, чтобы включить исполняемый FFmpeg в проекте (или установить глобально как переменная окружения) и вызывать его непосредственно с чем-то вроде:

Process process = new Process(); 
process.StartInfo.RedirectStandardOutput = true; 
process.StartInfo.RedirectStandardError = true; 
process.StartInfo.FileName = "ffmpeg"; 

process.StartInfo.Arguments = $"-i \"{originalFile}\" -ab 128 \"{outputPath}\""; 

process.StartInfo.UseShellExecute = false; 
process.StartInfo.CreateNoWindow = false; 
process.Start(); 
process.WaitForExit(); 

Есть более изящные решения - обертки вокруг FFmpeg - но это должно сделать трюк.

+1

Привет @ stoyan-berov, ffmpeg выглядит потрясающе, но он не подходит для requirment, здесь у нас есть веб-приложение, поэтому я хочу преобразовать его только с помощью программно. Спасибо, Стоян-боров. –

+0

Эй, я последний раз использовал FFmpeg именно для веб-приложения - проекта .NET MVC. С помощью кода выше (или аналогичного) вы выполняете преобразование программно только. Пользователи не видят консолей. –

+0

ok @ stoyan-berov. .я попробую. –

0

WaveFormatConversionStream ищет ACM-кодек, который может выполнять запрошенное преобразование. Не все преобразования возможны. Например, вы не можете обычно изменять частоту дискретизации, глубину бит и количество каналов за один раз. Таким образом, возможные преобразования зависят от точного WaveFormat входящего звука. Возможно, вам придется сменить один шаг и перейти от стерео к моно в другом. MediaFoundationResampler более гибкий и может сделать это за один шаг.