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

标签 audio spotify naudio

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

来自 spotify 文档:样本以整数形式提供,请参阅 sp_audioformat。一帧由与 channel 数相同的样本数组成。 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 的签名是
公共(public)静态 NAudio.Wave.WaveFormat CreateCustomFormat(NAudio.Wave.WaveFormatEncoding 标记,int sampleRate,int channels,int averageBytesPerSecond,int blockAlign,int bitsPerSample)

最佳答案

这是立体声:

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

关于audio - 如何从原始 16 位、44100 赫兹、立体声 PCM 获得正确的声音(立体声),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11463218/

相关文章:

spotify - libspotify 和 const char * 生命周期/编码

java - 如何从 java docker 容器应用程序解析文件

c# - 对 Windows 如何获取音频线路名称感到困惑

java - 将字符串转换为Java中的音频输入

javascript - 在 ReactJS 中的 Spotify API 上为 PKCE 身份验证创建代码验证器和质询

c# - 使用 NAudio 读取 mp3 文件速度较慢

c# - 使用NAudio 1.7+播放音频文件

c# - 从 WasapiLoopbackCapture 捕获音频,并转换为 muLaw

python - 从 python 读取 wav 文件并将帧转换为 RAW s16le 字符串

java - 音频输入编程