写入文件时压缩音频

Posted

技术标签:

【中文标题】写入文件时压缩音频【英文标题】:Compress Audio upon writing to file 【发布时间】:2013-03-11 01:20:16 【问题描述】:

我正在尝试从声卡发出的音频创建一个录音机,这是我迄今为止的进展,问题是保存到文件时录制的音频太大,就像一首歌曲可以达到数百兆字节。

这是我的代码

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

namespace Record_From_Soundcard

    public partial class frmMain : Form
    
        private WaveFileWriter writer;
        private WasapiLoopbackCapture waveInSel;

        public frmMain()
        
            InitializeComponent();
        

        private void frmMain_Load(object sender, EventArgs e)
        
            MMDeviceEnumerator deviceEnum = new MMDeviceEnumerator();
            MMDeviceCollection deviceCol = deviceEnum.EnumerateAudioEndPoints(DataFlow.Render, DeviceState.Active);

            cboAudioDrivers.DataSource = deviceCol.ToList();
               

        private void btnStopRecord_Click(object sender, EventArgs e)
        
            waveInSel.StopRecording();
            writer.Close();
                

        private void btnStartRecord_Click(object sender, EventArgs e)
        
            using (SaveFileDialog _sfd = new SaveFileDialog())
            
                _sfd.Filter = "Mp3 File (*.mp3)|*.mp3";               

                if (_sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                
                    MMDevice _device = (MMDevice)cboAudioDrivers.SelectedItem;
                    waveInSel = new WasapiLoopbackCapture(_device);
                    writer = new WaveFileWriter(_sfd.FileName, waveInSel.WaveFormat);                    

                    waveInSel.DataAvailable += (n, m) =>
                    
                        writer.Write(m.Buffer, 0, m.BytesRecorded);
                    ;

                    waveInSel.StartRecording();
                
            
        
    


谁能帮助我在保存时如何压缩音频?

可能会在这部分添加

waveInSel.DataAvailable += (n, m) =>
    
         writer.Write(m.Buffer, 0, m.BytesRecorded);
    ;

提前谢谢.. ;)

【问题讨论】:

【参考方案1】:

使用 naudio dll 试试这个

Using NAudio.Wave; Using NAudio.Wave.SampleProviders;Using NAudio.Lame
Private void WaveToMP3(int bitRate = 128)
    String waveFileName = Application.StartupPath + @"\Temporal\mix.wav";
    String mp3FileName = Application.StartupPath + @"\Grabaciones\ " + Strings.Format(DateTime.Now, "dd-MM-yyyy.HH.mm.ss") + ".mp3";

    Using (var reader = New AudioFileReader(waveFileName))
    
        Using (var writer = New LameMP3FileWriter(mp3FileName, reader.WaveFormat, bitRate))
        
            reader.CopyTo(writer);
        
        reader.Close();
    

【讨论】:

代码示例看起来很有希望并且可能对 OP 有所帮助,但如果它是在 C# 中可以改进(因为这就是问题的标记)。 哇 8 年了,谢谢@Gabriela【参考方案2】:

您不能通过保存扩展名为 .MP3 的 WAV 文件来制作 MP3 文件(这就是您在此处所做的)。您需要选择机器上可用的编码器,然后通过它传递音频。我在this article 中详细介绍了如何使用 NAudio 执行此操作。

【讨论】:

我有将结果编码为mp3的想法,但我总是收到错误请选择一个PCM WAV文件进行编码。所以可能创建的wav文件没有完成?还是没有正确格式化为 wav? waveInSel.DataAvailable中的数据可用时,是否有任何代码sn-p可以压缩m.Buffer?

以上是关于写入文件时压缩音频的主要内容,如果未能解决你的问题,请参考以下文章

使用 AUHAL 音频单元将字节写入音频文件

当程序写入/读取文件时,如何透明地压缩/解压缩文件?

使用 NAudio 录制音频并在麦克风输入静音时写入文件

无需查找即可写入的音频文件格式

实时编码音频会导致声音跳过

如何使用 FFMPEG 和 C 将音频和视频写入同一个文件?