MP3字节数组 - 转换为WAV并导航到时间索引?

时间:2010-08-08 02:35:56

标签: c# audio mp3

我有一个包含MP3流的字节数组。

如果我希望能够转换为WAV,那么假设必须进一步解码此流是否正确?

在当前字节状态下,是否可以执行基本功能,例如获取/设置位置(按时间)?

4 个答案:

答案 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。