Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将音频字节流式传输到MediaPlayer_C#_Xamarin_Stream_Android Mediaplayer - Fatal编程技术网

C# 将音频字节流式传输到MediaPlayer

C# 将音频字节流式传输到MediaPlayer,c#,xamarin,stream,android-mediaplayer,C#,Xamarin,Stream,Android Mediaplayer,有没有办法将字节直接流式传输到Android.Media.MediaPlayer?所以当我收到一堆字节时,我可以把它们扔到这个类中,播放它们并重复?我找不到任何用字节填充MediaPlayer的例子,这似乎是最合理的方法 目前,我正在尝试将每个数据包存储为一个临时文件,这样我就可以播放一小部分音乐并立即进行处理,但我还没有让它工作,感觉这是一种糟糕的方法 这就是我到目前为止所尝试的。我接收到一小部分声音(bArray),并在其中附加.wav标题,以便播放。我对收到的每一包都这样做。此标题与我收到

有没有办法将字节直接流式传输到Android.Media.MediaPlayer?所以当我收到一堆字节时,我可以把它们扔到这个类中,播放它们并重复?我找不到任何用字节填充
MediaPlayer
的例子,这似乎是最合理的方法

目前,我正在尝试将每个数据包存储为一个临时文件,这样我就可以播放一小部分音乐并立即进行处理,但我还没有让它工作,感觉这是一种糟糕的方法

这就是我到目前为止所尝试的。我接收到一小部分声音(
bArray
),并在其中附加
.wav
标题,以便播放。我对收到的每一包都这样做。此标题与我收到的数据匹配(我使用
NAudio
库录制声音):


显然,这段代码没有经过优化,但我甚至无法让它正常工作,而且我花了很多时间在它上面,所以希望有一个不同的解决方案来解决这个问题。

据我所知,
MediaPlayer
无法播放连续流(不是为此而设计的)。然而,还有更多的低级课程,
AudioTrack
,能够做到这一点

以下是我的一个项目的小样本:

private int _bufferSize;
private AudioTrack _output;

// in constructor
_bufferSize = AudioTrack.GetMinBufferSize(8000, ChannelOut.Mono, Encoding.Pcm16bit);

// when starting to play audio
_output = new AudioTrack(Stream.Music, 8000, ChannelOut.Mono, Encoding.Pcm16bit, _bufferSize, AudioTrackMode.Stream);
_output.Play();

// when data arrives via UDP socket
byte[] decoded = _codec.Decode(decrypted, 0, decrypted.Length);                
// just write to AudioTrack
_output.Write(decoded, 0, decoded.Length);

当然,您需要了解所有这些参数的含义(如
Pcm16bit
或采样率)才能正确实现它。

据我所知,使用
MediaPlayer
无法做到这一点。你应该改用
AudioTrack
类,它当然可以播放连续流。我看了一眼,它看起来很有希望。谢谢,我会测试一下,然后回复你:)对不起,耽搁了,我不得不把输入转换成16位。它工作得很好,我甚至不需要用十六进制写我自己的.wav头。现在我可以专注于压缩和优化。非常感谢。
private int _bufferSize;
private AudioTrack _output;

// in constructor
_bufferSize = AudioTrack.GetMinBufferSize(8000, ChannelOut.Mono, Encoding.Pcm16bit);

// when starting to play audio
_output = new AudioTrack(Stream.Music, 8000, ChannelOut.Mono, Encoding.Pcm16bit, _bufferSize, AudioTrackMode.Stream);
_output.Play();

// when data arrives via UDP socket
byte[] decoded = _codec.Decode(decrypted, 0, decrypted.Length);                
// just write to AudioTrack
_output.Write(decoded, 0, decoded.Length);