3

マイクからのオーディオをファイル (.mp3) に録音するアプリケーションを構築しています。十分に高い振幅が検出された場合にのみ、アプリケーションがデータをファイルに書き込むようにしたいと考えています。選択したデータを保存できません。私が得るのは速い歪みだけで、録音されたものとはかけ離れています。

これは私のコードです:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using NAudio.Wave;

namespace NAudio_Testing
{
    public partial class Form1 : Form
    {
        int counter = 0;
        int passed = 0;
        private BufferedWaveProvider bufferedWaveProvider;
        WaveIn waveIn;
        WaveFileWriter writer;
        string output = "C:/Users/klein/AppData/Roaming/Microsoft/Windows/gravacao.mp3";
        public Form1()
        {
            InitializeComponent();
            waveIn = new WaveIn();
            writer = new WaveFileWriter(output, waveIn.WaveFormat);

            waveIn.DataAvailable += new EventHandler<WaveInEventArgs>(new_dataAvailable);

            bufferedWaveProvider = new BufferedWaveProvider(waveIn.WaveFormat);
            bufferedWaveProvider.DiscardOnBufferOverflow = true;
            waveIn.StartRecording();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Interval = 1000;
            timer1.Start();
        }

        void new_dataAvailable(object sender, WaveInEventArgs e)
        {
            for (int i = 0; i < e.BytesRecorded; i+=2)
            {
                short sample = (short)((e.Buffer[i + 1] << 8) | e.Buffer[i + 0]);
                float sample32 = sample / 32768f;
                if (sample32 > 0.02) //0.02~0.03
                {
                    writer.WriteSample(sample);
                }
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            waveIn.StopRecording();
            waveIn.Dispose();
            waveIn = null;
            writer.Close();
            writer = null;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            textBox1.Text = counter++.ToString();
        }

    }
}

編集:選択的なifを削除して行を追加するだけでオーディオを正常に録音できますが、問題はもちろん、オーディオの振幅に応じて録音できないかどうかです:

writer.WriteByte(e.Buffer[i + 0]);
writer.WriteByte(e.Buffer[i + 1]);

そのようです:

void new_dataAvailable(object sender, WaveInEventArgs e)
    {
        for (int i = 0; i < e.BytesRecorded; i+=2)
        {
            short sample = (short)((e.Buffer[i + 1] << 8) | e.Buffer[i + 0]);
            float sample32 = sample / 32768f;

            writer.WriteByte(e.Buffer[i + 0]);
            writer.WriteByte(e.Buffer[i + 1]);

        }
    }

ありがとうございました。

4

2 に答える 2

6

あなたのアプローチは、その時の全体的なオーディオが大きいかどうかに関係なく、基本的にゼロ交差の近くのすべてのサンプルを捨てることです。オーディオ信号には通常、毎秒多くのゼロ交差があるため、信号が歪んで速度が上がります。

代わりに、すべてのサンプルの最大量を短時間で測定する必要があります(どのくらいの時間がかかりますが、一度に1秒で測定できます)。その間にサンプルが指定された最小値よりも大きい場合は、ブロック全体を記録します。

コードの2番目の問題は、実際にMP3ファイルを作成していないことです。WaveFileWriterはWAVファイルを作成します。ファイル名をWAVで終わるように変更し、それを聞いて録音の結果を聞きます。次に、録音後の2番目のステップとしてMP3に変換する必要があります。(ここにフォーマット間の変換方法に関する記事があります)。

于 2013-01-18T07:08:08.767 に答える
1

サンプルは署名されているため、サンプルの絶対値を比較する必要があります。

 if (Abs(sample32) > 0.02) //0.02~0.03
   {
      writer.WriteSample(sample);
   }
于 2016-12-19T19:23:21.050 に答える