使用 NAudio 直接从转换后的 MP3 文件中读取样本
Posted
技术标签:
【中文标题】使用 NAudio 直接从转换后的 MP3 文件中读取样本【英文标题】:Reading samples directly from a converted MP3 file using NAudio 【发布时间】:2009-11-26 15:55:44 【问题描述】:我正在尝试使用 NAudio 从(转换后的)MP3 文件中读取 PCM 样本,但由于 Read
方法每次都返回零(表示 EOF)而失败。
示例:这段代码尝试读取单个 16 位样本,始终打印“0”:
using System;
using NAudio.Wave;
namespace NAudioMp3Test
class Program
static void Main(string[] args)
using (Mp3FileReader fr = new Mp3FileReader("MySong.mp3"))
byte[] buffer = new byte[2];
using (WaveStream pcm = WaveFormatConversionStream.CreatePcmStream(fr))
using (WaveStream aligned = new BlockAlignReductionStream(pcm))
Console.WriteLine(aligned.WaveFormat);
Console.WriteLine(aligned.Read(buffer, 0, 2));
输出:
16 bit PCM: 44kHz 2 channels
0
但是这个从 WAV 文件读取的版本可以正常工作(我使用 iTunes 将 MP3 转换为 WAV,因此它们应该包含类似的样本):
static void Main(string[] args)
using (WaveFileReader pcm = new WaveFileReader("MySong.wav"))
byte[] buffer = new byte[2];
using (WaveStream aligned = new BlockAlignReductionStream(pcm))
Console.WriteLine(aligned.WaveFormat);
Console.WriteLine(aligned.Read(buffer, 0, 2));
输出:
16 bit PCM: 44kHz 2 channels
2
这里发生了什么?两个流具有相同的波形格式,因此我希望能够使用相同的 API 来读取样本。设置Position
属性也无济于事。
【问题讨论】:
【参考方案1】:您可能需要阅读更大的块。 NAudio 使用 ACM 执行从 MP3 到 WAV 的转换,如果您的目标缓冲区不够大,编解码器可能会拒绝转换任何数据。换句话说,您需要先转换一个样本块,然后才能读取第一个样本。
WAV 文件是另一回事,因为从其中读取单个样本既好又容易。
【讨论】:
我认为BlockAlignReductionStream
会这样做。也许我需要给它一个参数来告诉它分配一个更大的缓冲区?
是的,块对齐缩减流在某些情况下确实可以帮助您,但它在 Read 方法中计算的 sourceReadCount 可能为 0 或太低。如果您可以调试以查看它计算 sourceReadCount 的内容会很有趣。也许我可以修复以上是关于使用 NAudio 直接从转换后的 MP3 文件中读取样本的主要内容,如果未能解决你的问题,请参考以下文章
如何使用内存流、NAudio 和 LameMP3 将音频 aiff 转换为 MP3
使用 C# 中的 NAudio 将 M4A 音频文件转换为 MP3 的问题/错误
使用 NAudio 转换为 WAV 后使用 SoundPlayer 播放 MP3