我有一个录音程序,可以录制来自麦克风的声音,然后将其分成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,这样您也可以听到它。尝试加入电影制作人等的所有文件。
答案 0 :(得分:2)
您遇到与MP3编码方式有关的问题。部分编解码器本身在每个文件的开头和结尾添加填充。这是不可避免的。如果您想要端到端地加入它们,则需要使用不同的格式。
一些音乐播放器通过计算添加多少静音来解决这个问题。但即使这样也会因编解码器而异。如果您想深入了解技术细节,请查看本文档的第2部分:http://lame.sourceforge.net/tech-FAQ.txt
(tl; dr:该文件说“576个样本”,16位立体声是每个样本4个字节。)
另一个没有出现此问题的有损编解码器是OGG。 “Vorbis”是一个NuGet包,据说支持使用这种格式。