使用NAudio在C#中播放ohLibSpotify pcm数据流

使用NAudio在C#中播放ohLibSpotify pcm数据流,第1张

概述我正在尝试播放来自ohLibSpotify c#library( https://github.com/openhome/ohLibSpotify)的原始pcm数据. 我在以下回调中获取数据: public void MusicDeliveryCallback(SpotifySession session, AudioFormat format, IntPtr frames, int num_fr 我正在尝试播放来自ohlibSpotify c#library( https://github.com/openhome/ohLibSpotify)的原始pcm数据.

我在以下回调中获取数据:

public voID MusicDeliveryCallback(SpotifySession session,AudioFormat format,IntPtr frames,int num_frames){    //EXAMPLE DATA    //format.channels = 2,format.samplerate = 44100,format.sample_type = Int16NativeEndian    //frames = ?    //num_frames = 2048}

现在我想用NAudio(http://naudio.codeplex.com/)直接播放收到的数据.使用以下代码片段,我可以从磁盘播放mp3文件.是否可以直接将从spotify接收的数据传递给NAudio并实时播放?

using (var ms = file.OpenRead("test.pcm"))using (var rdr = new Mp3fileReader(ms))using (var wavStream = WaveFormatConversionStream.CreatePCMStream(rdr))using (var baStream = new BlockAlignReductionStream(wavStream))using (var waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback())){    waveOut.Init(baStream);    waveOut.Play();    while (waveOut.PlaybackState == PlaybackState.Playing)    {        Thread.Sleep(100);    }}

编辑:
我更新了我的代码.该程序不会抛出任何错误,但我也听不到音乐.我的代码有什么问题吗?

这是音乐传递回调:

public voID MusicDeliveryCallback(SpotifySession session,int num_frames){    //format.channels = 2,format.sample_type = Int16NativeEndian    //frames = ?    //num_frames = 2048    byte[] frames_copy = new byte[num_frames];    Marshal.copy(frames,frames_copy,num_frames);    buffereDWaveProvIDer = new BuffereDWaveProvIDer(new WaveFormat(format.sample_rate,format.channels));    buffereDWaveProvIDer.BufferDuration = TimeSpan.FromSeconds(40);                buffereDWaveProvIDer.AddSamples(frames_copy,num_frames);    buffereDWaveProvIDer.Read(frames_copy,num_frames);    if (_waveOutDeviceInitialized == false)    {        IWavePlayer waveOutDevice = new WaveOut();        waveOutDevice.Init(buffereDWaveProvIDer);        waveOutDevice.Play();        _waveOutDeviceInitialized = true;    }}

这些是SessionListener中被覆盖的回调:

public overrIDe int MusicDelivery(SpotifySession session,int num_frames){    _sessionManager.MusicDeliveryCallback(session,format,frames,num_frames);    return base.MusicDelivery(session,num_frames);}public overrIDe voID GetAudioBufferStats(SpotifySession session,out AudioBufferStats stats){    stats.samples = 2048 / 2;   //???    stats.stutter = 0;          //???}
解决方法 我想你可以这样做:

>创建一个BuffereDWaveProvIDer.
>将此传递给waveOut.Init.
>在MusicDeliveryCallback中,使用Marshal.copy从本机缓冲区复制到托管字节数组.
>将此托管字节数组传递给BuffereDWaveProvIDer上的AddSamples.
>在GetAudioBufferStats回调中,对“samples”使用buffereDWaveProvIDer.BufferedBytes / 2,并将“stutters”保留为0.

我认为这会奏效.它涉及一些不必要的复制,并没有准确地记录口吃,但它是一个很好的起点.我认为实现IWaveProvIDer并自己管理缓冲可能是更好(更有效和可靠)的解决方案.

我写了ohlibSpotify包装器库,但我不再为同一家公司工作了,所以我不再参与它的开发了.你可以在这个论坛上得到更多帮助:http://forum.openhome.org/forumdisplay.php?fid=6就音乐传递而言,ohlibSpotify旨在尽可能减少开销.它根本不复制音乐数据,只是传递了libspotify库本身提供的相同本机指针,因此您可以将其自己复制到最终目的地,避免不必要的复制层.不过,它确实让它变得有点笨拙.

祝好运!

总结

以上是内存溢出为你收集整理的使用NAudio在C#中播放ohLibSpotify pcm数据流全部内容,希望文章能够帮你解决使用NAudio在C#中播放ohLibSpotify pcm数据流所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1218778.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存