我有一个包含MP3流的字节数组。
如果我希望能够转换为WAV,那么假设必须进一步解码此流是否正确?
在当前字节状态下,是否可以执行基本功能,例如获取/设置位置(按时间)?
答案 0 :(得分:8)
是的,MP3文件与WAV文件有很大不同。 WAV文件包含从开始到结束的样本形式的原始音频数据,以绘制输出的波形,就像位图文件包含从左到右,从上到下的像素的原始数据一样。您可以将WAV文件视为声波的位图图片 - 而不是像素颜色,它存储音频强度,通常为每秒449个,如果是立体声,则为两个通道,每个通道为2个字节。
(知道你可以实际计算WAV文件的文件大小 - 存储1分钟的音频,你需要60秒* 44100个样本* 2个通道* 2个字节= 10.09MB。)
MP3文件包含此图像的数学修改版本,并丢弃人类无法听到的音频。它与jpeg图像如何压缩图像的工作方式类似。
正如视频卡最终需要使用位图一样,声卡最终需要使用WAV数据 - 所以是的,你需要一个解码器。
在Mp3文件的开头是一个名为ID3标签的数据块,其中包含一系列关于文件的基本信息 - 艺术家姓名,曲目长度,专辑名称等等。您可以使用类似C# ID3的内容来读取/写入C#中的ID3标记。
至于音频本身,我不确定是否有完全用C#编写的Mp3解码器。从技术上讲,没有理由不能做到这一点(性能也应该很好),但标准相当宽松,数学性能很强,所以人们倾向于使用像FFMpeg这样的东西进行解码。这个Google search中的一些想法。
如果您不需要进行任何特殊处理而只想播放音频,则可以使用WPF / Silverlight Media元素。
您可以从Josh Smith's Podder app获得一些提示。
答案 1 :(得分:8)
NAudio是一个可以读取MP3文件的开源.NET库。
要将MP3转换为WAV,请使用类似于以下内容的代码:
Stream inputStream = ...;
Stream outputStream = ...;
using (WaveStream waveStream = WaveFormatConversionStream.CreatePcmStream(new Mp3FileReader(inputStream)))
using (WaveFileWriter waveFileWriter = new WaveFileWriter(outputStream, waveStream.WaveFormat))
{
byte[] bytes = new byte[waveStream.Length];
waveStream.Read(bytes, 0, waveStream.Length);
waveFileWriter.WriteData(bytes, 0, bytes.Length);
waveFileWriter.Flush();
}
答案 2 :(得分:3)
根据@Rei Miyasaka的回答,有一个用C#编写的MP3解码器。开源也是。查看Mp3Sharp。
答案 3 :(得分:0)
您可以使用http://sourceforge.net/projects/mpg123net/在byte []中解码您的mp3,并根据您的喜好进一步使用已解码的PCM。