如何从原始 16 位、44100 赫兹、立体声 PCM 获得正确的声音(立体声)

Posted

技术标签:

【中文标题】如何从原始 16 位、44100 赫兹、立体声 PCM 获得正确的声音(立体声)【英文标题】:How to get the right sound (stereo) from a raw 16bit, 44100hz, stereo LPCM 【发布时间】:2012-07-13 02:12:49 【问题描述】:

我正在使用 libspotify 检索音乐以与某些音频库一起播放。 Spotify 音乐应为原始 16 位、44100hz、立体声 LPCM。我一直在尝试用 NAudio 播放音乐,但不幸的是它不是立体声的。

来自 spotify 文档:样本以整数形式提供,请参阅 sp_audioformat。一帧由与通道数相同的样本数组成。 IE。交错在样本级别。

以下代码从文件中播放单声道歌曲。该文件是 Spotify 音乐数据的副本。

有人可以指导我找到立体声解决方案吗?它可以是 .NET 中的任何音频库。

using (var waveOutDevice = new WaveOut())


    using (var pcmStream = new FileStream(PcmFile, FileMode.Open))
    
        WaveStream waveStream = null;
        try
        
            const int sampleRate = 44100;
            const int channels = 2;
            var waveFormat = WaveFormat.CreateCustomFormat(WaveFormatEncoding.Pcm, sampleRate * channels, 1, sampleRate*2*channels, channels, 16);
            waveStream = new RawSourceWaveStream(pcmStream, waveFormat);

            waveOutDevice.Init(waveStream);
            waveOutDevice.Play();

            Thread.Sleep(5000); //Listen to 5 secs of music

        
        finally
        
            waveOutDevice.Stop();
            if (waveStream != null) waveStream.Close();
        
    

CreateCustomFormat 的签名是 公共静态 NAudio.Wave.WaveFormat CreateCustomFormat(NAudio.Wave.WaveFormatEncoding tag, int sampleRate, int channels, int averageBytesPerSecond, int blockAlign, int bitsPerSample)

【问题讨论】:

【参考方案1】:

这是立体声:

const int bitsPerSample = 16;
int blockAlign = (channels * (bitsPerSample / 8));
int averageBytesPerSecond = sampleRate * blockAlign;
var waveFormat = WaveFormat.CreateCustomFormat(WaveFormatEncoding.Pcm, sampleRate, channels, averageBytesPerSecond, blockAlign, bitsPerSample);

【讨论】:

【参考方案2】:

也许您向 CreateCustomFormat 传递了错误的值。尝试以下操作:

WaveFormat.CreateCustomFormat(WaveFormatEncoding.Pcm, sampleRate, channels, sampleRate*channels, 1, 8);

【讨论】:

以上是关于如何从原始 16 位、44100 赫兹、立体声 PCM 获得正确的声音(立体声)的主要内容,如果未能解决你的问题,请参考以下文章

从音频文件C#中提取信息

如何用声卡采集声音信号 然后用到MATLAB里面

从线性 PCM 中提取音频通道

将 16 位立体声转换为 16 位单声道声音

Python录下人声需要啥库?

声音数据格式