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

Sko*_*der 3 c# audio mp3

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

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

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

Rei*_*aka 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搜索中的一些想法.

如果您不需要进行任何特殊处理而只想播放音频,则可以使用WPF/Silverlight Media元素.

您可以从Josh Smith的Podder应用程序中获得一些提示.


Bra*_*ger 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();
}
Run Code Online (Sandbox Code Playgroud)