UWP MediaPlaybackList在列表项之间弹出声音

时间:2019-02-05 23:27:26

标签: c# uwp bluetooth streaming

我正在使用MediaPlaybackList来在固定的时间收集时间间隔内,以流的形式“传输”通过蓝牙作为byte []传入的音频数据。根据MS文档,MediaPlaybackList是音频样本之间的“无间隙”播放。但就我而言,过渡到下一个音频样本时,我的声音会突然跳起来。

byte[] audioContent = new byte[audioLength];
chatReader.ReadBytes(audioContent);

MediaPlaybackItem mediaPlaybackItem = new MediaPlaybackItem(MediaSource.CreateFromStream(new MemoryStream(audioContent).AsRandomAccessStream(), "audio/mpeg"));
playbackList.Items.Add(mediaPlaybackItem);

if (_mediaPlayerElement.MediaPlayer.PlaybackSession.PlaybackState != MediaPlaybackState.Playing)
{               
    _mediaPlayerElement.MediaPlayer.Play(); ;
}

如何使用类似的方法实现真正​​的“无间隙”流音频?

此外,我尝试将数据流实时写入文件中,只是看是否有爆裂声或间隙。从文件开始播放时,字节完美地附加到了后面,没有弹出或空白。

using (var stream = await playbackFile.OpenStreamForWriteAsync())
{
    stream.Seek(0, SeekOrigin.End);
    await stream.WriteAsync(audioContent, 0, audioContent.Length);
}

1 个答案:

答案 0 :(得分:0)

MediaPlayer,尤其是MediaPlayerList不能与“实时”音频流一起使用。您必须先完成将数据写入字节流的操作,然后再将其添加到列表中并启动MediaPlayer。对于这种特定情况,使用MediaPlayer不是正确的解决方案。

更好的解决方案是使用Audio Graph。音频图允许您添加来自实际音频端点的输入源,因此您无需用流音频填充字节缓冲区。然后,您可以使用子混合节点在音频端点流之间进行混合,而不会发出喀哒声或爆裂声。