2014-02-15 5 views
0

Я использую NAudio за последние несколько дней смешивания двух звуковых файлов в этом формате:смешивания WaveStream с NAudio

SAMPLERATE: 8000 BitsPerSample: 8 Каналы: 1 Block Align Каналы: 1 Биты в Второй: 8000

как я нашел из https://naudio.codeplex.com/discussions/251475, сначала я должен преобразовать их в 32-битное кодирование ieeefloatingpoint, а затем добавить преобразованные потоки в WaveMixerStream32. после этого я должен преобразовать смешанные данные в поток 16 бит/образец с использованием Wave32To16Stream, преобразовать полученный поток в моно и, наконец, преобразовать моно 16 бит/образец в моно 8 бит/образец.

Я написал эти строки кода в соответствии с тем, что я объясняю:

WaveFileReader r1 = new WaveFileReader(...); 
    WaveFileReader r2 = new WaveFileReader(...); 

    WaveFormat OutputWaveFormat = WaveFormat.CreateCustomFormat(WaveFormatEncoding.Pcm, 8000, 1, 16000, 2, 16); 
    WaveFormat InputWaveFormat = WaveFormat.CreateALawFormat(8000, 1); 

    WaveFormatConversionStream ConversionStream1 = new WaveFormatConversionStream(OutputWaveFormat, r1); 
    WaveFormatConversionStream ConversionStream2 = new WaveFormatConversionStream(OutputWaveFormat, r2); 

    WaveChannel32 WaveChannel32_1 = new WaveChannel32(ConversionStream1); 
    WaveChannel32 WaveChannel32_2 = new WaveChannel32(ConversionStream2); 

    WaveMixerStream32 mixer32 = new WaveMixerStream32(); 
    mixer32.AddInputStream(WaveChannel32_1); 

    mixer32.AddInputStream(WaveChannel32_2);//(*) 

    Wave32To16Stream stereo16 = new Wave32To16Stream(mixer32); 
    StereoToMonoProvider16 mono16 = new StereoToMonoProvider16(m_Wave32To16Stream); 

после строки (*) У меня есть поток такой: 0 0 32 60 0 0 32 60 0 0 59 126 0 0 59 126 ... , но после применения Wave32To16Stream у меня есть последовательность только нулей в stereo16 и так в mono16 !! Что делать на этом шаге?

ответ

0

Ответ был очень прост, чем я думаю. Мне просто нужно преобразовать ALaw в PCM, а затем добавить два волновых потока, я сделал это, используя ALawDecoder из статьи кодека G711.

r1 = new WaveFileReader(...); 
r2 = new WaveFileReader(...); 
r1.Read(arr1, 0, arr1.Length);  
r2.Read(arr2, 0, arr2.Length); 
short[] firstPCM16 = ALawDecoder.ALawDecode(arr1); 
short[] secondPCM16 = ALawDecoder.ALawDecode(arr2); 
byte[] result1 = new byte[firstPCM16.Length * sizeof(short)]; 
byte[] result1 = new byte[secondPCM16.Length * sizeof(short)]; 
Buffer.BlockCopy(firstPCM16, 0, result1, 0, result1.Length); 
Buffer.BlockCopy(secondPCM16, 0, result2, 0, result2.Length); 
for (...) 
{       
    mixed[i] = (byte)(result1[i] + result2[i]);//No need to dividing by 2 because r1 and r2 are 8 bit ALaw and return value of ALawDecoder is 16 bit pcm 
} 

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

  • Нет связанных вопросов^_^