为什么将拆分为 wav 文件的旋律转换为拆分的 mp3 会在片段边界处产生糟糕的声音?
Why converting splitted onto wav files melody into splitted mp3 gives bad sound at fragments borders?
我有一个录音程序,可以录制麦克风的声音,然后将其拆分为 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 这样你也能听到了。尝试加入 movie maker 等中的所有文件
您遇到了与 MP3 编码方式相关的问题。部分编解码器本身会在每个文件的开头和结尾添加填充。这是不可避免的。如果您想首尾相连,则需要使用不同的格式。
一些音乐播放器通过计算增加了多少静音来解决这个问题。但即使这样也可能因编解码器而异。如果您想深入了解技术细节,请查看本文档的第 2 部分:http://lame.sourceforge.net/tech-FAQ.txt
(tl;dr:该文档说“576 个样本”,16 位立体声每个样本 4 个字节。)
另一个没有出现此问题的有损编解码器是 OGG。 "Vorbis" 是一个据说支持使用这种格式的 NuGet 包。
我有一个录音程序,可以录制麦克风的声音,然后将其拆分为 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 这样你也能听到了。尝试加入 movie maker 等中的所有文件
您遇到了与 MP3 编码方式相关的问题。部分编解码器本身会在每个文件的开头和结尾添加填充。这是不可避免的。如果您想首尾相连,则需要使用不同的格式。
一些音乐播放器通过计算增加了多少静音来解决这个问题。但即使这样也可能因编解码器而异。如果您想深入了解技术细节,请查看本文档的第 2 部分:http://lame.sourceforge.net/tech-FAQ.txt
(tl;dr:该文档说“576 个样本”,16 位立体声每个样本 4 个字节。)
另一个没有出现此问题的有损编解码器是 OGG。 "Vorbis" 是一个据说支持使用这种格式的 NuGet 包。