使用 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

如何使用 NAudio 从 mp3 中获取音频样本数据

使用 NAudio/Lame 将 .wav 转换为 mp3 时如何设置通道和采样率?

使用 NAudio 修剪 mp3 文件