- В настоящее время я могу: записывать данные с аудиовхода, генерировать wav-файл с этими данными на диске, воспроизводить wav-файл с диска.
- Что я хочу сделать: взять необработанные байты, прочитанные через NAudio, преобразовать wav, определенные байты в mp3, воспроизвести mp3 (без записи чего-либо на диск).
Используемый код:
public WaveIn waveSource = null;
public WaveFileWriter waveFile = null;
public List<byte> soundBytesList = new List<byte>();
private void waveSource_DataAvailable(object sender, WaveInEventArgs e)
{
if (waveFile != null)
for (int i = 0; i < e.BytesRecorded; ++i)
soundBytesList.Add(e.Buffer[i]);
waveFile.Write(e.Buffer, 0, e.BytesRecorded);
waveFile.Flush();
}
public void waveSource_RecordingStopped(object sender, StoppedEventArgs e)
{
if (waveSource != null)
{
waveSource.Dispose();
waveSource = null;
}
if (waveFile != null)
{
waveFile.Dispose();
waveFile = null;
}
}
private void RecordButton_MouseDown(object sender, EventArgs e)
{
waveSource = new WaveIn();
waveSource.WaveFormat = new WaveFormat(44100, 1);
waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable);
waveSource.RecordingStopped += new EventHandler<StoppedEventArgs>(waveSource_RecordingStopped);
waveFile = new WaveFileWriter("test.wav", waveSource.WaveFormat);
waveSource.StartRecording();
}
private void RecordButton_MouseUp(object sender, EventArgs e)
{
waveSource.StopRecording();
byte[] soundBytesArrayWAV = soundBytesList.ToArray();
byte[] outB = ConvertWavToMp3(soundBytesArrayWAV );
File.WriteAllBytes("test.mp3", outB);
}
public byte[] ConvertWavToMp3(byte[] wavFile)
{
using (var retMs = new MemoryStream())
using (var ms = new MemoryStream(wavFile))
using (var rdr = new WaveFileReader(ms))
using (var wtr = new LameMP3FileWriter(retMs, rdr.WaveFormat, 128))
{
rdr.CopyTo(wtr);
wtr.Flush();
return retMs.ToArray();
}
}
Проблема в том, что я получаю сообщение об ошибке в методе ConvertWavToMp3, в котором говорится, что предоставленный массив байтов (soundBytesArrayWAV
) не имеет RIFF (заголовок, специфичный для wav). Я предполагаю, что я не правильно беру все байты в soundBytesList
, потому что, если я загружаю все байты в память (с диска, написанного wav), преобразование работает нормально. Не могли бы вы дать мне руку?
soundBytesList
вwaveSource_DataAvailable
. Мне непонятно, почему вы создаетеWaveFileWriter
с именем файла, если вы не хотите записывать файл - почему бы просто не использовать для этогоMemoryStream
, а затем вConvertWavToMp3
просто установить положение этогоMemoryStream
на 0 перед его передачей в конструкторWaveFileReader
? По сути, вы хотите, чтобыWaveFileReader
видел все данные, которые записалWaveFileWriter
... - person Jon Skeet   schedule 11.03.2019soundBytesList
у вас будет полеMemoryStream
. Вы должны создать поток вRecordButton_MouseDown
и передать его в конструкторWaveFileWriter
. Затем используйте его вRecordButton_MouseUp
, после перемотки. - person Jon Skeet   schedule 11.03.2019