2013-05-23 3 views
0

Я пытаюсь реализовать аудиозапись с использованием NAudio в Wav-файле, но по умолчанию битрейт, заданный классом WasapiLoopbackCapture, не может быть изменен программно.NAudio - Изменение битрейта записанного WAV-файла

Я записываю аудиовыход в MemoryStream (записанный в потоке фрагмент ниже). Однако битрейт по умолчанию, установленный WasapiLoobpackCapture, не соответствует моим потребностям.

Я хотел бы иметь битрейт 320KBPS, и я попытался преобразовать записанный файл программно, используя класс WaveFormatConversionStream, но я не мог заставить его работать.

WaveFormat targetFormat = WaveFormat.CreateCustomFormat(waveIn.WaveFormat.Encoding, 
                   waveIn.WaveFormat.SampleRate, //SampleRate 
                   waveIn.WaveFormat.Channels,  //Channels 
                   320000, //Average Bytes per Second 
                   waveIn.WaveFormat.BlockAlign,  //Block Align 
                   waveIn.WaveFormat.BitsPerSample); //Bits per Sample 


     using (WaveStream inputStream = new RawSourceWaveStream(recordedStream, waveIn.WaveFormat)) 
     { 
      try 
      { 
       using (var converter = new WaveFormatConversionStream(targetFormat, inputStream)) 
       { 
        // ... 
       } 
      } 
      catch (Exception) 
      { 
       throw; 
      } 

      recordedStream.Dispose(); 
     } 

Я всегда получаю исключение преобразования «AcmNotPossible call acmStreamOpen». Как вы видите, я использую точно такой же формат, как записанный WAV-файл (Extension encoding, 44100 и т. Д.), За исключением битрейта, который ниже в целевом формате.

Каким будет правильное кодирование преобразования битрейта из файла Wav, содержащегося в MemoryStream? моя цель - получить файл 320KBPS.

ответ

1

Для данной частоты дискретизации, битовой глубины и количества каналов звук PCM всегда имеет тот же бит (рассчитанный путем умножения этих трех значений вместе). Если вы хотите уменьшить битрейт, вы должны изменить один из этих трех (снижение частоты дискретизации, вероятно, является лучшим вариантом, если вы не можете перейти от стерео к моно).

Действительно, вы должны думать о кодировании в формате MP3, WMA или AAC, что позволит вам выбрать предпочтительный биттрейт.

+0

Я заметил, что количество каналов в audioClient.MixFormat равно 4, глубина бит 32, а частота дискретизации - 44100 ... можете ли вы показать код, который позволит изменить глубину бит до 16 и количество каналов до 2? –

+1

4-канальный звук довольно необычен. Вы либо выбросите два канала, если они не нужны, либо смешайте их в один из левого или правого канала. Я написал [статью] (http://www.codeproject.com/Articles/501521/How-to-convert-between-most-audio-formats-in-NET), в которой объясняется, как вы можете изменить глубину и количество каналов более подробно. –

+0

Я попытался отбросить два канала, используя код, аналогичный функции StereoToMono, но я не смог получить хороший аудиовыход. Можете ли вы показать фрагмент кода, который на самом деле будет работать с 4 до 2 каналов? –

Смежные вопросы