我有一个包含MP3流的字节数组.
如果我希望能够转换为WAV,那么假设必须进一步解码此流是否正确?
在当前字节状态下,是否可以执行基本功能,例如获取/设置位置(按时间)?
是的,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搜索中的一些想法.
如果您不需要进行任何特殊处理而只想播放音频,则可以使用WPF/Silverlight Media元素.
您可以从Josh Smith的Podder应用程序中获得一些提示.
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();
}
Run Code Online (Sandbox Code Playgroud)