为什么将分割成wav文件的旋律转换为分裂的mp3会在片段边界处产生不良声音?

时间:2015-12-29 11:54:30

标签: c# mp3 wav naudio lame

我有一个录音程序,可以录制来自麦克风的声音,然后将其分成WAV单秒片段,并将每个WAV转换为MP3。

将所有WAV文件加在一起时,我得到了正常的旋律。 将所有MP3文件加在一起时,我的旋律变得蹩脚。

怎么了?我虽然是wav - > mp3转换不应该添加或删除文件中的任何块。 这是在wav和mp3版本中创建单秒片段的代码:

    public void CreateWavAndMp3(string wav_path, string mp3_path, WaveFormat recordingFormat)
    {
        WaveFileWriter wav_writer = new WaveFileWriter(wav_path, recordingFormat);

        List<byte> complete_chunk = new List<byte>(); //to store chunks one after another

        for (int i = 0; i < this.Chunks.Count; i++) //here I have raw bytes stored in List<byte[]>. I just do it that way and since WAV files are fine it's no matter
            complete_chunk.AddRange(this.Chunks[i]);           

        long maxFileLength = recordingFormat.AverageBytesPerSecond * 60;
        var toWrite = (int)Math.Min(maxFileLength - wav_writer.Length, complete_chunk.Count);

        if (toWrite > 0)
        {
            wav_writer.Write(complete_chunk.ToArray(), 0, complete_chunk.Count); //write wav based on stored chunks
            wav_writer.Dispose(); //wav file written
        }

        //mp3 junk
        WaveLib.WaveStream InStr = new WaveLib.WaveStream(wav_path);
        Yeti.MMedia.Mp3.Mp3Writer mp3Writer;
        Yeti.MMedia.Mp3.Mp3WriterConfig m_Config = new Yeti.MMedia.Mp3.Mp3WriterConfig(InStr.Format);

        FileStream Mp3FS = new FileStream(mp3_path, FileMode.Create, FileAccess.Write);
        mp3Writer = new Yeti.MMedia.Mp3.Mp3Writer(Mp3FS, m_Config);

        byte[] mp3buff = new byte[mp3Writer.OptimalBufferSize];
        int read = 0;
        long total = InStr.Length;

        while ((read = InStr.Read(mp3buff, 0, mp3buff.Length)) > 0)
            mp3Writer.Write(mp3buff, 0, read);

        InStr.Dispose();
        mp3Writer.Dispose();
    }

测试声音文件:https://www.dropbox.com/s/e43hh4y3oli13f4/livestream.7z?dl=0,这样您也可以听到它。尝试加入电影制作人等的所有文件。

1 个答案:

答案 0 :(得分:2)

您遇到与MP3编码方式有关的问题。部分编解码器本身在每个文件的开头和结尾添加填充。这是不可避免的。如果您想要端到端地加入它们,则需要使用不同的格式。

一些音乐播放器通过计算添加多少静音来解决这个问题。但即使这样也会因编解码器而异。如果您想深入了解技术细节,请查看本文档的第2部分:http://lame.sourceforge.net/tech-FAQ.txt

(tl; dr:该文件说“576个样本”,16位立体声是每个样本4个字节。)

另一个没有出现此问题的有损编解码器是OGG。 “Vorbis”是一个NuGet包,据说支持使用这种格式。