使用libspotifydotnet(Spotify - libspotify)流式传输音频

本文关键字:传输 音频 libspotify libspotifydotnet Spotify 使用 | 更新日期: 2023-09-27 18:36:01

在查看了这篇文章,这篇文章和这篇文章之后,我明白我必须使用类似NAudio的东西stream音频,并且播放歌曲是通过以下方式完成的:

libspotify.sp_session_player_load(_sessionPtr, trackPtr);
libspotify.sp_session_player_play(_sessionPtr, true);

现在,如果我理解正确,我将接收stream作为原始 PCM 数据。如何访问这些数据?

根据文档,我看到我必须填充libspotify.sp_audioformat

我究竟该怎么做?从哪里来?

我正在检查这个项目(Jamcast),他们做了这样的事情:

libspotify.sp_audioformat format = (libspotify.sp_audioformat)Marshal.PtrToStructure(formatPtr, typeof(libspotify.sp_audioformat));

有人可以指出我正确的方向吗?我完全不知道如何检索stream

使用libspotifydotnet(Spotify - libspotify)流式传输音频

最后,我遵循了这个问题和这个问题。他们帮了我很多忙。

我不得不做这样的事情:

public static libspotify.sp_error LoadPlayer(IntPtr trackPtr)
{
    bufferedWaveProvider = new BufferedWaveProvider(new WaveFormat());
    bufferedWaveProvider.BufferDuration = TimeSpan.FromSeconds(120);
    return libspotify.sp_session_player_load(_sessionPtr, trackPtr);
}
public static void Play()
{
    libspotify.sp_session_player_play(_sessionPtr, true);
    IWavePlayer waveOutDevice = new WaveOut();
    waveOutDevice.Init(bufferedWaveProvider);
    waveOutDevice.Play();
    while (waveOutDevice.PlaybackState == PlaybackState.Playing)
    {
        Thread.Sleep(100);
    }   
}
private static int music_delivery(IntPtr sessionPtr, IntPtr formatPtr, IntPtr framesPtr, int num_frame)
{
    if (num_frame == 0)
        return 0;
    libspotify.sp_audioformat format = (libspotify.sp_audioformat)Marshal.PtrToStructure(formatPtr, typeof(libspotify.sp_audioformat));
    byte[] buffer = new byte[num_frame * sizeof(Int16) * format.channels];
    Marshal.Copy(framesPtr, buffer, 0, buffer.Length);
    bufferedWaveProvider.AddSamples(buffer, 0, num_frame * sizeof(Int16) * format.channels);
    if (Session.OnAudioDataArrived != null)            
        Session.OnAudioDataArrived(buffer);
    return num_frame;
}