Я пытаюсь записать звук с динамиков и микрофона моего компьютера. Идея состоит в том, чтобы создать программу, которая могла бы расшифровать любое собрание, независимо от того, что я использую (веб-камера, динамики, наушники Air Pod, заводские динамики, гарнитура и т. д. и т. п.).
Я думаю, что я близок, но это просто создание большого файла, в котором нет звука или, по крайней мере, он искажен. Будем очень признательны за любую помощь.
private WasapiLoopbackCapture? _speakerCapture;
private WaveInEvent? _micCapture;
private BufferedWaveProvider? _speakerBuffer;
private BufferedWaveProvider? _micBuffer;
private MixingSampleProvider? _mixer;
private WaveFileWriter? _writer;
private Task? _recordingTask;
private volatile bool _isRecording;
public string RecordingFile { get; private set; } = "";
public void StartRecording()
{
if (_isRecording) throw new InvalidOperationException("Recording already in progress.");
RecordingFile = Path.Combine(Paths.TempPath, $"{DateTime.Now:yyyyMMdd_HHmmss}.wav");
var dir = Path.GetDirectoryName(RecordingFile);
if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir))
Directory.CreateDirectory(dir);
_speakerCapture = new WasapiLoopbackCapture();
_micCapture = new WaveInEvent();
_speakerBuffer = new BufferedWaveProvider(_speakerCapture.WaveFormat)
{
DiscardOnBufferOverflow = true,
BufferDuration = TimeSpan.FromSeconds(3)
};
_micBuffer = new BufferedWaveProvider(_micCapture.WaveFormat)
{
DiscardOnBufferOverflow = true,
BufferDuration = TimeSpan.FromSeconds(3)
};
_speakerCapture.DataAvailable += (s, a) => _speakerBuffer?.AddSamples(a.Buffer, 0, a.BytesRecorded);
_micCapture.DataAvailable += (s, a) => _micBuffer?.AddSamples(a.Buffer, 0, a.BytesRecorded);
ISampleProvider speaker = _speakerBuffer.ToSampleProvider();
ISampleProvider mic = _micBuffer.ToSampleProvider();
const int targetRate = 16000;
if (speaker.WaveFormat.SampleRate != targetRate)
speaker = new WdlResamplingSampleProvider(speaker, targetRate);
if (speaker.WaveFormat.Channels > 1)
speaker = speaker.ToMono();
if (mic.WaveFormat.SampleRate != targetRate)
mic = new WdlResamplingSampleProvider(mic, targetRate);
if (mic.WaveFormat.Channels > 1)
mic = mic.ToMono();
_mixer = new MixingSampleProvider(new[] { speaker, mic })
{
ReadFully = true
};
var finalProvider = _mixer.ToWaveProvider16();
_writer = new WaveFileWriter(RecordingFile, finalProvider.WaveFormat);
_isRecording = true;
_speakerCapture.StartRecording();
_micCapture.StartRecording();
_recordingTask = Task.Run(() =>
{
var buffer = new byte[finalProvider.WaveFormat.AverageBytesPerSecond / 10];
while (_isRecording)
{
try
{
int read = finalProvider.Read(buffer, 0, buffer.Length);
if (read > 0)
_writer?.Write(buffer, 0, read);
else
Thread.Sleep(10);
}
catch { }
}
_writer?.Flush();
});
}
public void StopRecording()
{
if (!_isRecording) return;
_isRecording = false;
// Stop captures
try { _speakerCapture?.StopRecording(); } catch { }
try { _micCapture?.StopRecording(); } catch { }
// Wait for recording task to finish
try { _recordingTask?.Wait(TimeSpan.FromSeconds(5)); } catch { }
Dispose();
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... nd-save-it
Я пытаюсь записать звук с динамиков и микрофона моего компьютера и сохранить его в один файл. ⇐ C#
Место общения программистов C#
1761118784
Anonymous
Я пытаюсь записать звук с динамиков и микрофона моего компьютера. Идея состоит в том, чтобы создать программу, которая могла бы расшифровать любое собрание, независимо от того, что я использую (веб-камера, динамики, наушники Air Pod, заводские динамики, гарнитура и т. д. и т. п.).
Я думаю, что я близок, но это просто создание большого файла, в котором нет звука или, по крайней мере, он искажен. Будем очень признательны за любую помощь.
private WasapiLoopbackCapture? _speakerCapture;
private WaveInEvent? _micCapture;
private BufferedWaveProvider? _speakerBuffer;
private BufferedWaveProvider? _micBuffer;
private MixingSampleProvider? _mixer;
private WaveFileWriter? _writer;
private Task? _recordingTask;
private volatile bool _isRecording;
public string RecordingFile { get; private set; } = "";
public void StartRecording()
{
if (_isRecording) throw new InvalidOperationException("Recording already in progress.");
RecordingFile = Path.Combine(Paths.TempPath, $"{DateTime.Now:yyyyMMdd_HHmmss}.wav");
var dir = Path.GetDirectoryName(RecordingFile);
if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir))
Directory.CreateDirectory(dir);
_speakerCapture = new WasapiLoopbackCapture();
_micCapture = new WaveInEvent();
_speakerBuffer = new BufferedWaveProvider(_speakerCapture.WaveFormat)
{
DiscardOnBufferOverflow = true,
BufferDuration = TimeSpan.FromSeconds(3)
};
_micBuffer = new BufferedWaveProvider(_micCapture.WaveFormat)
{
DiscardOnBufferOverflow = true,
BufferDuration = TimeSpan.FromSeconds(3)
};
_speakerCapture.DataAvailable += (s, a) => _speakerBuffer?.AddSamples(a.Buffer, 0, a.BytesRecorded);
_micCapture.DataAvailable += (s, a) => _micBuffer?.AddSamples(a.Buffer, 0, a.BytesRecorded);
ISampleProvider speaker = _speakerBuffer.ToSampleProvider();
ISampleProvider mic = _micBuffer.ToSampleProvider();
const int targetRate = 16000;
if (speaker.WaveFormat.SampleRate != targetRate)
speaker = new WdlResamplingSampleProvider(speaker, targetRate);
if (speaker.WaveFormat.Channels > 1)
speaker = speaker.ToMono();
if (mic.WaveFormat.SampleRate != targetRate)
mic = new WdlResamplingSampleProvider(mic, targetRate);
if (mic.WaveFormat.Channels > 1)
mic = mic.ToMono();
_mixer = new MixingSampleProvider(new[] { speaker, mic })
{
ReadFully = true
};
var finalProvider = _mixer.ToWaveProvider16();
_writer = new WaveFileWriter(RecordingFile, finalProvider.WaveFormat);
_isRecording = true;
_speakerCapture.StartRecording();
_micCapture.StartRecording();
_recordingTask = Task.Run(() =>
{
var buffer = new byte[finalProvider.WaveFormat.AverageBytesPerSecond / 10];
while (_isRecording)
{
try
{
int read = finalProvider.Read(buffer, 0, buffer.Length);
if (read > 0)
_writer?.Write(buffer, 0, read);
else
Thread.Sleep(10);
}
catch { }
}
_writer?.Flush();
});
}
public void StopRecording()
{
if (!_isRecording) return;
_isRecording = false;
// Stop captures
try { _speakerCapture?.StopRecording(); } catch { }
try { _micCapture?.StopRecording(); } catch { }
// Wait for recording task to finish
try { _recordingTask?.Wait(TimeSpan.FromSeconds(5)); } catch { }
Dispose();
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79796385/im-trying-to-record-audio-from-my-computers-speakers-and-microphone-and-save-it[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия