Как воспроизвести извлеченный массив байтов волнового файла в C #? - PullRequest
3 голосов
/ 04 февраля 2010

На данный момент мне удалось разделить левый и правый канал файла WAVE и включить заголовок в массив byte []. Следующим моим шагом будет воспроизведение обоих каналов. Как это может быть сделано?

Вот фрагмент кода:

byte[] song_left = new byte[fa.Length];
byte[] song_right = new byte[fa.Length];

int p = 0;

for (int c = 0; c < 43; c++)
{
    song_left[p] = header[c];
    p++;
}

int q = 0;

for (s = startByte; s < length; s = s + 3)
{
    song_left[s] = sLeft[q];
    q++;
    s++;
    song_left[s] = sLeft[q];
    q++;
}

p = 0;

for (int c = 0; c < 43; c++)
{
    song_right[p] = header[c];
    p++;
}

Эта часть считывает заголовок и данные как из правого, так и из светлого канала и сохраняет их в массивах sLeft [] и sRight []. Эта часть работает отлично.

Получив байтовые массивы, я сделал следующее:

System.IO.File.WriteAllBytes("c:\\left.wav", song_left);

System.IO.File.WriteAllBytes("c:\\right.wav", song_right);

Добавлена ​​кнопка для воспроизведения сохраненного волнового файла:

private void button2_Click(object sender, EventArgs e)
{
    spWave = new SoundPlayer("c:\\left.wav");
    spWave.Play();          
}

Когда я нажимаю кнопку воспроизведения, появляется эта ошибка:

Необработанное исключение типа 'System.InvalidOperationException' произошло в System.dll

Дополнительная информация: заголовок волны поврежден.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 25 марта 2010

Для «разделения левого и правого канала файла WAVE» используйте метод AudioCompressionManager.SplitStereo из http://alvas.net/alvas.audio.aspx

Код ниже для вашей цели

        IntPtr formatMono = AudioCompressionManager.CreateFormat(formatArray);
        IntPtr formatStereo = IntPtr.Zero;
        byte[] dataStereo = null;
        AudioCompressionManager.MergeStereo(formatMono, leftData, rightData, ref formatStereo, ref dataStereo);
        PlayerEx plex = new PlayerEx();
        plex.OpenPlayer(formatStereo);
        plex.AddData(dataStereo);
        plex.StartPlay();
0 голосов
/ 04 февраля 2010

У меня есть библиотека в кодплексе для воспроизведения данных в форме волны.

http://WinMM.codeplex.com

У меня есть проект, который много делает с загрузкой и воспроизведением звука на основе вышеуказанной библиотеки:

http://files.otac0n.com/ShadySound.zip
(Эта ссылка может занять некоторое время, чтобы начать работать, я только что создал этот поддомен.)

В нем есть несколько проектов, потому что все загружается через подключаемую инфраструктуру, но он показывает, как загрузить WAV-файл.

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

...