我正在使用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);
}
答案 0 :(得分:0)
MediaPlayer,尤其是MediaPlayerList不能与“实时”音频流一起使用。您必须先完成将数据写入字节流的操作,然后再将其添加到列表中并启动MediaPlayer。对于这种特定情况,使用MediaPlayer不是正确的解决方案。
更好的解决方案是使用Audio Graph。音频图允许您添加来自实际音频端点的输入源,因此您无需用流音频填充字节缓冲区。然后,您可以使用子混合节点在音频端点流之间进行混合,而不会发出喀哒声或爆裂声。