Я пытаюсь записать звук с динамиков и микрофона моего компьютера и сохранить его в один файл.C#

Место общения программистов C#
Ответить
Anonymous
 Я пытаюсь записать звук с динамиков и микрофона моего компьютера и сохранить его в один файл.

Сообщение 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();
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... nd-save-it
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»