我在以下回调中获取数据:
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数据流所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)