【问题标题】:Stop recording when there is no audio没有音频时停止录制
【发布时间】:2019-07-05 04:34:29
【问题描述】:

我正在使用 Naudio Library 开发一个录音程序。 现在要录制我必须按下录制按钮而不是保存按钮。 我想一直录制节目并自动保存录制的音频。 感谢您的帮助。 这是一些代码。 开始录制:

    NAudio.Wave.WaveIn sourceStream = null;
    NAudio.Wave.WaveFileWriter waveWriter = null;

    private void SRecording_Click(object sender, EventArgs e)
    {
     if (sourceList.SelectedItems.Count == 0) return;

            SaveFileDialog save = new SaveFileDialog();
            save.Filter = "Wave File (*.wav)|*.wav;";
            string wavoutputpath = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            wavoutputpath += "\\Speech.wav";
            save.FileName = wavoutputpath;

            int deviceNumber = sourceList.SelectedItems[0].Index;

            sourceStream = new NAudio.Wave.WaveIn();
            sourceStream.DeviceNumber = deviceNumber;
            sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(44100, NAudio.Wave.WaveIn.GetCapabilities(deviceNumber).Channels);

            sourceStream.DataAvailable += new EventHandler<NAudio.Wave.WaveInEventArgs>(sourceStream_DataAvailable);
            waveWriter = new NAudio.Wave.WaveFileWriter(save.FileName, sourceStream.WaveFormat);

            sourceStream.StartRecording();
    }

    private void sourceStream_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e)
    {
        if (waveWriter == null) return;

        waveWriter.WriteData(e.Buffer, 0, e.BytesRecorded);
        waveWriter.Flush();
    }

停止录制:

        if (sourceStream != null)
        {
            sourceStream.StopRecording();
            sourceStream.Dispose();
            sourceStream = null;
        }
        if (waveWriter != null)
        {
            waveWriter.Dispose();
            waveWriter = null;
        }

【问题讨论】:

  • 你想做什么。一直录制,还是没有声音就停止?
  • 欢迎来到 StackOverflow!就这个问题而言,很难为您提供帮助。请发布您目前拥有的代码,这样会更容易创建解决方案。

标签: c# naudio


【解决方案1】:

如果您只想在没有音频的情况下停止录制,您可以检查是否已通过一定数量的“静音”样本。在WaveIn.DataAvailable 事件处理程序中,您可以通过查看e.Buffer 中的字节来检查每个样本。假设您在16 bit 中录制,每个2 bytes 形成一个样本。您可以将其转换为Int16 来检查它。同样,当音频再次可用时开始录制,您可以检查样本值,如果超过阈值,则可以开始写入。

【讨论】:

  • 对不起,请您详细说明一下。
【解决方案2】:

@Jester 有一个很好的答案,只是没有代码可以帮助其他不知道如何实现的人。

音频不是我的专业领域,但是,这是我想出的:

int threshold = <SETYOURTHRESHOLD>;
int value = Math.Abs(BitConverter.ToInt16(e.Buffer, (e.BytesRecorded - 2)));
if (value < threshold)
    sourceStream.StopRecording();

全部在:

public void sourceStream_DataAvailable(object sender, WaveInEventArgs e)

方法。

当然,这只是一个开始,还需要更多的工作才能将其变成一台运行良好的机器!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    相关资源
    最近更新 更多