2015-10-19 163 views
0

第1部分
我有一些n音訊相關的代碼n音訊WasapiLoopbackCapture間歇性的聲音

private void InitAudioOut(DateTime dtNow) 
    { 
     _pathOut = string.Format(BaseDirectory + @"\({0:HH-mm-ss dd-MM-yyyy} OUT).wav", dtNow); 

     _waveOut = new WasapiLoopbackCapture(); 
     _waveOut.DataAvailable += WaveOutDataAvailable; 
     _waveOut.RecordingStopped += WaveOutRecordStopped; 

     _waveOutFileStream = new WaveFileWriter(_pathOut, _waveOut.WaveFormat); 

     _waveOut.StartRecording(); 
    } 

利用這種初始化錄音過程的我有followind WaveOutDataAvailable方法:

private void WaveOutDataAvailable(object sender, WaveInEventArgs e) 
    { 
     var buf= e.Buffer; 
     _waveOutFileStream.Write(buf, 0, buf.Length); 
     _waveOutFileStream.Flush(); 
    } 

聲音在生成的文件是間歇性的和緩慢的,就像在聲音塊之間存在「空白」部分,任何想法都是值得讚賞的。

的一部分,最終1

第2部分
有了這個代碼,我正在努力的WAV流轉換爲MP3流在飛行然後把它寫入到文件的另一個版本,它看起來像這樣:

private void InitAudioIn(DateTime dtNow) 
    { 
     _pathIn = string.Format(BaseDirectory + @"\({0:HH-mm-ss dd-MM-yyyy} IN).mp3", dtNow); 
     _waveIn = new WaveInEvent(); 
     _waveIn.WaveFormat = new WaveFormat(44100, 2); 

     _waveIn.DataAvailable += WaveInDataAvailable; 
     _waveIn.RecordingStopped += WaveInRecordStopped; 

     _waveInFileStream = File.Create(_pathIn); 

     _waveIn.StartRecording(); 
    } 

隨着WaveInDataAvailable方法如下:

private void WaveInDataAvailable(object sender, WaveInEventArgs e) 
    { 
     var wavToMp3Buffer = ConvertWavToMp3(e.Buffer, _waveIn.WaveFormat); 
     _waveInFileStream.Write(wavToMp3Buffer, 0, wavToMp3Buffer.Length); 
     _waveInFileStream.Flush(); 
    } 

的ConvertWavToMp3方法:

public byte[] ConvertWavToMp3(byte[] wavContent, WaveFormat waveFormat) 
    { 
     using (var baseMemoryStream = new MemoryStream()) 
     using (var wavToMp3Writer = new LameMP3FileWriter(baseMemoryStream, waveFormat, 64)) 
     { 
      wavToMp3Writer.Write(wavContent, 0, wavContent.Length); 
      wavToMp3Writer.Flush(); 
      return baseMemoryStream.ToArray(); 
     } 
    } 

,如果我不嘗試將其轉換爲MP3,只是把它寫爲WAV文件,這是絕對好的,但如果我通過ConvertWavToMp3方法試試MP3轉換然後聲音變得緩慢和間歇性,這個實現有什麼問題?

回答

1

第一部分,您對緩衝區長度與緩衝區中有效字節的數量相同作出無效假設。請嘗試:

private void WaveOutDataAvailable(object sender, WaveInEventArgs e) 
{ 
    _waveOutFileStream.Write(e.Buffer, 0, e.BytesRecorded); 
} 

讓輸出流自動處理沖洗。嘗試將數據強制加載到磁盤上將無法工作,或者在某些情況下可能會導致意想不到的結果,如可能干擾數據的部分數據塊寫入。在記錄結束時沖洗,而不是在記錄期間沖洗。

至於第二部分...

您的代碼創建一個文件,它是一系列的MP3文件,一個用於傳遞給WaveInDataAvailable方法每個緩衝區的級聯,幷包括所有的空格處這些緩衝區的結束。當然,它不會正常播放。

如果你想寫一個MP3,然後直接做。讓你的_waveInFileStreamLameMP3FileWriter的一個實例,讓它處理工作本身。這不僅會產生更有用的輸出,而且還可以節省大量低效的設置和拆除編碼器的時間,從而爲您接收的每個數據塊節省時間。

+0

刪除Flush,按照你的建議更改了寫入方法,將文件編寫器設置爲直接LameMP3FIleWriter,結果是PERFECT,100%準確的記錄,謝謝! – HardLuck